three.js(3):添加three. js坐标轴、光源和阴影效果

1 实现步骤

要实现阴影效果同样需要几个重要的概念。

我们首先研究一下日常生活中是如何产生阴影效果的。

  • 需要有光。
  • 需要一个物体,比如苹果、狗等。
  • 需要一个接受投影的元素,比如地面、桌面等。

在 Three.js 中要产生阴影效果其实和现实世界的原理差不多。

但考虑到性能原因,Three.js 默认关闭了阴影效果,需要手动开启阴影效果:

  1. 渲染器开启阴影效果。
  2. 有一个能产生阴影的光源,并开启阴影效果。
  3. 有一个接受阴影投射的元素(比如地面),并设置 接受阴影的属性 为 true。
  4. 有一个能产生阴影效果的物体,并开启阴影效果。

2 搭建场景

在Three中搭建基础场景需要3要素:场景Scene、摄像机PerspectiveCamera、渲染器 WebGLRenderer 。

			//创建场景var scene = new Scene();//设置透视摄像机var camera = new PerspectiveCamera(75,window.innerWidth / window.innerHeight,0.1,1000);//设置渲染器var render = new WebGLRenderer({antialias: true});render.setSize(window.innerWidth,window.innerHeight);//将渲染器中的DOM元素对象添加到指定的DIV中document.getElementById("puidu-webgl-output").appendChild(render.domElement);//设置坐标轴var axes = new AxesHelper(50);scene.add(axes);//设置透视摄像机z轴的距离,也就是和屏幕的距离camera.position.x = -30;camera.position.y = 45;camera.position.z = 35;//摄像机对准场景中心点camera.lookAt(scene.position);

3 创建立方体

			//创建立方几何体var geometry = new BoxGeometry(8,8,8);//创建一个网格基础材质,并设置材质颜色var material = new MeshLambertMaterial({color:0xff2288});//立方几何体和材质整合var cube = new Mesh(geometry,material);//立方体网格添加到场景中scene.add(cube);cube.position.x = 4cube.position.y = 10cube.position.z = 20

4 创建地面

在本例中地面是用来接受物体投影的载体。

创建地面我使用了 PlaneGeometry 平面,该方法只需传入宽和高即可。

然后使用 MeshLambertMaterial 材质,设置地面颜色为白色。

			//创建平面几何体var planeGeometry = new PlaneGeometry(100,100);var planeMaterial = new MeshLambertMaterial({color:0xcccccc});var plane = new Mesh(planeGeometry,planeMaterial);plane.rotation.x = -0.5 * Math.PI;plane.position.set(15,0,0);scene.add(plane);

5 创建光源

因为本例 没有使用 基础材质(MeshBasicMaterial) ,渲染出来的物体没有光源是不会显示的,所以我先把光源添加到场景中,之后添加地面和立方体时就比较方便观察了。

要实现阴影效果,我选择了 SpotLight 聚光灯。

			//聚光灯var spotLight = new SpotLight(0xFFFFFF);spotLight.position.set(-60,40,-65);//设置阴影效果spotLight.shadow.camera.mapSize = new Vector2(1024,1024);spotLight.shadow.camera.far = 130;spotLight.shadow.camera.near = 40;scene.add(spotLight);//MeshLambertMaterial材质需要Lambert光源var ambienLight = new AmbientLight(0xAAAAAA);scene.add(ambienLight);

6 开启阴影效果

用回上面提到的四句口诀就能开启阴影效果

  1. 渲染器开启阴影效果。
  2. 有一个能产生阴影的光源,并开启阴影效果。
  3. 有一个接受阴影投射的元素(比如地面),并设置 接受阴影的属性 为 true。
  4. 有一个能产生阴影效果的物体,并开启阴影效果。

开启渲染器阴影

render.shadowMap.enabled = true;

立方体开启阴影效果

cube.castShadow = true;

地面接受阴影

plane.receiveShadow = true;

光源开启阴影效果

spotLight.castShadow = true;

注意:

如果想设置阴影的精细度,还可以通过聚光灯的三个属性进行控制:

  • spotLight.shadow.mapSize
  • spotLight.shadow.camera.far
  • spotLight.shadow.camera.near

7 完整代码如下

<!DOCTYPE html>
<html><head><meta charset="utf-8" /><title></title><meta name="viewport" content="width=device-width, initial-scale=1.0"><script text="module" charset="UTF-8" src="./js/THREE.js"></script><title>Document</title><style>body{margin: 0;overflow: hidden;}</style></head><body><div id="puidu-webgl-output"></div><script type="module">//引入关键字import {Scene,PerspectiveCamera,WebGLRenderer,BoxGeometry,Mesh,AxesHelper,PlaneGeometry,MeshLambertMaterial,AmbientLight,SpotLight,Vector2} from "./js/THREE.js";//创建场景var scene = new Scene();//设置透视摄像机var camera = new PerspectiveCamera(75,window.innerWidth / window.innerHeight,0.1,1000);//设置渲染器var render = new WebGLRenderer({antialias: true});render.setSize(window.innerWidth,window.innerHeight);//开启阴影render.shadowMap.enabled = true;//将渲染器中的DOM元素对象添加到指定的DIV中document.getElementById("puidu-webgl-output").appendChild(render.domElement);//设置坐标轴var axes = new AxesHelper(50);scene.add(axes);//创建立方几何体var geometry = new BoxGeometry(8,8,8);//创建一个网格基础材质,并设置材质颜色var material = new MeshLambertMaterial({color:0xff2288});//立方几何体和材质整合var cube = new Mesh(geometry,material);//立方体网格添加到场景中scene.add(cube);cube.castShadow = true;cube.position.x = 4cube.position.y = 10cube.position.z = 20//创建平面几何体var planeGeometry = new PlaneGeometry(100,100);var planeMaterial = new MeshLambertMaterial({color:0xcccccc});var plane = new Mesh(planeGeometry,planeMaterial);plane.rotation.x = -0.5 * Math.PI;plane.position.set(15,0,0);//设置接受阴影plane.receiveShadow = true;scene.add(plane);//设置透视摄像机z轴的距离,也就是和屏幕的距离camera.position.x = -30;camera.position.y = 45;camera.position.z = 35;//摄像机对准场景中心点camera.lookAt(scene.position);//聚光灯var spotLight = new SpotLight(0xFFFFFF);spotLight.position.set(-60,40,-65);//开启阴影spotLight.castShadow = true;//设置阴影效果spotLight.shadow.camera.mapSize = new Vector2(1024,1024);spotLight.shadow.camera.far = 130;spotLight.shadow.camera.near = 40;scene.add(spotLight);//MeshLambertMaterial材质需要Lambert光源var ambienLight = new AmbientLight(0xAAAAAA);scene.add(ambienLight);//将场景和摄像机传入到渲染器中render.render(scene,camera);</script></body>
</html>

效果如下:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/640614.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Azure AD统一认证及用户数据同步开发指导

本文主要目的为&#xff1a;指导开发者进行自有服务与Azure AD统一认证的集成&#xff0c;以及阐述云端用户数据同步的实现方案。本文除了会介绍必要的概念、原理、流程外&#xff0c;还会包含Azure门户设置说明&#xff0c;以及使用Fiddler进行全流程的实操验证&#xff0c;同…

苹果电脑装虚拟机好用吗 苹果电脑装虚拟机要钱吗 Parallels对mac的损害 Parallels占用多大空间 PD19

在当今数字化的时代&#xff0c;人们对电脑系统跨设备互联的需求越来越高。作为拥有广泛用户群体的苹果电脑&#xff0c;许多用户会有在Mac系统中运行其他操作系统的需求。在这种情况下&#xff0c;安装虚拟机是一个较好的解决方案。那么接下来就给大家介绍苹果电脑装虚拟机好用…

ChatGPT助力测试领域!探索人工智能编写测试用例的新前景

