Three.js 阴影 (Shadow) 知识点整理

news2025/3/20 4:39:38

阴影主要由 castShadowreceiveShadow 控制,并通过不同类型的光源 (DirectionalLightSpotLightPointLight) 生成。我们将系统地整理与阴影相关的知识点。


1️⃣ 基础概念

  • castShadow 🎭:物体是否投射阴影。
  • receiveShadow 🏞️:物体是否接收阴影。
  • renderer.shadowMap.enabled = true ✅:全局开启阴影渲染。
  • renderer.shadowMap.type 📦:设置阴影质量,常见类型:
    • THREE.BasicShadowMap(性能高但质量低)
    • THREE.PCFShadowMap(平滑阴影,默认值)
    • THREE.PCFSoftShadowMap(更柔和的阴影)
    • THREE.VSMShadowMap(高级阴影,适用于柔和阴影)

2️⃣ 各类光源的阴影设置

在 Three.js 中,不是所有的光源都能投射阴影:

光源类型

支持阴影

代码示例

DirectionalLight

✅ 支持

directionalLight.castShadow = true

SpotLight

✅ 支持

spotLight.castShadow = true

PointLight

✅ 支持

pointLight.castShadow = true

AmbientLight

❌ 不支持

HemisphereLight

❌ 不支持

RectAreaLight

❌ 不支持


3️⃣ 代码分析:Directional Light 阴影

const directionalLight = new THREE.DirectionalLight(0xffffff, 0.5);
directionalLight.position.set(2, 2, -1);
scene.add(directionalLight);

directionalLight.castShadow = true; // ✅ 允许投射阴影

// 调整阴影贴图大小,影响阴影清晰度
directionalLight.shadow.mapSize.width = 1024;
directionalLight.shadow.mapSize.height = 1024;

// 调整阴影相机视锥体,决定阴影投射区域
directionalLight.shadow.camera.top = 2;
directionalLight.shadow.camera.bottom = -2;
directionalLight.shadow.camera.right = 2;
directionalLight.shadow.camera.left = -2;

// 调整相机的远近平面,影响阴影范围
directionalLight.shadow.camera.near = 1;
directionalLight.shadow.camera.far = 6;

// 创建 CameraHelper 可视化阴影相机
const directionalLightHelper = new THREE.CameraHelper(directionalLight.shadow.camera);
scene.add(directionalLightHelper);

📌 重点知识

  • shadow.mapSize:控制阴影贴图分辨率,越大阴影越清晰,但影响性能。
  • shadow.camera.top/bottom/left/right:控制阴影的投影区域,过大会导致阴影模糊,过小会裁剪阴影。
  • shadow.camera.near/far:控制阴影投射的最近和最远范围,合理调整可优化阴影效果。

4️⃣ 代码分析:Spot Light 阴影

const spotLight = new THREE.SpotLight(0xffffff, 20, 5, Math.PI * 0.3);
spotLight.position.set(0, 2, 2);
spotLight.castShadow = true; // ✅ 允许投射阴影

// 调整阴影质量
spotLight.shadow.mapSize.width = 1024;
spotLight.shadow.mapSize.height = 1024;

// 控制阴影相机的远近平面
spotLight.shadow.camera.fov = 30;
spotLight.shadow.camera.near = 1;
spotLight.shadow.camera.far = 6;

scene.add(spotLight);
scene.add(spotLight.target);

// 创建 CameraHelper 可视化阴影相机
const spotLightHelper = new THREE.CameraHelper(spotLight.shadow.camera);
scene.add(spotLightHelper);

📌 重点知识

  • shadow.camera.fov:影响光锥大小,控制阴影范围。
  • shadow.camera.near/far:控制阴影渲染范围,避免不必要的计算。
  • spotLight.target:聚光灯照射的目标点,影响阴影方向。

5️⃣ 代码分析:Point Light 阴影

const pointLight = new THREE.PointLight(0xffffff, 3);
pointLight.position.set(-1, 1, 0);
pointLight.castShadow = true; // ✅ 允许投射阴影

// 调整阴影质量
pointLight.shadow.mapSize.width = 1024;
pointLight.shadow.mapSize.height = 1024;

// 控制阴影相机的远近平面
pointLight.shadow.camera.near = 0.1;
pointLight.shadow.camera.far = 6;

scene.add(pointLight);

// 创建 CameraHelper 可视化阴影相机
const pointLightHelper = new THREE.CameraHelper(pointLight.shadow.camera);
scene.add(pointLightHelper);

📌 重点知识

  • PointLight 采用 cubeShadowMap:需要渲染 6 个方向的阴影,性能开销较大。
  • shadow.camera.near/far:优化阴影投射范围,避免性能浪费。

