javascript - THREE.JS 不转换阴影

标签 javascript three.js shadow

我正在做一个三个 js 教程,这段代码应该转换阴影,但是当渲染阴影不存在于平面上时。

代码有什么问题吗?我正在阅读文档和其他代码,但找不到问题。

最诚挚的问候!

编辑:

如果我使用 requestAnimationFrame 进行循环就可以工作...但仅在这种情况下...为什么?

<!DOCTYPE html>
<html>
    <head>
        <title>Learning THREE JS Basic</title>
        <script src="../../libs/three.js"></script>
        <script src="../../libs/jquery.js"></script>

        <style>
        body {
            margin   : 0;
            overflow : hidden;
        }
        </style>
    </head>

    <body>
        <div id="visor"></div>

        <script>
            $(function () {
                var scene = new THREE.Scene();

                var camera = new THREE.PerspectiveCamera(45, window.innerWidth/window.innerHeight, 1, 1000);

                var renderer = new THREE.WebGLRenderer();
                renderer.setClearColor(0xEEEEEE);
                renderer.setSize(window.innerWidth, window.innerHeight);
                renderer.shadowMap.enabled = true;

                var axes = new THREE.AxisHelper(20);
                scene.add(axes);

                var planeGeometry = new THREE.PlaneGeometry(60, 20, 1, 1);
                var planeMaterial = new THREE.MeshLambertMaterial({
                    color: 0xFFFFFF 
                });

                var plane = new THREE.Mesh(planeGeometry, planeMaterial);

                plane.rotation.x = -0.5*Math.PI;

                plane.position.x = 15;
                plane.position.y = 0;
                plane.position.z = 0;

                plane.receiveShadow = true;

                scene.add(plane);

                var cubeGeometry = new THREE.BoxGeometry(4,4,4);
                var cubeMaterial = new THREE.MeshLambertMaterial({
                    color: 0xFF0000
                });

                var cube = new THREE.Mesh(cubeGeometry, cubeMaterial);

                cube.position.x = -4;
                cube.position.y = 3;
                cube.position.z = 0;

                cube.castShadow = true;

                scene.add(cube);

                var sphereGeometry = new THREE.SphereGeometry(4, 20, 20);
                var sphereMaterial = new THREE.MeshLambertMaterial({
                    color: 0x7777FF
                });

                var sphere = new THREE.Mesh(sphereGeometry, sphereMaterial);

                sphere.position.x = 20;
                sphere.position.y = 4;
                sphere.position.z = 2;

                sphere.castShadow = true;

                scene.add(sphere);

                var spotLight = new THREE.SpotLight(0xFFFFFF);
                spotLight.position.set(-40, 60, -10);
                spotLight.castShadow = true;

                scene.add(spotLight);

                camera.position.x = -30;
                camera.position.y = 40;
                camera.position.z = 30;
                camera.lookAt(scene.position);

                $("#visor").append(renderer.domElement);
                renderer.render(scene, camera);
            });
        </script>
    </body>
</html>

最佳答案

two.js r.74 和 r.75 有一个错误,即在第一次调用 render() 时并不总是渲染阴影。此错误已在 Three.js r.76dev 中修复。

您的解决方法是第二次调用 renderer.render( scene, camera ) ,或者进行动画循环。

三.js r.75

关于javascript - THREE.JS 不转换阴影,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36106348/

相关文章:

c++ - 使用 QPainter 在像素图上绘制带阴影的文本

javascript - 使用js对html onclick发出rest请求

javascript - 基于Select Option触发JS函数

javascript - Strapi 动态区域 - 在 Gatsby 中显示图像

javascript - 如果对象超出某个点(从相机 Angular 看),则隐藏该对象

javascript - 在函数中将变量赋值给自身

javascript - 在IE中查找表格行号

Javascript - 在没有运算符重载的情况下生成表达式

javascript - 在 Three.js 中为弯曲路径添加宽度

css - 悬停时的 PNG 阴影在 Firefox 中不起作用-我做错了什么?