three.js中聚光灯及其属性介绍

2023-11-19

一、聚光灯及其属性介绍

Three.js中的聚光灯(SpotLight)是一种用于在场景中创建聚焦光照的光源类型。它有以下属性:

  1. color:聚光灯的颜色。

  2. intensity:聚光灯的强度。

  3. distance:聚光灯的有效距离。

  4. angle:聚光灯的光锥角度。

  5. penumbra:聚光灯锥形光圈的模糊半径。

  6. decay:聚光灯的衰减系数。

  7. position:聚光灯的位置。

  8. target:聚光灯的目标位置(用于确定聚光灯的方向)。

以下是一个应用到聚光灯的所有属性的例子:

var spotLight = new THREE.SpotLight(0xffffff, 1, 100, Math.PI/4, 0, 2); //创建一个白色聚光灯,强度为1,有效距离为100,光锥角度为45度,模糊半径为0,衰减系数为2

spotLight.position.set(0, 10, 0); //设置聚光灯的位置

var spotLightTarget = new THREE.Object3D(); //创建一个对象作为聚光灯的目标
spotLightTarget.position.set(0, 0, -10); //设置目标位置
scene.add(spotLightTarget); //将目标对象添加到场景中

spotLight.target = spotLightTarget; //设置聚光灯的目标为目标对象

scene.add(spotLight); //将聚光灯添加到场景中

二、结合dat.gui和立方体查看聚光灯属性设置效果案例

1. 效果如图:

在这里插入图片描述

2. 完整代码如下:

import * as THREE from "three";
// 导入轨道控制器
import { OrbitControls } from "three/examples/jsm/controls/OrbitControls";
// 导入动画库
import gsap from "gsap";
// 导入dat.gui
import * as dat from "dat.gui";
import { RGBELoader } from "three/examples/jsm/loaders/RGBELoader";

const gui = new dat.GUI();
// 1、创建场景
const scene = new THREE.Scene();

// 2、创建相机
const camera = new THREE.PerspectiveCamera(
  75,
  window.innerWidth / window.innerHeight,
  0.1,
  1000
);

// 设置相机位置
camera.position.set(0, 0, 10);
scene.add(camera);

const sphereGeometry = new THREE.BoxGeometry( 1, 1, 1 );  // 立方体几何体 参数:长、宽、高
const material = new THREE.MeshStandardMaterial({color: 0x00ff00});
const sphere = new THREE.Mesh(sphereGeometry, material);
// 投射阴影
sphere.castShadow = true; // 设置立方体投射阴影

scene.add(sphere); // 将立方体添加到场景中

// // 创建平面
const planeGeometry = new THREE.PlaneBufferGeometry(50, 50);
// 创建标准材质
const materialplane = new THREE.MeshStandardMaterial({color: 0xf0fff0});
const plane = new THREE.Mesh(planeGeometry, materialplane);
plane.position.set(0, -1, 0);
plane.rotation.x = -Math.PI / 2;
// 接收阴影
plane.receiveShadow = true;
scene.add(plane);

// 灯光
// 环境光
const light = new THREE.AmbientLight(0xffffff, 0.5); // soft white light
scene.add(light);
// 创建聚光灯
const spotLight = new THREE.SpotLight(0xffffff, 1);
spotLight.position.set(5, 5, 5); // 设置聚光灯位置
spotLight.castShadow = true; // 设置聚光灯投射阴影
spotLight.intensity = 2; // 设置聚光灯强度

// 设置阴影贴图模糊度
spotLight.shadow.radius = 20;
// 设置阴影贴图的分辨率
spotLight.shadow.mapSize.set(512, 512);

// console.log(directionalLight.shadow);
spotLight.target = sphere; // 设置聚光灯的目标为立方体 会自动对准目标
spotLight.angle = Math.PI / 6; // 设置聚光灯的角度
spotLight.distance = 0; // 设置聚光灯的距离
spotLight.penumbra = 0; // 设置聚光灯的边缘
spotLight.decay = 0; // 设置聚光灯的衰减

// 设置透视相机的属性

scene.add(spotLight);
gui.add(sphere.position, "x").min(-5).max(5).step(0.1);
gui
  .add(spotLight, "angle")
  .min(0)
  .max(Math.PI / 2)
  .step(0.01);
gui.add(spotLight, "distance").min(0).max(10).step(0.01);
gui.add(spotLight, "penumbra").min(0).max(1).step(0.01);
gui.add(spotLight, "decay").min(0).max(5).step(0.01);

// 初始化渲染器
const renderer = new THREE.WebGLRenderer();
// 设置渲染的尺寸大小
renderer.setSize(window.innerWidth, window.innerHeight);
// 开启场景中的阴影贴图
renderer.shadowMap.enabled = true;
renderer.physicallyCorrectLights = true; // 设置渲染器的物理正确性