6️⃣ 代码分析:阴影贴图

const textureLoader = new THREE.TextureLoader();
const bakedShadow = textureLoader.load('texture/shadow/bakedShadow.jpg');
const simpleShadow = textureLoader.load('texture/shadow/simpleShadow.jpg');

📌 重点知识

  • 预渲染阴影贴图(Baked Shadow):避免实时计算阴影,提高性能。
  • 透明阴影(Simple Shadow)
new THREE.MeshBasicMaterial({
    color: 0x000000,
    transparent: true,
    alphaMap: simpleShadow
})
    • transparent: true 让黑色区域可见,白色区域透明。
    • alphaMap 让阴影贴图应用到 PlaneGeometry

7️⃣ 代码分析:球体阴影

sphereshadow.rotation.x = -Math.PI * 0.5;
sphereshadow.position.y = plane.position.y + 0.01;
scene.add(sphere, plane, sphereshadow);

📌 重点知识

  • 手动调整阴影位置 避免阴影和地面重叠导致视觉错误。
  • 动态改变阴影透明度
sphereshadow.material.opacity = 1 - sphere.position.y * 0.3;
    • 球体越高,阴影越淡,实现“动态阴影”效果。

8️⃣ 代码分析:阴影优化

renderer.shadowMap.enabled = true;
renderer.shadowMap.type = THREE.PCFSoftShadowMap;

📌 重点知识

  • PCFSoftShadowMap:提供平滑柔和的阴影。
  • setPixelRatio(Math.min(window.devicePixelRatio, 2)):限制像素比,平衡清晰度和性能。

🔚 总结

知识点

关键参数

开启阴影

renderer.shadowMap.enabled = true

光源投射阴影

light.castShadow = true

物体投射阴影

mesh.castShadow = true

物体接收阴影

mesh.receiveShadow = true

优化阴影

shadow.mapSize

, shadow.camera.near/far

手动优化阴影效果

预渲染贴图 (bakedShadow

), PCFSoftShadowMap

🚀 通过合理调整这些参数,可以让 Three.js 的阴影更加逼真、柔和,同时兼顾性能优化!

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

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

相关文章

GHCTF web方向题解

upload?SSTI! import os import refrom flask import Flask, request, jsonify,render_template_string,send_from_directory, abort,redirect from werkzeug.utils import secure_filename import os from werkzeug.utils import secure_filenameapp Flask(__name__)# 配置…

Logic-RL:小参数qwen模型复现DeepSeek R1 zero

最近很多参照DeepSeek模型训练推理模型的工作,本文将深入 “Logic-RL: Unleashing LLM Reasoning with Rule-Based Reinforcement Learning” 的论文,该论文提出了一种Rule-Based Reinforcement Learning, Logic-RL框架,旨在提升 LLM 的逻辑推理能力,在qwen2.5-7b-instruct…

CVE-2017-5645(使用 docker 搭建)

介绍: 是一个与 Apache Log4j2 相关的安全漏洞,属于远程代码执行,它可能允许攻击者通过构造恶意的日志信息 在目标系统上执行任意代码 Log4j2 介绍 Log4j2 是 Apache 的一个日志记录工具,属于 Java 应用的日志框架,它是 Log4j 的升级版,性能更好,功能更多.它被广泛的适用于 J…

蓝桥杯备考:特殊01背包问题——》集合subset

我们划分成两个集合,实际上我们只需要看一部分就行了,也就是从集合的所有元素里挑出恰好满足集合总和的一半儿,当然,如果我们的集合总和是奇数的话,我们是无论如何也挑不出刚好一半儿的,因为我们没有小数&a…

C#设计模式Demo——MVC

设计模式Demo——MVC 1.View1.1页面示例1.2View代码1.3修改界面以及代码 2.Model3.Controller4.数据结构5.枚举类型6.工具类6.1缓存信息6.2扩展类. 文件结构图 1.View 1.1页面示例 1.2View代码 using System; using System.Data; using System.Windows.Forms; using MVC模式…

【sql靶场】第18-22关-htpp头部注入保姆级教程

目录 【sql靶场】第18-22关-htpp头部注入保姆级教程 1.回顾知识 1.http头部 2.报错注入 2.第十八关 1.尝试 2.爆出数据库名 3.爆出表名 4.爆出字段 5.爆出账号密码 3.第十九关 4.第二十关 5.第二十一关 6.第二十二关 【sql靶场】第18-22关-htpp头部注入保姆级教程…

LabVIEW棉花穴播器排种自动监测系统

一、项目背景与行业痛点 1. 农业需求驱动 我国棉花主产区,种植面积常年超250万公顷,传统人工播种存在两大核心问题: 效率瓶颈:人均日播种面积不足0.5公顷,难以匹配规模化种植需求; 精度缺陷:人…

