2013-02-05 5 views
5

次のコードでは、いくつかのキューブをレンダリングし、PointLightとAmbientLightでそれらを点灯します。ただし、AmbientLightが0xffffffに設定されている場合、割り当てられた色に関係なく、辺の色が白に変わります。不思議なことに、ポイントライトが期待どおりに動作しています。Three.jsアンビエントライト予期しない効果

周囲の光を点光源のように振る舞わせるにはどうすればいいですか?顔の色を洗い流すのではなく、単に照らすべきですか?私。環境光を0xffffffに設定することは、オブジェクトの周りに最大強度の複数の点光源を置くことと等価になります。

$(function(){ 
    var camera, scene, renderer; 
    var airplane; 
    var fuselage; 
    var tail; 
    init(); 
    animate(); 

    function init() { 
     scene = new THREE.Scene(); 
     camera = new THREE.PerspectiveCamera(35, window.innerWidth/window.innerHeight, 0.1, 10000); 
     camera.position.z = 2; 

     airplane = new THREE.Object3D(); 
     fuselage = newCube(
       {x: 1, y: 0.1, z: 0.1}, 
       {x: 0, y: 0, z: 0}, 
       [0xffff00, 0x808000, 0x0000ff, 0xff00000, 0xffffff, 0x808080], 
       [0, 1, 2, 3, 4, 5] 
     ); 
     airplane.add(fuselage); 
     tail = newCube(
       {x: 0.15, y: 0.2, z: 0.05}, 
       {x: 0.5, y: 0.199, z: 0}, 
       [0xffff00, 0x808000, 0x0000ff, 0xff00000, 0xffffff, 0x808080], 
       [0, 1, 2, 3, 4, 5] 
     ); 
     airplane.add(tail); 
     scene.add(airplane); 

     var ambientLight = new THREE.AmbientLight(0xffffff); 
     scene.add(ambientLight);   

     var pointLight = new THREE.PointLight(0x888888); 
     pointLight.position.x = 100; 
     pointLight.position.y = 100; 
     pointLight.position.z = 100; 
     scene.add(pointLight);  

     renderer = new THREE.WebGLRenderer(); 
     renderer.setClearColorHex(0x000000, 1); 
     renderer.setSize(window.innerWidth, window.innerHeight); 
     document.body.appendChild(renderer.domElement); 
    } 

    function animate() { 
     requestAnimationFrame(animate); 
     render(); 
    } 
    function render() { 
     airplane.rotation.x += 0.005; 
     airplane.rotation.y += 0.01; 
     renderer.render(scene, camera); 
    } 
}); 

function newCube(dims, pos, cols, colAss){ 
    var mesh; 
    var geometry; 
    var materials = []; 
    geometry = new THREE.CubeGeometry(dims.x, dims.y, dims.z); 
    for (var i in cols){ 
     materials[i] = new THREE.MeshLambertMaterial({ color: cols[i], overdraw: true }); 
    } 
    geometry.materials = materials; 
    for (var i in colAss){ 
     geometry.faces[i].materialIndex = colAss[i]; 
    } 
    mesh = new THREE.Mesh(geometry, new THREE.MeshFaceMaterial(materials)); 
    mesh.position = pos; 
    return mesh; 
} 

答えて

10

EDIT - three.js APIが変更されました。 material.ambientは推奨されていません。


解決策は、周囲光の強度を適切な値に設定することです。 three.js r.84

に更新

var ambientLight = new THREE.AmbientLight(0xffffff, 0.2);