// console.log(renderer);
// 将webgl渲染的canvas内容添加到body
document.body.appendChild(renderer.domElement);

// 创建轨道控制器
const controls = new OrbitControls(camera, renderer.domElement);
// 设置控制器阻尼,让控制器更有真实效果,必须在动画循环里调用.update()。
controls.enableDamping = true;

// 添加坐标轴辅助器
const axesHelper = new THREE.AxesHelper(5);
scene.add(axesHelper);
// 设置时钟
const clock = new THREE.Clock();

function render() {
  controls.update();
  renderer.render(scene, camera);
  //   渲染下一帧的时候就会调用render函数
  requestAnimationFrame(render);
}

render();

// 监听画面变化,更新渲染画面
window.addEventListener("resize", () => {
  //   console.log("画面变化了");
  // 更新摄像头
  camera.aspect = window.innerWidth / window.innerHeight;
  //   更新摄像机的投影矩阵
  camera.updateProjectionMatrix();

  //   更新渲染器
  renderer.setSize(window.innerWidth, window.innerHeight);
  //   设置渲染器的像素比
  renderer.setPixelRatio(window.devicePixelRatio);
});

3. 更改属性效果

1. 更改位置

我们这里设置了spotLight.target = sphere; // 设置聚光灯的目标为立方体 会自动对准目标,此时我们移动立方体,灯光应该会跟着立方体移动,如图:

  • x : 0
    在这里插入图片描述

  • x : 2.7
    在这里插入图片描述

2. 更改聚光灯的光锥角度

  • angle:0.52
    在这里插入图片描述- angle:0.22
    在这里插入图片描述

3. 更改聚光灯的有效距离

  • distance: 0
    在这里插入图片描述
  • distance: 10
    在这里插入图片描述

4. 更改聚光灯锥形光圈的模糊半径

  • penumbra:0
    在这里插入图片描述
  • penumbra:0.3
    在这里插入图片描述

5. 更改聚光灯的衰减系数

  • decay: 0
    在这里插入图片描述

  • decay: 0.31
    在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

