three.js set background image

前端 未结 6 1908
深忆病人
深忆病人 2020-12-09 03:55

How to create a static background image?

For default background:

scene = new THREE.Scene();

// ...

renderer = new THREE.WebGLRenderer( { antialias:         


        
6条回答
  •  眼角桃花
    2020-12-09 04:34

    An background image can be set by setting the scene.background attribute of the THREE.Scene:

    scene = new THREE.Scene();
    bgTexture = loader.load("https://i.stack.imgur.com/vDUZz.jpg",
        function ( texture ) {
            var img = texture.image;
            bgWidth= img.width;
            bgHeight = img.height;
            resize();
        } );
    scene.background = bgTexture;
    bgTexture.wrapS = THREE.MirroredRepeatWrapping;
    bgTexture.wrapT = THREE.MirroredRepeatWrapping;
    

    The aspect ratio of the image can be adjusted to the aspect ratio of the canvas like this:

    var aspect = window.innerWidth / window.innerHeight;
    var texAspect = bgWidth / bgHeight;
    var relAspect = aspect / texAspect;
    
    bgTexture.repeat = new THREE.Vector2( 
        Math.max(relAspect, 1),
        Math.max(1/relAspect,1) ); 
    bgTexture.offset = new THREE.Vector2(
        -Math.max(relAspect-1, 0)/2,
        -Math.max(1/relAspect-1, 0)/2 ); 
    

    See the code snippet:

    (function onLoad() {
      var container, loader, camera, scene, renderer, controls, bgTexture, bgWidth, bgHeight;
      
      init();
      animate();
    
      function init() {
        container = document.getElementById('container');
        
        renderer = new THREE.WebGLRenderer({
          antialias: true
        });
        renderer.setPixelRatio(window.devicePixelRatio);
        renderer.setSize(window.innerWidth, window.innerHeight);
        renderer.shadowMap.enabled = true;
        container.appendChild(renderer.domElement);
    
        camera = new THREE.PerspectiveCamera(70, window.innerWidth / window.innerHeight, 1, 100);
        camera.position.set(0, -4, -1.5);
    
        loader = new THREE.TextureLoader();
        loader.setCrossOrigin("");
    
        scene = new THREE.Scene();
        bgTexture = loader.load("https://raw.githubusercontent.com/Rabbid76/graphics-snippets/master/resource/texture/background.jpg",
            function ( texture ) {
                var img = texture.image;
                bgWidth= img.width;
                bgHeight = img.height;
                resize();
            }
        );
        scene.background = bgTexture;
        bgTexture.wrapS = THREE.MirroredRepeatWrapping;
        bgTexture.wrapT = THREE.MirroredRepeatWrapping;
      
        scene.add(camera);
        window.onresize = resize;
        
        var ambientLight = new THREE.AmbientLight(0x404040);
        scene.add(ambientLight);
    
        var directionalLight = new THREE.DirectionalLight( 0xffffff, 0.5 );
        directionalLight.position.x = -0.75;
        directionalLight.position.y = -0.5;
        directionalLight.position.z = -1;
        scene.add( directionalLight );
    
        controls = new THREE.OrbitControls(camera, renderer.domElement);
    		
        createModel();
      }
    
      function createModel() {
    
        var material = new THREE.MeshPhongMaterial({color:'#b090b0'});
        var geometry = new THREE.BoxGeometry( 1, 1, 1 );
        var mesh = new THREE.Mesh(geometry, material);
    
        scene.add(mesh);
      }
    
      function resize() {
        
        var aspect = window.innerWidth / window.innerHeight;
        var texAspect = bgWidth / bgHeight;
        var relAspect = aspect / texAspect;
    
        bgTexture.repeat = new THREE.Vector2( Math.max(relAspect, 1), Math.max(1/relAspect,1) ); 
        bgTexture.offset = new THREE.Vector2( -Math.max(relAspect-1, 0)/2, -Math.max(1/relAspect-1, 0)/2 ); 
    
        renderer.setSize(window.innerWidth, window.innerHeight);
        camera.aspect = aspect;
        camera.updateProjectionMatrix();
      }
    
      function animate() {
        requestAnimationFrame(animate);
        render();
      }
    
      function render() {
        renderer.render(scene, camera);
      }
    })();
    
    
    
    
    

提交回复
热议问题