MeshNormalMaterial在three.js自定义几何体上无法正常工作:几何体呈黑色渲染

3

我正在尝试使用three.js手动构建一个立方体,通过声明它的向量和面;我能够使用下面的代码完成它,但是材质似乎没有按预期工作,相反,立方体以纯黑色呈现。

var geom = new THREE.Geometry(); 
var v1 = new THREE.Vector3( -1,  1, 0.1 ),
    v2 = new THREE.Vector3(  1,  1, 0.1 ),
    v3 = new THREE.Vector3(  1, -1, 0.1 ),
    v4 = new THREE.Vector3( -1, -1, 0.1 ),
    v5 = new THREE.Vector3( -1,  1, 2   ),
    v6 = new THREE.Vector3(  1,  1, 2   ),
    v7 = new THREE.Vector3(  1, -1, 2   ),
    v8 = new THREE.Vector3( -1, -1, 2   );

geom.vertices.push(v1,v2,v3,v4,v5,v6,v7,v8);

geom.faces.push(
  new THREE.Face3(0,1,3),
  new THREE.Face3(1,2,3),
  new THREE.Face3(4,5,7),
  new THREE.Face3(5,6,7),
  new THREE.Face3(1,4,5),
  new THREE.Face3(0,1,4),
  new THREE.Face3(2,3,7),
  new THREE.Face3(2,6,7),
  new THREE.Face3(0,3,7),
  new THREE.Face3(0,4,7),
  new THREE.Face3(1,2,5),
  new THREE.Face3(2,5,6)  
);

var mat = new THREE.MeshNormalMaterial();
mat.side = THREE.DoubleSide;
var cube = new THREE.Mesh( geom, mat);
scene.add(cube);

如果我使用以下代码正常渲染立方体,则立方体将按预期呈现。
cube = new THREE.Mesh(new THREE.CubeGeometry(2, 2, 2), new THREE.MeshNormalMaterial());
scene.add(cube);
1个回答

6
您没有指定顶点法线。为了快速处理,可以计算面法线,方法如下:
geom.computeFaceNormals();

但是您需要学习如何在自定义几何体中设置顶点法线。

另外,面的“卷绕顺序”应该是逆时针方向。您没有一致地做到这一点。

如果您正确定义面,可以删除side = THREE.DoubleSide

three.js r.90


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接