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

news2024/11/15 16:00:44

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 = 4
			cube.position.y = 10
			cube.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 = 4
			cube.position.y = 10
			cube.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.coloradmin.cn/o/1615815.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ollama在windows系统上安装总结以及注意事项

ollama官网 https://ollama.com/ 直接点击下载&#xff0c;会根据你的系统自动下载相应的版本。 下载完之后&#xff0c;直接点击安装&#xff0c;默认安装到c盘。 安装完之后就可以在命令窗口测试一下。 ollama的常用命令如下&#xff1a; ollama serve 启动ollama o…

认识产品经理

一、合格的产品经理 1、什么是产品 解决某个问题的东西&#xff0c;称为产品 键盘可以打字&#xff0c;想喝水了可以用水壶&#xff0c;在超市想找一款扫把会有导购员服务 产品有颜色、大小等等区别&#xff0c;也有有形和无形的区别 2、什么是产品经理 想清楚怎么设计产品…

【氮化镓】GaN HEMT SEEs效应影响因素和机制

研究背景&#xff1a;AlGaN/GaN HEMT因其在高电压、高温和高频率下的操作能力而受到关注&#xff0c;尤其在航空航天和汽车应用中&#xff0c;其辐射响应变得尤为重要。重离子辐射可能导致绝缘体失效&#xff0c;即单事件效应&#xff08;SEEs&#xff09;引起的栅介质击穿。 …

订单分红与异业联盟:共筑电商新生态

大家好&#xff0c;我是微三云周丽&#xff0c;今天给大家分析当下市场比较火爆的商业模式&#xff01; 小编今天跟大伙们分享什么是订单分红与异业联盟&#xff1f; 随着互联网的深入发展和商业模式的不断创新&#xff0c;电子商务行业正迎来qian所未有的发展机遇。近年来&a…

java接口自动化测试

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

Linux cmake 初窥【1】

1.开发背景 linux 下编译程序需要用到对应的 Makefile&#xff0c;用于编译应用程序&#xff0c;但是 Makefile 的语法过于繁杂&#xff0c;甚至有些反人类&#xff0c;所以这里引用了cmake&#xff0c;cmake 其中一个主要功能就是用于生成 Makefile&#xff0c;cmake 的语法更…

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

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

双周总结#008 - AIGC

本周参与了公司同事对 AIGC 的分享会&#xff0c;分享了 AIGC 在实际项目中的实践经验&#xff0c;以及如何进行 AIGC 的落地。内容分几项内容&#xff1a; 什么是 AIGCAIGC 能做什么AIGC 工具 以年终总结为例&#xff0c;分享了哪些过程应用了 AIGC&#xff0c;以及 AIGC 落地…

使用QQ邮箱进行登录验证

使用场景不多说&#xff0c;接下来直接看实现~ 登录到QQ邮箱&#xff0c;进入设置 打开IMAP/SMTP服务&#xff0c;记得把授权码记录下来&#xff0c;后面配置文件中需要用到 新建application的配置文件 spring:mail:# 指定邮件服务器地址host: smtp.qq.comusername: 你自己的q…

什么是SSRF攻击?该如何防御SSRF攻击?

随着网络安全形式日益严峻&#xff0c;各式各样的攻击频繁发生。当前&#xff0c;应用程序为了给用户提供更多更方便的功能&#xff0c;从另一个URL获取数据的场景越来越多&#xff0c;因此出现了一种安全漏洞攻击-SSRF。并且&#xff0c;由于云服务和体系结构的复杂性&#xf…

自动化测试的三种测试报告模板

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

《HCIP-openEuler实验指导手册》1.3Apache动态功能模块加载卸载练习

1.3.1 配置思路 mod_status 模块可以帮助管理员通过web界面监控Apache运行状态&#xff0c;通过LoadModule指令加载该模块&#xff0c;再配置相关权限&#xff0c;并开启ExtendedStatus后&#xff0c;即可使用该模块。 1.3.2 配置步骤 检查mod_status模块状态&#xff08;使…

[MySQL]运算符

1. 算术运算符 (1). 算术运算符 : , -, *, / 或 DIV, % 或MOD. (2). 例 : (3). 注 : DUAL是伪表.可以看到4/2结果为小数&#xff0c;并不会截断小数部分.(可能与其他语言不同&#xff0c;比如java中&#xff0c;两个操作数如果是整数&#xff0c;则计算得到的也是整数&…

ASP.NET大文件分片上传

ASP.NET大文件分片上传&#xff0c;C#上传大型视频文件到服务器,解决方案&#xff0c;用C# 实现断点续传 (HTTP)&#xff0c;ASP.NET实现文件夹的上传和下载&#xff0c;.NET使用WEBUPLOADER做大文件的分块和断点续传&#xff0c;ASP.NET实现文件上传和下载&#xff0c;完美解决…

JavaWeb--前端工程化

目录 1. 前端工程化 1.1. 概述 1.2. 前端工程化实现技术栈 2. ECMA6Script 2.1. es6的介绍 2.2. es6 变量 / 模版字符串 2.2.1. let 与 var 的差别 2.2.2. const 与 var 的差异 2.2.3. 模板字符串 2.3. 解构表达式 / 赋值 2.3.1. 数组解构赋值 2.3.2. 对象解构赋值 …

CFCASSL证书的网络安全解决方案

在数字化时代&#xff0c;网络信息安全的重要性不言而喻。随着电子商务、在线交易、远程办公等互联网活动的日益普及&#xff0c;确保数据传输的安全性与隐私保护成为企业和用户共同关注的焦点。在此背景下&#xff0c;CFCA SSL证书作为一种权威、高效的网络安全解决方案&#…

2024 应届校招经验分享(非互联网篇)

&#x1f4e2;&#x1f4e2;&#x1f4e2; 2024年应届毕业生&#xff0c;浙江大学计算机研究生。自23年秋招开始至今&#xff0c;博主先后拿到了互联网行业、机械制造行业、国企央企、高校体制等多家企业和单位的数十个Offer&#xff0c;了解多行业中的计算机求职方向&#xff…

使用JavaScript创建数组,并对其进行冒泡排序

JavaScript创建数组方式 字面量方式&#xff1a;使用方括号 [] 来创建数组&#xff0c;并在方括号内按顺序列出数组元素。 let arr [1, 2, 3, 4, 5]; Array() 构造函数方式&#xff1a;使用 new Array() 构造函数来创建数组&#xff0c;并传入数组元素作为参数。 let arr ne…

C++设计模式:中介者模式(十五)

1、定义与动机 定义&#xff1a;用一个中介对象来封装&#xff08;封装变化&#xff09;一系列的对象交互。中介者使各个对象不需要显示的相互引用&#xff08;编译时依赖 -> 运行时依赖&#xff09;&#xff0c;从而使其耦合松散&#xff08;管理变化&#xff09;&#xff…

Docker基础+虚拟化概念

目录 一、虚拟化简介 1、虚拟化概述 2、cpu的时间分片&#xff08;cpu虚拟化&#xff09; 3、cpu虚拟化性性能瓶颈 4、虚拟化工作 4.1虚拟机工作原理 4.2两大核心组件:QEMU、KVM 4.2.1QEMU&#xff1a; 4.2.2KVM&#xff1a; 5、虚拟化类型 ①全虚拟化&#xff1a; …