代码之家  ›  专栏  ›  技术社区  ›  FutureCake

带有特定灯光的灯光网格

  •  1
  • FutureCake  · 技术社区  · 7 年前

    我有一个场景,有两个对象和一些对象,在这种情况下,球体我希望受到粉色和蓝色灯光的影响。

    有关问题的演示,请参见下图: 现在发生了什么: enter image description here 但我不希望试管是粉色和蓝色的,而是灰色的: enter image description here

    目前我用一个 meshBasicMaterial

    那么,我如何创建这个带有 MeshLambertMaterial

    有关如何立即生成场景的信息,请参见下面的代码:

    # Generating of spheres:
    for (var i = 0; i < 5; i++) {
            var SphereGeometry = new THREE.SphereGeometry(2, 20, 20);
            var SphereMaterial = new THREE.MeshLambertMaterial({ color: 0xffffff });
            var Sphere = new THREE.Mesh(SphereGeometry, SphereMaterial);
            Sphere.position.set(i * 7 -14, 0 + Math.random() * 5 - 2.5, 2);
            spheresArray.push(Sphere);
            scene.add(Sphere);
        }
    
    #Generation of tubes:
    for (var i = 0; i < CurvesArray.length; i++) {
            var geometry = new THREE.TubeGeometry( CurvesArray[i], 20, 0.5, 8, false );
            var material = new THREE.MeshBasicMaterial( { color: 0xe3e3e3 } );
            var mesh = new THREE.Mesh( geometry, material );
            scene.add( mesh );
        }
    
    #and these are my lights:
    var spotLight = new THREE.SpotLight( 0xff00cc );
        spotLight.position.set( -10, 3, 30, 100 );
        lightsArray.push(spotLight);
        scene.add(spotLight);
    
        var spotLight2 = new THREE.SpotLight( 0xaa99cc );
        spotLight2.position.set( 5, 15, 10, 100 );
        lightsArray.push(spotLight2);
        scene.add(spotLight2);
    
        var spotLight3 = new THREE.SpotLight( 0x0022bb );
        spotLight3.position.set( 2, -15, 10, 100 );
        lightsArray.push(spotLight3);
        scene.add(spotLight3);
    
        var light = new THREE.AmbientLight( 0x5f5f5f );
        scene.add( light );
    

    0 回复  |  直到 7 年前
        1
  •  4
  •   Alex Khoroshylov    7 年前

    使用图层: https://threejs.org/docs/#api/en/core/Object3D.layers

    例子: https://jsfiddle.net/mmalex/1xr356zf/

    1. 灯光将仅影响共享同一层的对象。
    2. 摄影机将看到属于摄影机所属图层的对象。

    for (var i = 0; i < 5; i++) {
        var SphereGeometry = new THREE.SphereGeometry(2, 20, 20);
        var SphereMaterial = new THREE.MeshLambertMaterial({ color: 0xffffff });
        var Sphere = new THREE.Mesh(SphereGeometry, SphereMaterial);
        Sphere.position.set(i * 7 -14, 0 + Math.random() * 5 - 2.5, 2);
    
        // set layers to Spheres
        Sphere.layers.set(i%3); // <<=== check here!
        spheresArray.push(Sphere);
        scene.add(Sphere);
    }
    

    var spotLight = new THREE.SpotLight( 0xff00cc );
    spotLight.position.set( -10, 3, 30, 100 );
    spotLight.layers.set(0); // << === layer 0 is by default
    lightsArray.push(spotLight);
    scene.add(spotLight);
    
    var spotLight2 = new THREE.SpotLight( 0xaa99cc );
    spotLight2.position.set( 5, 15, 10, 100 );
    spotLight2.layers.set(1);  // << === layer 1 set to spotLight2
    lightsArray.push(spotLight2);
    scene.add(spotLight2);
    
    var spotLight3 = new THREE.SpotLight( 0x0022bb );
    spotLight3.position.set( 2, -15, 10, 100 );
    spotLight3.layers.set(2);  // << === layer 2 set to spotLight3
    lightsArray.push(spotLight3);
    scene.add(spotLight3);
    

    let animate = function() {
      requestAnimationFrame(animate);
    
      controls.update();
    
      renderer.autoClear = true;
      camera.layers.set(0); // << == switch camera between layers
      renderer.render(scene, camera);
    
      renderer.autoClear = false; // don't remove previous layer results
    
      camera.layers.set(1); // << == switch camera between layers
      renderer.render(scene, camera);
    
      camera.layers.set(2); // << == switch camera between layers
      renderer.render(scene, camera);
    };