three.js中聚光灯及其属性介绍 的相关文章

  • Angular UI 模式的范围问题

    我无法理解 使用角度 UI 模式的范围 虽然这里不是很明显 但我已经正确设置了模块和所有内容 据我所知 但这些代码示例尤其是我发现错误的地方 index html 其中重要部分 div class btn group div
  • 如何删除除任何特定 id 之外的元素

    假设有一个父 id 其中包含许多元素 我想删除除一个元素之外的所有元素 ex parent id children not id n remove
  • Jquery 悬停卡

    我在用着http designwithpc com Plugins Hovercard http designwithpc com Plugins Hovercard 但我不知道如何在悬停卡上声明 var 每个工作描述都有自己的 ID 当悬
  • JavaScript 添加布尔值

    console log true true 2 console log typeof true true number console log isNaN true true false 为什么两个布尔类型相加会产生一个数字 我有点理解 如
  • 如何正确清理来自 AngularJS 控制器的无效输入的表单?

    我有一个 AngularJS 表单 其中包含 除其他字段之外 类型之一url 后者很重要 因为这会强制相应的输入成为有效的 URL 在某些条件下 例如 要关闭具有此类表单的模式对话框 我想以编程方式清除该表单 为此 我实现了方法reset基
  • .push() 将多个对象放入 JavaScript 数组中返回“未定义”

    当我将项目添加到beats数组然后console log用户时 我得到了数组中正确的项目数 但是当我检查 length 时 我总是得到 1 尝试调用索引总是会给我 未定义 如下所示 Tom beats 1 我想我错过了一些明显的东西 但这让
  • 在版本 4.4.6 中禁用 ckeditor 上下文菜单

    我在 Rails4 项目中使用 ckeditor 我尝试了 ckeditor gem 和 ckeditor rails gem 来提供 ckeditor 库 这里有多个帖子 人们希望删除 ckeditor 上下文菜单 以便可以显示本机浏览器
  • 为什么 window 与 Internet Explorer 中的 window.self 不同?

    关于我如何遇到这个问题有一个复杂的背景故事 但为什么self属性不完全等于窗口本身 在 Safari 和 Firefox 及其朋友中 结果如我所料 gt window window self true gt window window se
  • 如何在React Native Android中获取响应头?

    您好 我想在获取 POST 请求后获取响应标头 我尝试调试看看里面有什么response with console log response 我可以从以下位置获取响应机构responseData但我不知道如何获取标题 我想同时获得标题和正文
  • 导航栏下拉菜单(折叠)在 Bootstrap 5 中不起作用

    我在尝试使用以下命令创建响应式菜单或下拉按钮时遇到问题Bootstrap 5一切似乎都正常 导航图标和下拉图标出现 但它不起作用 当我单击nav图标或dropdown按钮 无dropdown menu apears 我想特别提到的是 我还包
  • React autoFocus 将光标设置为输入值的开头

    我有一个受控输入 最初显示一个值 我已将该输入设置为自动聚焦 但当我希望它出现在末尾时 光标出现在输入的开头 我知道这可能是因为自动对焦是在值之前添加的 但我不能 100 确定 在输入字段末尾完成光标初始化的最佳方法是什么 var Test
  • JavaScript 继承;调用和原型

    要在Javascript中实现继承 通常需要执行以下两个步骤 假设我有一个基类 Animal var Animal function name this name name 我现在想从中派生一个子类 Dog 所以我想说 var Dog fu
  • JavaScript推送函数中的动态变量

    我在 JavaScript 中使用推送功能 var chartData for var i 0 i lt 3 i chartData push date new Date year s mon s date s hr s min s sec
  • 如何使用 Javascript 设置查询字符串

    有没有办法使用 javascript 设置查询字符串的值 我的页面有一个过滤器列表 单击该列表时 它将更改右侧的页内结果窗格 我正在尝试更新 url 的查询字符串值 因此如果用户离开页面 然后单击 后退 按钮 他们将返回到最后一个过滤器选择
  • onclick 事件中未调用函数

    我想在每个 YouTube 链接的末尾添加一些 HTML 以在 litebox 中打开播放器 到目前为止 这是我的代码 document ready function var valid url new RegExp youtube com
  • 如何正确取消引用然后删除 JavaScript 对象?

    我想知道从内存中完全取消引用 JavaScript 对象的正确方法 确保删除时不会在内存中悬空 并且垃圾收集器会删除该对象 当我看这个问题时在 JavaScript 中删除对象 https stackoverflow com questio
  • 如何计算特定字符在字符串中出现的次数

    我正在尝试创建一个函数来查看数组中的任何字符是否在字符串中 如果是 有多少个 我尝试计算每一种模式 但是太多了 我尝试使用 Python 中的 in 运算符的替代方案 但效果不佳 function calc fit element var
  • 使用 Javascript 设置 cookie [重复]

    这个问题在这里已经有答案了 我正在尝试构建我的第一个移动应用程序 它需要连接到我的 mysql 数据库并使用 json 返回数据 这很好 目前我有一个登录系统 一旦确定用户名和密码存在 它就会返回一条成功消息 对于下一步 我想在我的页面上使
  • 用于选择特定 div 中具有特定类的锚元素的 jQuery 选择器是什么

    我有一些这样的代码 我想选择每个 a 带有类的标签status在 div 中foo div a class status a div 你可以这样做 foo find status a
  • 使用velocity.js制作可拖动元素的动画

    我正在使用velocity js 为用户拖动的可拖动 SVG 元素设置动画 然而 velocity js 将先前的 mousemove 坐标排队并通过所有后续的 mousemove 坐标进行动画处理 我想要的是velocity js 不要对