【程序人生】成功人生架构图(分层模型)

文章目录 ⭐前言⭐一、根基层——价值观与使命⭐二、支柱层——健康与能量⭐三、驱动层——学习与进化⭐四、网络层——关系系统⭐五、目标层——成就与财富⭐六、顶层——意义与传承⭐外层:调节环——平衡与抗风险⭐思维导图 标题详情作者JosieBook头衔CSDN博客专家…

速通大厂测开

最近26届暑期实习招聘和25届春招已经开始,测开学习圈也有同学拿到offer了 今天分享一位25届秋招圈友快速拿到大厂测开offer的经历,希望对大家有所帮助 我是某211本科生,在去年暑假准备考研的间隙意外收获了某大厂测开实习offer,…

基于Netty实现高性能HTTP反向代理

以下将分步骤实现一个基于Netty的高性能HTTP反向代理,支持动态路由、负载均衡和基础鉴权功能。 1. 项目依赖配置(Maven) 2. 定义路由规则 3. 实现HTTP反向代理服务端 4. 实现反向代理处理器 5. 实现基础鉴权 6. 性能优化策略 连接池管理…

【NLP 37、实践 ⑨ NER 命名实体识别任务 LSTM + CRF 实现】

难过的事情我要反复咀嚼,嚼到它再也不能困扰我半分 —— 25.3.13 数据文件: 通过网盘分享的文件:Ner命名实体识别任务 链接: https://pan.baidu.com/s/1fUiin2um4PCS5i91V9dJFA?pwdyc6u 提取码: yc6u --来自百度网盘超级会员v3的分享 一、配…

再学:函数可见性、特殊函数、修饰符

目录 1.可见性 2.合约特殊函数 constructor && getter 3. receive && fallback 4.view && pure 5.payable 6.自定义函数修饰符 modifier 1.可见性 public:内外部 private:内部 external:外部访问 internal&…

基于Spring Boot的项目申报系统的设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…

Web元件库 ElementUI元件库+后台模板页面(支持Axure9、10、11)

Axure是一款非常强大的原型设计工具,它允许设计师和开发者快速创建高保真原型,以展示应用或网站的设计和功能。通过引入各种元件库,如ElementUI元件库,可以极大地丰富Axure的原型设计能力,使其更加贴近实际开发中的UI组…

孜然SEO静态页面生成系统V1.0

孜然SEO静态页面生成系统,1秒生成上万个不同的静态单页系统,支持URL裂变采集,采集的内容不会重复,因为程序系统自带AI重写算法,AI扩写算法,可视化的蜘蛛池系统让您更清楚的获取到信息! 可插入二…

Blender-MCP服务源码3-插件开发

Blender-MCP服务源码3-插件开发 Blender-MCP服务源码解读-如何进行Blender插件开发 1-核心知识点 1)使用Blender开发框架学习如何进行Blender调试2)学习目标1-移除所有的Blender业务-了解如何MCP到底做了什么?3)学习目标2-模拟MC…

C语言和C++到底有什么关系?

C 读作“C 加加”,是“C Plus Plus”的简称。 顾名思义,C 就是在 C 语言的基础上增加了新特性,玩出了新花样,所以才说“Plus”,就像 Win11 和 Win10、iPhone 15 和 iPhone 15 Pro 的关系。 C 语言是 1972 年由美国贝…

【华三】路由器交换机忘记登入密码或super密码的重启操作

【华三】路由器交换机忘记登入密码或super密码的重启操作 背景步骤跳过认证设备:路由器重启设备翻译说明具体操作 跳过当前系统配置重启设备具体操作 背景 当console口的密码忘记,或者说本地用户的密码忘记,其实这时候是登入不了路由器的&am…

DeepSeek-prompt指令-当DeepSeek答非所问,应该如何准确的表达我们的诉求?

当DeepSeek答非所问,应该如何准确的表达我们的诉求?不同使用场景如何向DeepSeek发问?是否有指令公式? 目录 1、 扮演专家型指令2、 知识蒸馏型指令3、 颗粒度调节型指令4、 时间轴推演型指令5、 极端测试型6、 逆向思维型指令7、…

HOVER:人形机器人的多功能神经网络全身控制器

编辑:陈萍萍的公主一点人工一点智能 HOVER:人形机器人的多功能神经网络全身控制器HOVER通过策略蒸馏和统一命令空间设计,为人形机器人提供了通用、高效的全身控制框架。https://mp.weixin.qq.com/s/R1cw47I4BOi2UfF_m-KzWg 01 介绍 1.1 摘…