Three.js中的表面行为不一致

时间:2016-05-03 09:27:22

标签: three.js surface light

当我在THREE.BoxGeometry对象上设置一个点光源时,它看起来像这样: THREE.BoxGeometry with point light

var light = new THREE.PointLight (0xffffff, 1, 100);
light.position.set (10, 10, 10);
scene.add (light);
var geometry = new THREE.BoxGeometry (1, 1, 1);
var material = new THREE.MeshPhongMaterial ();
var cube = new THREE.Mesh (geometry, material);
scene.add (cube);

当我现在在THREE.PolyhedronGeometry对象上设置一个点光源时,它看起来像这样: THREE.PolyhedronGeometry with point light

var light = new THREE.PointLight (0xffffff, 1, 100);
light.position.set (10, 10, 10);
scene.add (light);
var geometry = new THREE.PolyhedronGeometry (vertices, faces, 1, 0);
var vertices = [-1,-1,-1,1,-1,-1,1,1,-1,-1,1,-1,-1,-1,1,1,-1,1,1,1,1,-1,1,1];
var faces = [2,1,0,0,3,2,0,4,7,7,3,0,0,1,5,5,4,0,1,2,6,6,5,1,2,3,7,7,6,2,4,5,6,6,7,4];
var material = new THREE.MeshPhongMaterial ();
var cube = new THREE.Mesh (geometry, material);
scene.add (cube);

我想知道,这种行为来自何处以及如何设法制作多面体'面孔表现得和盒子一样好吗?

我读到它可能与geometry.computeFaceNormals()有关。

所以我尝试了,但它没有任何区别。

2 个答案:

答案 0 :(得分:0)

当某些事物与表面上的光线表现不同时,首先要看的是正常人

盒面

也是如此
boxGeometry.faces[i].normal.equals(boxGeometry.faces[i].vertexNormals[j]);//true

因此,每个面部的框只有简单的法线

多面体与顶点法线具有不同的面法线

polyhedronGeo.faces[i].normal.equals(polyhedronGeo.faces[i].vertexNormals[j]);//not true

并且一些顶点法线彼此不相等

polyhedronGeo.faces[i].vertexNormals[j].equals(polyhedronGeo.faces[i].vertexNormals[k]);
//not true for some j,k

这就是为什么灯看起来很〜阴影 - 从vertexNormals为着色器插入法线 修改多面体看起来像框只需更改顶点notmals以匹配面法线

至于

geometry.computeFaceNormals();

它只会计算面法线,而不是vertexNormals

还有另一项功能

geometry.computeVertexNormals();

但是这将创建多面体

中的顶点法线

答案 1 :(得分:0)

谢谢Derte。你的反思让我更接近这一点。因此,对于高级关键字,我发现了这一点:https://github.com/mrdoob/three.js/issues/1982

我的问题的答案是这一行,为“自由形式”展平阴影:

material.shading = THREE.FlatShading;