随机推荐

  • spring boot 配合element ui vue实现表格的批量删除(前后端详细教学,简单易懂,有手就行)

    目录 一 前言 二 前端代码 2 1 element ui组件代码 2 2删除按钮 2 3 data 2 4 methods 三 后端代码 一 前言 研究了其他人的博客 找到了一篇有含金量的 进行了部分改写实现前后端分离 参考博主为小白Ra
  • 【下降算法】最速下降法、Newton法、共轭梯度法

    文章目录 1 一维搜索 2 最速下降法 最速下降法特征 最速下降法的优缺点 3 Newton法 算法基本思想 牛顿法和梯度下降法的效率对比 4 共轭梯度法 1 一维搜索 最优化问题一般选择某一组变量 然后在满足一定的限制条件下 求出使目标值
  • Servlet 和 Cookie-Session 学习笔记(基础)

    简单来说 是运行在服务器端的 Java 程序 它作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层 用处 使用 Servlet 您可以收集来自网页表单的用户输入 呈现来自数据库或者其他
  • PyCrypto,PyCryptodome, Python 调用密码学算法AES

    Crypto PyCrypto PyCryptodomeCrypto PyCrypto 参考网址附上 今天我真的也是很无奈了 想要做一个密码学的作业 需要用到pycrypto的包 但是安装完之后不能正常调用 就找到了PyCryptodome
  • fetch 服务器不响应,Fetch 常见的使用问题

    fetch的浏览器兼容 fetch默认不携带cookie fetch发送请求默认是不发送cookie的 不管是同域还是跨域 需要设置 fetch url credentials include 可以配置其credentials项 其有3个值
  • CAN FD基础

    CAN FD基础 一 CAN FD与CAN 2 0的区别 1 CAN FD的优势 该协议能够支持更高的速率 可以更快的刷写ECU 在单个数据帧内传送率可达64字节 避免了经常发生的数据分拆传输的状况 对汽车行业而言 CAN FD协议显得非常
  • CVE-2023-21839 Weblogic IIOP RCE复现

    漏洞描述 WebLogic是美国Oracle公司出品的一个application server 用于本地和云端开发 集成 部署和管理大型分布式Web应用 网络应用和数据库应用的Java应用服务器 WebLogic Server是一个基于JA
  • 微信图片上传 invalid credential, access_token is invalid or not latest

    这个问题可能是因为你部署的时候 起了多个进程 每个进程都去微信的服务器获取一次access token 只有最后一个获取到的access token才有效 比如 如果你用gunicorn去启django 并设置4个进程 那么你会发现 每上传
  • spring id,name

    转载于 https www cnblogs com 549294286 p 9947815 html 在BeanFactory的配置中 是我们最常见的配置项 它有两个最常见的属性 即id和name 最近研究了一下 发现这两个属性还挺好玩的
  • 如何覆盖上一次commit_Git如何在已有的 commit 上再次提交?

    在一些受管控的项目上 提交代码到 git 服务器后 还需要经过审核确认才正式合入版本 一般常用 gerrit 来进行审核确认操作 如果提交的代码审核不通过 需要再次修改提交 由于是修改同一个问题 我们可能不希望生成多个 commit 信息
  • Ceph bluestore中的缓存管理

    从15年3月接触Ceph分布式存储系统 至今已经5年了 因为工作的需要 对Ceph的主要模块进行了较深入的学习 也在Ceph代码层面做了些许改进 以满足业务需要 我们主要使用M版本 最近得闲 将过往的一些学习心得 改进以及优化思路记录下了
  • CDN基本工作过程

    看了一些介绍CDN的文章 感觉这篇是讲的最清楚的 使用CDN会极大地简化网站的系统维护工作量 网站维护人员只需将网站内容注入CDN的系统 通过CDN部署在各个物理位置的服务器进行全网分发 就可以实现跨运营商 跨地域的用户覆盖 由于CDN将内
  • firewalld 放行端口

    发现 telnet报错 telnet connect to address IP No route to host 于是检查目标主机的 firewalld 发先没有放行对应端口 在 firewalld 防火墙中放行端口 可以使用 firew
  • 微信小程序报错-errCode: -1

    1 报错截图 2 报错原因 Collection remove 需要小程序端2 9 4版本或之后的版本才支持 看了眼我的调试基础库 我的版本是2 8 1 所以 3 解决方法 点击右上角的详情 本地设置 调试基础库选择2 14 0
  • js数组相加相减函数

    数组相减 reduceArray arr1 arr2 for var i arr1 length 1 i gt 0 i var a arr1 i for var j arr2 length 1 j gt 0 j var b arr2 j i
  • Qt打开包含头文件以及打开函数声明和定义的方法

    当第一次拿到被人的程序的时候不知道如何向VS或者keil这样的编译器可以直接右键打开头文件 Qt可以通过 1 鼠标放在你需要打开的头文件或者函数声明的地方 如下图我鼠标放在MainWindow上 2 Ctrl 鼠标左键单击 或者使用快捷键F
  • python-算法时间复杂度和空间复杂度

    大O表示法 O 名称 举例 1 常量时间 一次赋值 logn 对数时间 折半查找 n 线性时间 线性查找 nlogn 对数线性时间 快速排序 n 2 平方 两重循环 n 3 立方 三重循环 2 n 指数 递归求斐波那契数列 n 阶乘 旅行商
  • html文本元素

    文章目录 h p span pre code 实体字符 strong i em del s h h head 标题 一共有六级标题 hKaTeX parse error Expected got EOF at end of input 6
  • 【编译原理】 CS143 斯坦福大学公开课 第一周:简介

    youtube 1 1 Introduction to Compilers and interpreters 1 1 Introduction to Compilers and interpreters 编译器解释器介绍 两种主要的实现编程
  • three.js中聚光灯及其属性介绍

    一 聚光灯及其属性介绍 Three js中的聚光灯 SpotLight 是一种用于在场景中创建聚焦光照的光源类型 它有以下属性 color 聚光灯的颜色 intensity 聚光灯的强度 distance 聚光灯的有效距离 angle 聚光