简介 测试用例是测试人员的核心工作内容&#xff0c;是测试人员思想的“实现类”&#xff0c;其充分体现了测试的思路&#xff0c;可以为后续的测试行为提供指导&#xff0c;是测试人员了解业务的重要根据和质量之根本。如果测试用例设计得不完成&#xff0c;出现了遗漏&#x…

什么是NTFS文件系统 Paragon NTFS与Tuxera NTFS有何区别 paragon ntfs 优惠券

NTFS 英文全称New Technology File System&#xff0c;中文名叫新技术文件系统&#xff0c;是 WindowsNT 环境的文件系统。NTFS是Windows NT家族(如Windows 2000、Windows XP、Windows Vista、Windows 7和 windows 8.1等&#xff09;的限制级专用的文件系统(操作系统所在的盘的…

windows ubuntu 子系统:肿瘤全外篇,bam质控

各个环节的质控&#xff0c; raw和clean都要质控&#xff0c; 比对的各环节的bam文件都要质控&#xff0c; 使用qulima对wes的比对bam文件总结测序深度及覆盖率。 samtools flagstat L1_recalibrated_reads.bam 该命令将输出 BAM 文件的一些统计信息&#xff0c;包括总读取数、…

stm32HAL_GPIO输入

学会使用 GPIO 采集 KEY 的数据信息&#xff0c;这种信息采集技术在生活中常见于对大自 然环境的各种信息的采集。比如环境温度&#xff0c;湿度等等。我们这里以 key 为入门设 备。 一&#xff0c;什么是信息采集 比如环境温度&#xff0c;湿度等等。我们需要把这些温度&am…

Linux thermal框架介绍

RK3568温控 cat /sys/class/thermal/thermal_zone0/temp cat /sys/class/thermal/thermal_zone1/temp cat /sys/class/thermal/cooling_device0/cur_state cat /sys/class/thermal/cooling_device1/cur_state cat /sys/class/thermal/cooling_device2/cur_state thermal_zone…

Cloud微服务:Ribbon负载均衡

个人简介&#xff1a;Java领域新星创作者&#xff1b;阿里云技术博主、星级博主、专家博主&#xff1b;正在Java学习的路上摸爬滚打&#xff0c;记录学习的过程~ 个人主页&#xff1a;.29.的博客 学习社区&#xff1a;进去逛一逛~ Ribbon负载均衡 一、Ribbon - 负载均衡原理、流…

Oracle进阶(2)——物化视图案例延伸以及序列、同义词

一、物化视图 物化视图&#xff08;Materialized View&#xff09;是 Oracle 数据库中的一个对象&#xff0c;它是一个预先计算和存储的查询结果集&#xff0c;类似于视图&#xff0c;但与视图不同的是&#xff0c;物化视图会将查询结果保存在物理存储中&#xff0c;而不是动态…

WPF2022终结版系列课程笔记 1 WPF 基本布局

本笔记为B站 微软系列技术教程 WPF项目实战合集(2022终结版) 项目记录 WPF 基本布局 WPF布局原则 一个窗口中只能包含一个元素 不应显示设置元素尺寸 不应使用坐标设置元素的位置 可以嵌套布局容器 WPF布局容器 StackPanel: 水平或垂直排列元素、Orientation属性分别: Hor…

STP学习的第一篇

1.STP的基本概念&#xff1a;根桥 &#xff08;1&#xff09;STP的主要作用之一是在整个交换网络中计算出一棵无环的“树”&#xff08;STP树&#xff09;。 &#xff08;2&#xff09;根桥是一个STP交换网络中的“树根”。 &#xff08;3&#xff09;STP开始工作后&#xf…

K8s: Ingress对象, 创建Ingress控制器, 创建Ingress资源并暴露服务

Ingress对象 1 &#xff09;概述 Ingress 是对集群中服务的外部访问进行管理的 API 对象&#xff0c;典型的访问方式是 HTTPIngress-nginx 本质是网关&#xff0c;当你请求 abc.com/service/a, Ingress 就把对应的地址转发给你&#xff0c;底层运行了一个 nginx但 K8s 为什么不…