2014-10-28 19 views
1

當我在運行時添加一個點時沒有任何反應。我必須更改對象的材質才能看到修改對象上的燈光。在運行時添加燈光:材料未更新?

我加了MyMaterial.needsUpdate = true;:這是默認值,它什麼都不會改變。

我用飛機對象做了一個簡單的測試(PlaneGeometry + MeshPhongMaterial)。
當我按下「L」鍵時,我添加一個SpotLight ==>沒有任何反應。
然後,當我按下「M」鍵時,我將一種新材料分配給飛機==>我看到了聚光燈。

我失去了一些東西,但我不知道是什麼...

我用three.js所R69

WebGLRenderer

renderer = new THREE.WebGLRenderer({ antialias: true }); 
renderer.setClearColor(0xffffff, 1); 
renderer.setSize(window.innerWidth, window.innerHeight); 
renderer.shadowMapEnabled = true; 
renderer.shadowMapType = THREE.PCFSoftShadowMap; 
renderer.shadowMapWidth = 1024; 
renderer.shadowMapHeight = 1024; 

飛機

var planeGeometry = new THREE.PlaneGeometry(60, 20); 
var planeMaterial = new THREE.MeshPhongMaterial({ color: 0xffffff }); 
planeMaterial.side = THREE.DoubleSide; 
planeMaterial.needsUpdate = true; 
plane = new THREE.Mesh(planeGeometry, planeMaterial); 
plane.rotation.set(Math.PI/2.0, 0, 0); 
plane.receiveShadow = true; 
plane.castShadow = true; 
scene.add(plane); 

關鍵行動(與THREEx.KeyboardState.js):

function updateKey() { 
    // Add light 
    if (keyboard.pressed("L")) { 

     var spotLight = new THREE.SpotLight(0xffffff, 1.0, 0.0); 
     spotLight.position.set(0, 15, 0); 
     spotLight.angle = 1.39; 
     spotLight.intensity = 0.5; 

     var lightTarget = new THREE.Object3D(); 
     lightTarget.position.set(10,0,0); 
     scene.add(lightTarget); 

     spotLight.target = lightTarget; 
     spotLight.castShadow = true; 
     spotLight.shadowMapWidth = 1024; 
     spotLight.shadowMapHeight = 1024; 
     spotLight.shadowCameraNear = 0.1; 
     spotLight.shadowCameraFar = 50; 
     spotLight.shadowCameraFov = 160; 
     spotLight.shadowCameraVisible = true; 

     scene.add(spotLight); 
    } 

    // change material 
    if (keyboard.pressed("M")) { 
     var mat = new THREE.MeshPhongMaterial({ color: 0x00ff00 }); 
     mat.side = THREE.DoubleSide; 
     plane.material = mat; 
     } 
} 
+0

查看http://stackoverflow.com/questions/26533961/i-cant-add-light-with-mouse-event#comment41698009_26533961 – WestLangley 2014-10-28 15:16:29

+0

我在發佈之前看到了您的回答,但我認爲(或者我不明白.. )「needsUpdate」是一個狀態變量。這就是爲什麼我只將它設置爲true一次。並感謝您在這裏的所有答案! – AllForum 2014-10-28 15:37:37

回答

0

下面是來自three.js所編輯的例子,包含在庫中。當光在運行時添加,這個函數被調用:

function updateMaterials() { 

    editor.scene.traverse(function (node) { 

     if (node.material) { 

      node.material.needsUpdate = true; 

      if (node.material instanceof THREE.MeshFaceMaterial) { 

       for (var i = 0; i < node.material.materials.length; i ++) { 

        node.material.materials[ i ].needsUpdate = true; 

       } 

      } 

     } 

    }); 

} 

正如你所看到的,它設置標誌needsUpdate是場景中的所有其他材料。這樣做時,應該用下一個渲染進行更新。你應該試試看。

+0

它適合我!好的:每次我需要更新時,我都必須執行「needsUpdate = true」。在我的按鍵(「L」)中,如果我添加了「plane.material.needsUpdate = true;」。我看到了光。非常感謝Jeyp – AllForum 2014-10-28 14:48:44

+0

是的。一般來說,您必須爲所有**材質設置'needsUpdate = true',這些材質受新燈影響。因此,如果您的基本場景包含的材料不僅僅是飛機的材料,還需要爲其他材料設置。 – Jonas 2014-10-28 14:51:15