Three.js实现光照阴影

在Three.js中,物体可以形成阴影投影效果,但是由于渲染阴影需要消耗计算机大量资源,所以Three.js在默认情况下是不会渲染阴影的。 为了实现渲染阴影效果,我们还需要完成以下四个部分的设置。

1. renderer设置

首先我们需要告诉渲染器我们需要阴影效果:

renderer.shadowMap.enabled = true;

更多详细内容可以查看WebGLRenderershadowMap属性。

2. 光源设置

然后我们需要定义能够产生阴影的光源:

light.castShadow = true;

注意: 不是所有的光源都能够产生阴影,只有一部分光源可以,例如通过THREE.PointLight(点光源)、THREE.SpotLight(聚光源)和THREE.DirectionalLight(平行光光源)定义的光源是能够产生阴影的。

3. 指定物体投射阴影

接下来我们需要指定场景中的哪些物体能够投射阴影,能够产生阴影的物体需要设置以下代码:

const geometry = new THREE.BoxBufferGeometry(4, 4, 4); // 生成几何体
const material = new THREE.MeshLambertMaterial({ // 生成材质color: 0x00ff00,
});
const mesh = new THREE.Mesh(geometry, material); // 生成网格
mesh.castShadow = true; // 对象是否渲染到阴影贴图中,默认值为false

注意: 只有castShadow属性为true的物体才会产生阴影。

4. 指定物体接受阴影

最后我们还需要指定哪些物体能够接受阴影,这样才能够看出阴影效果。

const planeGeometry = new THREE.PlaneGeometry(300, 300); // 生成平面几何
const planeMaterial = new THREE.MeshLambertMaterial({ // 生成材质color: 0xcccccc,
});
const planeMesh = new THREE.Mesh(planeGeometry, planeMaterial); // 生成平面网格
planeMesh.receiveShadow = true; // 设置平面网格为接受阴影的投影面

注意: 只有receiveShadow属性为true的物体才能够接受阴影。


全部代码如下:

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>Three.js实现光照阴影</title><style>* {margin: 0;padding: 0;}</style></head><body><script type="module">import * as THREE from 'https://threejs.org/build/three.module.js';import Stats from 'https://threejs.org/examples/jsm/libs/stats.module.js';import { OrbitControls } from 'https://threejs.org/examples/jsm/controls/OrbitControls.js';let stats = new Stats(); // 性能监控器,用来查看Three.js渲染帧率// 创建divlet container = document.createElement('div');document.body.appendChild(container);// 创建场景let scene = new THREE.Scene();// 创建相机let camera = new THREE.PerspectiveCamera( // 透视投影相机40, // 视场,表示能够看到的角度范围window.innerWidth / window.innerHeight, // 渲染窗口的长宽比,设置为浏览器窗口的长宽比0.1, // 从距离相机多远的位置开始渲染2000 // 距离相机多远的位置截止渲染);camera.position.set(-10, 10, 40); // 设置相机位置// 创建渲染器let renderer = new THREE.WebGLRenderer({antialias: true, // 是否执行抗锯齿});renderer.setPixelRatio(window.devicePixelRatio); // 设置设备像素比率。通常用于HiDPI设备,以防止输出画布模糊。renderer.setSize(window.innerWidth, window.innerHeight); // 设置渲染器大小renderer.shadowMap.enabled = true;container.appendChild(renderer.domElement);// 创建控制器let controls = new OrbitControls(camera, renderer.domElement);// 创建物体const geometry = new THREE.BoxBufferGeometry(4, 4, 4); // 生成几何体const material = new THREE.MeshLambertMaterial({// 生成材质color: 0x00ff00,});const mesh = new THREE.Mesh(geometry, material); // 生成网格mesh.castShadow = true; // 对象是否渲染到阴影贴图中,默认值为falsemesh.position.set(0, 3, 0); // 设置物体位置scene.add(mesh); // 添加到场景中// 创建平面const planeGeometry = new THREE.PlaneGeometry(300, 300); // 生成平面几何const planeMaterial = new THREE.MeshLambertMaterial({// 生成材质color: 0xcccccc,});const planeMesh = new THREE.Mesh(planeGeometry, planeMaterial); // 生成平面网格planeMesh.receiveShadow = true; // 设置平面网格为接受阴影的投影面planeMesh.rotation.x = -Math.PI / 2; //绕X轴旋转90度scene.add(planeMesh); // 添加到场景中// 创建平行光源const light = new THREE.DirectionalLight(0xffffff, 1); // 平行光,颜色为白色,强度为1light.position.set(-40, 40, 20); // 设置灯源位置light.castShadow = true; // 允许生成阴影light.target = mesh;scene.add(light); // 添加到场景中animate();function animate() {requestAnimationFrame(animate);stats.begin();renderer.render(scene, camera);stats.end();}</script></body>
</html>

