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

2024-04-23 02:12

本文主要是介绍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>

效果如下:

这篇关于three.js(3):添加three. js坐标轴、光源和阴影效果的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/927508

相关文章

使用Python获取JS加载的数据的多种实现方法

《使用Python获取JS加载的数据的多种实现方法》在当今的互联网时代,网页数据的动态加载已经成为一种常见的技术手段,许多现代网站通过JavaScript(JS)动态加载内容,这使得传统的静态网页爬取... 目录引言一、动态 网页与js加载数据的原理二、python爬取JS加载数据的方法(一)分析网络请求1

Kotlin Compose Button 实现长按监听并实现动画效果(完整代码)

《KotlinComposeButton实现长按监听并实现动画效果(完整代码)》想要实现长按按钮开始录音,松开发送的功能,因此为了实现这些功能就需要自己写一个Button来解决问题,下面小编给大... 目录Button 实现原理1. Surface 的作用(关键)2. InteractionSource3.

使用WPF实现窗口抖动动画效果

《使用WPF实现窗口抖动动画效果》在用户界面设计中,适当的动画反馈可以提升用户体验,尤其是在错误提示、操作失败等场景下,窗口抖动作为一种常见且直观的视觉反馈方式,常用于提醒用户注意当前状态,本文将详细... 目录前言实现思路概述核心代码实现1、 获取目标窗口2、初始化基础位置值3、创建抖动动画4、动画完成后

uniapp小程序中实现无缝衔接滚动效果代码示例

《uniapp小程序中实现无缝衔接滚动效果代码示例》:本文主要介绍uniapp小程序中实现无缝衔接滚动效果的相关资料,该方法可以实现滚动内容中字的不同的颜色更改,并且可以根据需要进行艺术化更改和自... 组件滚动通知只能实现简单的滚动效果,不能实现滚动内容中的字进行不同颜色的更改,下面实现一个无缝衔接的滚动

Java实现图片淡入淡出效果

《Java实现图片淡入淡出效果》在现代图形用户界面和游戏开发中,**图片淡入淡出(FadeIn/Out)**是一种常见且实用的视觉过渡效果,它可以用于启动画面、场景切换、轮播图、提示框弹出等场景,通过... 目录1. 项目背景详细介绍2. 项目需求详细介绍2.1 功能需求2.2 非功能需求3. 相关技术详细

使用animation.css库快速实现CSS3旋转动画效果

《使用animation.css库快速实现CSS3旋转动画效果》随着Web技术的不断发展,动画效果已经成为了网页设计中不可或缺的一部分,本文将深入探讨animation.css的工作原理,如何使用以及... 目录1. css3动画技术简介2. animation.css库介绍2.1 animation.cs

VSCode中配置node.js的实现示例

《VSCode中配置node.js的实现示例》本文主要介绍了VSCode中配置node.js的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着... 目录一.node.js下载安装教程二.配置npm三.配置环境变量四.VSCode配置五.心得一.no

Flutter实现文字镂空效果的详细步骤

《Flutter实现文字镂空效果的详细步骤》:本文主要介绍如何使用Flutter实现文字镂空效果,包括创建基础应用结构、实现自定义绘制器、构建UI界面以及实现颜色选择按钮等步骤,并详细解析了混合模... 目录引言实现原理开始实现步骤1:创建基础应用结构步骤2:创建主屏幕步骤3:实现自定义绘制器步骤4:构建U

JS+HTML实现在线图片水印添加工具

《JS+HTML实现在线图片水印添加工具》在社交媒体和内容创作日益频繁的今天,如何保护原创内容、展示品牌身份成了一个不得不面对的问题,本文将实现一个完全基于HTML+CSS构建的现代化图片水印在线工具... 目录概述功能亮点使用方法技术解析延伸思考运行效果项目源码下载总结概述在社交媒体和内容创作日益频繁的

Node.js 数据库 CRUD 项目示例详解(完美解决方案)

《Node.js数据库CRUD项目示例详解(完美解决方案)》:本文主要介绍Node.js数据库CRUD项目示例详解(完美解决方案),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考... 目录项目结构1. 初始化项目2. 配置数据库连接 (config/db.js)3. 创建模型 (models/