当我尝试使用线框将meshphongmaterial视图放到arrayBufferGeometry上时,其中vetexColors设置为THREE.vertexColors;照明仅适用于1张随机脸。当我切换到MeshBasicmaterial时,我得到了所需的行为。如果线框设置为false,则phong材质看起来很好并且点亮:
geometry.addAttribute('position', new THREE.BufferAttribute(vertices, 3));
geometry.addAttribute('color', new THREE.BufferAttribute(colors, 3));
geometry.computeFaceNormals();
geometry.computeVertexNormals();
console.log(geometry);
var material = new THREE.MeshBasicMaterial({
side: THREE.DoubleSide,
wireframe: true,
transparent: false,
vertexColors: THREE.VertexColors, // CHANGED
shininess: 100,
// color: 0xff0000,
shading: THREE.SmoothShading
});
console.log(material);
var terrainMesh = new THREE.Mesh(geometry, material);
terrainMesh.name = 'GRD';
terrainMesh.receiveShadow = true;
terrainMesh.castShadow = true;
console.log(terrainMesh);
return terrainMesh;
我需要在材质后重新计算顶点法线吗?是否有理由说明照明适用于实心面而不是线框?
答案 0 :(得分:1)
这是一个照明问题。
我有各种各样的灯光,AmbientLight,DirectionalLight代表太阳,以及跟随相机目标的SpotLight,以突出显示用户正在看的内容。
这些都没有正确照亮线框。然后我跟着MeshPhongMaterial example,看到他们使用了点光源。我假设点光和聚光灯之间的唯一区别是方向和目标。这是不正确的,因为点光源最终起作用。
另一个问题是点光源到线框的照明必须位于材料的正面(无论MeshPhongMaterial中的侧面属性如何),并且不能从背面照射。我的几何面朝下,因为加载的文件格式与标准相反。必须将点光源定位在几何形状下以照亮材料。我最后添加了一个反向太阳型灯,使用PointLight从下面照亮几何体。
我仍然不理解为什么线框仅由PointLight照亮,为什么它不会从后面照亮THREE.DoubleSide。