【Threejs】关于物体在场景中的阴影问题

一、基础知识

1、摄像机的属性结构

先了解一下摄像机THREE.Camera的四个基本参数

2、渲染器设置

render需要开启阴影渲染,这一点是大前提:

        renderer = new THREE.WebGLRenderer();
        renderer.setSize(width, height);
        renderer.setClearColor(0x274F80, 1);
        renderer.shadowMap.enabled = true;//开启渲染
        renderer.shadowMap.type = THREE.PCFSoftShadowMap;
        document.body.appendChild(renderer.domElement);

3、光源选择

只有DirectionalLight(平行光)、PointLight(点光源)、RectAreaLight(平面光源)、SpotLight(聚光灯)这4种光源才能投谁阴影。
如若不知道几种光的特性,可以在场景中添加辅助线来查看(这里以聚光源为例):

        //添加一个聚光源
        var spotLight = new THREE.SpotLight(SpotColor);
        ......//一些参数设置(位置、角度、阴影等...后面再提)
        scene.add(spotLight);
        //光源辅助线
        var SpotLightHelper = new THREE.SpotLightHelper(spotLight);
        scene.add(SpotLightHelper);

接下来还需要开启光源的阴影投射属性(切记这必须在添加辅助线之前完成):

        spotLight .castShadow = true;
        spotLight .shadow.camera.near = 10;
        spotLight .shadow.camera.far = 1400;
        spotLight .shadow.camera.fov = 60;

如果阴影投射范围不够大还可以通过改变distance属性延长,比如:

        point1.distance=1700;

这时我们还可以添加查看阴影范围的辅助线:

        var point1CameraHelper = new THREE.CameraHelper(point1.shadow.camera);
        scene.add(point1CameraHelper);

4、物体属性

要制造阴影需要接收面和投影面,这时要将物体的属性castShadow和receiveShadow设置为true,因为场景中光源下的物体要接受阴影也要朝其他接收面制造阴影。
这时需要注意,物体通常都是网格模型mesh,而一个组group不能通过设置属性使物体接收或投影。
示例:

        var downmesh1 = new THREE.Mesh(downgeom1, material);
        downmesh1.position.set(-150,-20,0);
        downmesh1.receiveShadow = true;
        downmesh1.castShadow=true;

最底层投影面THREE.PlaneGeometry只需要将receiveShadow 属性设为true,效果如下:
在这里插入图片描述

二、投影效果无法实现

原因1:接收阴影的物体(像源码中的plane)只有在相机阴影的范围内,才能显示出阴影,否则如下:注意观察辅助线的范围,白线是光源照射的范围

正确的做法:
黄线就是光源投影的范围

原因2:设置shadow.camera属性时需要在添加光源前(scene.add),以及辅助工具前,这样属性值才能被改变。

原因3:网格对象的材质需要注意,基础的BasicMaterial是无法根据反射光照和生成阴影的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值