three.js – ThreeJS阴影无法渲染

前端之家收集整理的这篇文章主要介绍了three.js – ThreeJS阴影无法渲染前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我查看了其他一些S.O.问题,遵循所有的建议,但我仍然无法知道为什么我不能在这个非常基本的场景上渲染阴影.

http://jsfiddle.net/4Txgp/

[更新]代码

var SCREEN_WIDTH = window.innerWidth - 25;
var SCREEN_HEIGHT = window.innerHeight - 25;

var camera,scene;
var canvasRenderer,webglRenderer;

var container,mesh,geometry,plane;

var windowHalfX = window.innerWidth / 2;
var windowHalfY = window.innerHeight / 2;

init();
animate();

function init() {

    container = document.createElement('div');
    document.body.appendChild(container);

    camera = new THREE.PerspectiveCamera(30,window.innerWidth / window.innerHeight,1,10000);
    camera.position.x = 1200;
    camera.position.y = 1000;
    camera.lookAt({
        x: 0,y: 0,z: 0
    });

    scene = new THREE.Scene();

    var groundMaterial = new THREE.MeshLambertMaterial({
        color: 0x6C6C6C
    });
    plane = new THREE.Mesh(new THREE.PlaneGeometry(10000,10000,100,100),groundMaterial);
    plane.rotation.x = -Math.PI / 2;
    plane.receiveShadow = true;

    scene.add(plane);

    // LIGHTS
    // scene.add(new THREE.AmbientLight(0x666666));

    /*
    var light;

    light = new THREE.DirectionalLight(0xdfebff,1.75);
    light.position.set(600,800,100);
    //light.position.multiplyScalar(1.3);

    light.castShadow = true;
    light.shadowCameraVisible = true;

    light.shadowMapWidth = light.shadowMapHeight = 2048;

    var d = 50;

    light.shadowCameraLeft = -d;
    light.shadowCameraRight = d;
    light.shadowCameraTop = d;
    light.shadowCameraBottom = -d;

    light.shadowCameraFar = 500;
    light.shadowDarkness = 0.5;

    scene.add(light);
    */

    var spotLight = new THREE.SpotLight( 0xffffff );
spotLight.position.set( 700,1000,100 );

spotLight.castShadow = true;
    spotLight.shadowCameraVisible = true;

spotLight.shadowMapWidth = 2048;
spotLight.shadowMapHeight = 2048;

spotLight.shadowCameraNear = 100;
spotLight.shadowCameraFar = 2000;
spotLight.shadowCameraFov = 30;

scene.add( spotLight );

    var Boxgeometry = new THREE.CubeGeometry(100,200,100);
    var Boxmaterial = new THREE.MeshLambertMaterial({
        color: 0x0aeedf
    });
    var cube = new THREE.Mesh(Boxgeometry,Boxmaterial);

    cube.position.x = 0;
    cube.position.y = 100;
    cube.position.z = 0;

    scene.add(cube);

    // RENDERER
    webglRenderer = new THREE.WebGLRenderer();
    webglRenderer.setSize(SCREEN_WIDTH,SCREEN_HEIGHT);
    //webglRenderer.domElement.style.position = "relative";
    webglRenderer.shadowMapEnabled = true;
    webglRenderer.shadowMapSoft = true;

    container.appendChild(webglRenderer.domElement);
}

function animate() {
    var timer = Date.now() * 0.0002;
    camera.position.x = Math.cos(timer) * 1000;
    camera.position.z = Math.sin(timer) * 1000;
    requestAnimationFrame(animate);
    render();
}

function render() {
    camera.lookAt(scene.position);
    webglRenderer.render(scene,camera);
}

我有一个带有飞机,物体(立方体),聚光灯(直接从http://threejs.org/docs/58/#Reference/Lights/SpotLight复制用于测试目的)和相机的场景.它渲染得很好,除了立方体没有在“地面”(平面)上投射阴影,并且阴影看起来像是在基本材料中完成了所有事情.我正在使用Phongs和Lamberts的组合.

我的方向灯设置为castShadow = true;,我的平面设置为receiveShadow = true,以及阴影贴图设置.渲染器本身具有shadowMapEnabled = true.

我已经尝试了各种解决方案,我记得以前版本的ThreeJS会有外部库调用取决于你想做什么,但我也看到JSFiddle上的其他例子只是单独调用ThreeJS,以及来自的例子官方网站,工作正常.

关于忽略简单和小的东西的任何提示/信息/建设性评论

解决方法

你需要设置
cube.castShadow = true;

并确保阴影相机远平面到达立方体.

小提琴:http://jsfiddle.net/4Txgp/13/

three.js r.58

原文链接:https://www.f2er.com/js/153981.html

猜你在找的JavaScript相关文章