2017-04-20 90 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。