You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

three.js中2D图形窗口的camera位置设置技术问询

2D预览窗口的相机设置方案

刚好我之前做过类似的2D预览场景,给你梳理下最稳妥的相机设置思路,完美适配你的1x1网格+平移需求:

第一步:选对相机类型

直接用OrthographicCamera(正交相机)就对了!透视相机有近大远小的变形,完全不符合你要的「网格纸」精准2D效果,正交相机能保证所有元素的比例一致,没有透视畸变。

第二步:基础参数配置

你的网格平移后范围是(0,0)到(1,1)(原本1x1的GridHelper中心在(0,0),平移(.5,.5)后四个角刚好对应这个区间),所以相机的视口参数可以这么设:

// 定义网格的有效范围
const gridWidth = 1;
const gridHeight = 1;
const nearPlane = 0.1; // 近裁剪面,只要大于0就行
const farPlane = 100;  // 远裁剪面,只要比相机Z位置大就行

// 创建正交相机
const camera = new THREE.OrthographicCamera(
  0,          // left:视口左边界
  gridWidth,  // right:视口右边界
  gridHeight, // top:视口上边界
  0,          // bottom:视口下边界
  nearPlane,
  farPlane
);

第三步:相机位置与朝向

相机需要沿着Z轴正方向放置,看向网格的中心(0.5, 0.5, 0),这样整个网格能完整居中显示:

// 把相机放在Z=5的位置(只要在near和far之间都可以)
camera.position.set(0.5, 0.5, 5);
// 让相机看向网格中心
camera.lookAt(0.5, 0.5, 0);

第四步:适配窗口尺寸(关键!)

如果你的预览div不是正方形,直接渲染会导致网格拉伸变形,所以要监听窗口/容器尺寸变化,动态调整相机参数:

const previewDiv = document.getElementById('你的预览容器ID');
const renderer = new THREE.WebGLRenderer({ antialias: true });
renderer.setSize(previewDiv.clientWidth, previewDiv.clientHeight);
previewDiv.appendChild(renderer.domElement);

// 监听尺寸变化,保持网格比例
window.addEventListener('resize', () => {
  const clientWidth = previewDiv.clientWidth;
  const clientHeight = previewDiv.clientHeight;
  renderer.setSize(clientWidth, clientHeight);
  
  // 计算容器的宽高比
  const aspectRatio = clientWidth / clientHeight;
  let cameraWidth = gridWidth;
  let cameraHeight = gridHeight;

  // 根据宽高比调整相机视口,避免拉伸
  if (aspectRatio > 1) {
    // 容器比网格宽,左右扩展视口
    cameraWidth = gridWidth * aspectRatio;
  } else {
    // 容器比网格高,上下扩展视口
    cameraHeight = gridHeight / aspectRatio;
  }

  // 重新计算相机的边界,让网格始终居中
  camera.left = (gridWidth - cameraWidth) / 2;
  camera.right = (gridWidth + cameraWidth) / 2;
  camera.top = (gridHeight + cameraHeight) / 2;
  camera.bottom = (gridHeight - cameraHeight) / 2;
  
  // 必须更新投影矩阵才能生效
  camera.updateProjectionMatrix();
});

额外确认:GridHelper的设置

再检查下你的网格代码,确保旋转和平移是正确的:

const gridHelper = new THREE.GridHelper(1, 10); // 1x1网格,10条细分线
gridHelper.rotation.x = Math.PI / 2; // 从XZ平面转到XY平面
gridHelper.position.set(0.5, 0.5, 0); // 平移到目标位置
scene.add(gridHelper);

这样设置后,你的贝塞尔曲线和平移后的网格就能完美对齐,而且不管预览窗口怎么缩放,网格都不会变形,始终保持精准的2D效果~

内容的提问来源于stack exchange,提问作者gunther47

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 07:06:21