2017-04-20 88 views
0

当我尝试使用线框查看meshFongmaterial到arrayBufferGeometry(其中vetexColors设置为THREE.vertexColors;照明仅适用于1张随机面部。当我切换到MeshBasicmaterial时,我得到了期望的行为。随着线框设置为false海防材料看起来不错,被亮了起来:Three.js MeshPhongMaterial线框照明

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; 

我需要的材料后重新计算顶点法线?是否有一个原因,为什么照明适用于坚实的面孔而不是线框?

+1

您使用的是什么样的灯?我只是用'THREE.PointLight'和'THREE.MeshPhongMaterial'来试用它,它的参数和你使用的参数相同,并且它的工作方式和我一样。 – TheJim01

回答

1

这是一个照明问题。

我有各种各样的灯光,AmbientLight,DirectionalLight来表示太阳,还有一个SpotLight跟随相机目标,突出显示用户正在看什么。

这些都没有适当照明线框。然后我跟着MeshPhongMaterial example看到他们使用了点光源。我认为点光和点光之间的唯一区别是方向和目标。这是不正确的,因为点灯结束了工作。

另一个问题是,从点光源到线框的照明必须位于材料的正面(无论MeshPhongMaterial的边属性如何),并且不能从背面进行。由于加载的文件的格式与标准相反,因此我的几何面朝下。点光源必须定位在几何图形下才能照亮材料。我最终添加了一个反向太阳类型的灯光,使用PointLight从下面照亮几何图形。

我还是不明白为什么线框只被PointLight照亮,为什么它没有照亮后方的THREE.DoubleSide。