Three.js--关于立体图像的阴影

大部分资料显示当满足以下三个条件,就可以展示阴影:

渲染器开启阴影渲染:

renderer.shadowMapEnabled = true;

灯光需要开启“引起阴影”:

light.castShadow = true;

物体需要开启“引起阴影”和“接收阴影”:

mesh.castShadow = mesh.receiveShadow = true;

但是当满足以上条件时发现任然无法看到阴影,最终通过查找资料与测试发现,想要页面展示出物体的阴影还需要注意以下事项:

1.光源

能形成阴影的光源只有THREE.DirectionalLight 与 THREE.SpotLight;
2.材料
能表现阴影效果的材质只有THREE.LambertMaterial与THREE.PhongMaterial
3.展示阴影的物体
阴影的展示,需要有平面接受到阴影,否则无法展示阴影,必须存在阴影投放所在的平面

示例

<!DOCTYPE html>
<html>

    <head>
        <meta charset="UTF-8">
        <title></title>
        <script type="text/javascript" src="/****/js/3d/three.js"></script>
        <style>
            body {
                margin: 0;
            }

            canvas {
                width: 100%;
                height: 100%
            }
        </style>
    </head>

    <body>
        <script>
            var scene = new THREE.Scene();
            var camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.1, 1000);
            camera.position.set(5, 5, 2);
            camera.position.multiplyScalar( 2 )
            camera.lookAt(new THREE.Vector3(0, 0, 0))

            var renderer = new THREE.WebGLRenderer();
            renderer.setPixelRatio( window.devicePixelRatio );
            renderer.setSize(window.innerWidth, window.innerHeight);
            renderer.setClearColor(0xcecece, 1); // 设置默认背景色
            //阴影图 接收阴影必须设置
            renderer.shadowMap.enabled = true;
            renderer.shadowMapType=THREE.PCFSoftShadowMap;
            document.body.appendChild(renderer.domElement);
            //光的颜色被应用到全局范围内的所有对象。
            scene.add( new THREE.AmbientLight( 0x505050, 0.5 ) );

            //物体
            var geometry = new THREE.BoxBufferGeometry(2, 2,2);
            //由于 角度层(ANGLE layer)的限制,在Windows平台上使用 WebGL,线宽将总是为1而不管设置的值。
            var material = new THREE.MeshPhongMaterial({
                color: 0x00ff00
            });

            var cube = new THREE.Mesh(geometry, material);
            cube.position.set(0, 0,0)
            cube.castShadow = true;
            cube.receiveShadow  = true;
            scene.add(cube);

            //阴影的投射平面
            var geometryp = new THREE.PlaneBufferGeometry( 10, 30 );
            var materialp = new THREE.MeshPhongMaterial( { color: 0x00ff00 } );
            var background = new THREE.Mesh( geometryp, materialp );
            background.rotation.x = -0.5*Math.PI;    // 绕x轴旋转90度
            background.receiveShadow = true;
            background.position.set( -4, -4, -10 );
            scene.add( background );

            //立体化 灯光使得物体不同面产生明暗,使物体立体化 也使物体产生阴影
            var light = new THREE.SpotLight( 0xffff00, 0.35 );
            light.position.set( 3, 4, 7 );
            light.castShadow = true;
            //灯光阴影
            light.shadow.camera.near=1
            light.shadow.camera.far=-4
            light.shadow.camera.left=-2
            light.shadow.camera.right= 2
            light.shadow.camera.top=2
            light.shadow.camera.bottom=-2
            //是阴影边界更加清晰
            light.shadow.camera.zoom = 4; // tighter shadow map
            scene.add( light );

            var interval = 10;
            var animate = function() {
                requestAnimationFrame(animate);
                cube.rotation.x += 0.01;
                cube.rotation.y += 0.01;
                renderer.render(scene, camera);
            };
            animate();
        </script>
    </body>

</html>
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

三知之灵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值