Three.js实现光照阴影相关推荐

  1. UE3 光照 阴影

    光照 & 阴影 对于创建高水准环境而言,关卡中几何体的照明方式起着至关重要的作用.人类眼睛和脑袋希望光源能够通过特定方式与表面进行交互,填充一个房间或投射阴影.任何背离这条原则的东西都可能会破 ...

  2. UE4渲染的整体流程(可视性、GBuffer、反射、动态光照阴影、后期处理)

    个人博客完整原文:https://alvincr.com/2021/02/ue4-1-rendering/ 评价渲染工具的好坏参考:渲染质量.渲染功能及性能. 1 整体流程 AlvinCR认为渲染并不 ...

  3. three.js 平行光与阴影及其相关属性

    基础篇:three.js 基础认识与简单应用 纹理贴图:three.js 纹理贴图的使用 纹理贴图进阶: three.js纹理贴图进阶 一.灯光与阴影的关系与设置 -- 五个步骤缺一不可 (点.聚会再 ...

  4. VTK修炼之道70:体绘制讨论_光照阴影、VTKLODProp3D

    1.光照与阴影 通过VTKVolumeProperty可以设置体绘制阴影效果(Shading).阴影效果主要受环境光系数.散射光系数.反射光系数和高光强度四个参数影响. vtkVolumeProper ...

  5. cocos creator 3D学习(六)光照+阴影

    目录 前言 分类 1.方向光 2.球面光 3.聚光灯 4.阴影 5.环境光 最后 前言 有一些会需要在cocos creator 3D里面加光照,让模型更好看一些 cocos creator 3D里面 ...

  6. 图片阴影html,js图片彩色阴影特效插件

    image-shadow.js是一款用于制作图片彩色阴影特效的js插件.它通过CSS3 filter过滤器来生成图片对应颜色的阴影效果. 注意,IE浏览器和Edge浏览器不支持该图片彩色阴影特效. 使 ...

  7. Unity 光照阴影烘焙

    设置光照(必须将烘焙的模型设为static) 设置烘焙参数 烘焙效果 加载烘焙场景

  8. matlab仿真条纹光照阴影,正常光照条件下全工况光伏阵列通用Matlab/Simulink仿真模型...

    一引言进入新世纪以来,太阳能光伏发电作为一种可再生清洁能源成为低碳趋势下各国研究的热点,世界范围内的光伏电池产量及光伏系统装机容量也都在迅速增长.光伏系统设计与分析需将不同环境状态下光伏系统的输出特性 ...

  9. ShaderJoy —— 二维多光源光照阴影【GLSL】

    效果图 一个光源跟随鼠标,一个光源上下移动 绿色的 box 为障碍物 算法阐述 光源亮度的指数衰减 我们想要的效果是,光的亮度随着离光源的距离越大而迅速衰减 ,所以很自然地需要先计算出像素到光源的距离 ...

最新文章

  1. 怎样用VB编写.DLL动态链接库文件
  2. linux 3gpp格式转换器,Movavi Video Converter
  3. tp3.2php开启事务,ThinkPHP 3.2.2实现事务操作的方法
  4. Codeforces Round #507 (Div. 1) D. You Are Given a Tree 根号分治 + dp
  5. rf连oracle版本一致,Navicat premium连不上Oracle的问题解决
  6. .net生成缩略图,支持等比例缩放,加水印
  7. PHP实现菱形与杨辉三角形【php趣味案例】
  8. python打开chrome浏览器登录用户名密码_[工具]Python获取Chrome浏览器已保存的所有账号密码...
  9. 70.Android开发知识点总结
  10. word中输入带圈字符
  11. 很牛的求职经历(转载)
  12. c++聊天机器人——简单版
  13. 十大常见食物让牙齿越吃越白。
  14. linux 发送邮件到163或者QQ邮箱
  15. mac+unity3d准备工作——磨刀
  16. C++核心准则边译边学-I.27 考虑使用指向实现的指针技术获得稳定的ABI
  17. 本地玩邮件服务器和邮件客户端
  18. PANSS 阳性与阴性症状量表
  19. Docsify使用指南,使用Typora+Docsify打造最强、最轻量级的个人团队文档,及免费和开源且低成本文档工具
  20. VMware虚拟机安装ghost系统

热门文章

  1. 让电脑速度起飞!关于网络延迟及CPU调度的优化
  2. ubuntu网络连接问题(网络图标不见了,ifconfig不显示ip....)
  3. 腾讯云轻量应用服务器 CentOS7.6 +Tomcat/apache 搭建个人web项目,并允许外网通过80或8080端口访问【超详细】
  4. Go操作Elasticsearch总结
  5. 利用Matlab进行线性回归分析(1)
  6. 《Apple 设计奖 2014》出炉,还无辜的《Threes!》一个公道了
  7. 求一个数的所有质因数
  8. 数据治理、共享交换、数据仓库、数据中心的关系
  9. 用C语言中的switch语句实现奇偶数的判断
  10. 一些常用的batch命令