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

ThreeJS中轴缩放为负值是否会影响渲染的正反面?

在ThreeJS中,将轴缩放为负值是否会影响渲染的正反面?

我创建了一个顶点按逆时针排列的三角形(朝向屏幕的一侧为正面),对应的几何与UV设置代码如下:

let geometry = new THREE.BufferGeometry();
geometry.setAttribute(
  "position",
  new THREE.BufferAttribute(
    new Float32Array([-1.0, 1.0, 0, -1.0, -1.0, 0, 1.0, 1.0, 0]),
    3
  )
);
geometry.setAttribute(
  "uv",
  new THREE.BufferAttribute(new Float32Array([0.0, 1.0, 0, 0, 1.0, 1.0]), 2)
);

let mesh = new THREE.Mesh(
  geometry,
  new THREE.MeshBasicMaterial({
    map: new THREE.TextureLoader().load("/1.png"),
  })
);

随后我克隆该网格并设置X轴缩放为-1,代码如下:

let clonedMesh = mesh.clone(true);
scene.add(mesh);
clonedMesh.scale.set(-1, 1, 1);
clonedMesh.position.x = 2;
scene.add(clonedMesh);

实际渲染结果与理论差异

理论上认为顶点顺序变为顺时针、正面朝向屏幕内部,克隆网格应该不可见,但实际情况是克隆网格依然会被渲染出来。

原因在于ThreeJS结合WebGL的渲染逻辑:

  • 负缩放会让模型局部坐标系镜像翻转,但WebGL在判断面的朝向时,会结合物体的变换矩阵重新计算最终的正面方向,而非仅依赖原始顶点顺序
  • MeshBasicMaterial默认的side: THREE.FrontSide会基于变换后的坐标系判断正面,因此镜像后的模型依然会被识别为正面朝向屏幕

如何让镜像模型被剔除

如果需要让镜像后的模型不渲染,可以通过以下方式实现:

  • 修改材质的side属性为THREE.BackSide,让材质只渲染背面
  • 手动调整几何体的顶点顺序,将逆时针改为顺时针
  • 对克隆后的几何体调用geometry.scale(-1,1,1)直接修改顶点数据,而非通过物体变换实现镜像

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 13:16:58