有没有想过,游戏里的镜子、传送门、或者屏幕上播放的实时3D动画是怎么实现的?

答案就是一项黑科技——渲染目标(Render Targets)。它允许我们不直接渲染到屏幕,而是“偷偷地”渲染到一张幕后的贴图上,然后再把这张包含了另一个世界画面的贴图,应用到我们主场景的任意物体上。


🖼️ 核心思想:先画到“小画板”上

这个概念听起来很绕,我们用一个简单的比喻来理解:

想象一下,你不是直接在房间的墙壁上作画,而是:

  1. 先拿出一块小画板(这就是 WebGLRenderTarget)。
  2. 在这块小画板上,精心画了一幅动态的画(比如一个独立旋转的3D物体)。
  3. 最后,你把这块已经画好了动态内容的小画板,像一张照片一样,挂到墙上(应用为主场景里某个物体的贴图)。

于是,你就实现了“画中画”的神奇效果!

✨ 无穷的可能性

掌握了这项技术,你就能解锁无数种高级特效:

  • 实时监控画面 📹: 在一面墙上显示另一个房间的实时3D影像。
  • 神奇的传送门 🌀: 门的那一头是另一个动态的世界。
  • 车内后视镜 🚗: 镜子里实时反射出身后的场景。
  • 后期处理滤镜 🎞️: 实现电影级别的调色、模糊、辉光等屏幕特效。

🛠️ 盗梦空间:完整代码

下面的代码将完整演示这个“盗梦空间”的过程:我们将创建一个主场景,里面有一个立方体;同时,我们还会创建另一个独立的“内部”场景,里面有一个旋转的环面纽结。然后,我们会把“内部”场景实时渲染的结果,作为贴图应用到主场景的立方体上。

代码亮点

  • 创建了 mainScene 和 rtScene (Render Target Scene) 两个独立的场景。
  • 在动画循环中,通过 renderer.setRenderTarget() 来回切换渲染目标,实现“先画到小画板,再画到主屏幕”的流程。

<!-- end list -->

HTML

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Three.js Render Targets</title><style>body { margin: 0; }canvas { display: block; }</style>
</head>
<body><script type="importmap">{"imports": {"three": "https://unpkg.com/three@0.165.0/build/three.module.js","three/addons/": "https://unpkg.com/three@0.165.0/examples/jsm/"}}</script><script type="module">import * as THREE from 'three';import { OrbitControls } from 'three/addons/controls/OrbitControls.js';// 1. 主场景设置const mainScene = new THREE.Scene();mainScene.background = new THREE.Color(0x333333);const mainCamera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 100);mainCamera.position.z = 5;const renderer = new THREE.WebGLRenderer({ antialias: true });renderer.setSize(window.innerWidth, window.innerHeight);document.body.appendChild(renderer.domElement);new OrbitControls(mainCamera, renderer.domElement);// 2. 创建一个 Render Target (我们的小画板)const rt = new THREE.WebGLRenderTarget(512, 512);// 3. 创建 "内部" 场景 (画板上的内容)const rtScene = new THREE.Scene();rtScene.background = new THREE.Color(0x87CEEB);const rtCamera = new THREE.PerspectiveCamera(75, 1, 0.1, 100); // 宽高比为1,匹配RT尺寸rtCamera.position.z = 3;// 为内部场景添加自己的灯光和物体rtScene.add(new THREE.AmbientLight(0xffffff, 0.5));rtScene.add(new THREE.DirectionalLight(0xffffff, 1));const rtKnot = new THREE.Mesh(new THREE.TorusKnotGeometry(1, 0.3, 100, 16),new THREE.MeshStandardMaterial({ color: 0xff0088, roughness: 0.2 }));rtScene.add(rtKnot);// 4. 在主场景创建一个立方体,并使用Render Target的纹理const cubeMaterial = new THREE.MeshBasicMaterial({ map: rt.texture });const mainCube = new THREE.Mesh(new THREE.BoxGeometry(2, 2, 2), cubeMaterial);mainScene.add(mainCube);// 5. 动画循环function animate(time) {time *= 0.001;// 让两个场景的物体都动起来rtKnot.rotation.x = time;rtKnot.rotation.y = time;mainCube.rotation.x = -time * 0.2;mainCube.rotation.y = -time * 0.2;// 关键步骤:先渲染到 Render Targetrenderer.setRenderTarget(rt);renderer.render(rtScene, rtCamera);// 然后再渲染到主屏幕renderer.setRenderTarget(null);renderer.render(mainScene, mainCamera);requestAnimationFrame(animate);}animate();</script>
</body>
</html>
🎬 “盒中世界”诞生

打开页面,你会看到一个正在旋转的立方体。但神奇的是,立方体的表面并非纯色或普通贴图,而是一个实时播放的、完全不同的3D动画(一个旋转的彩色纽结)!

你正在从主世界,窥探一个被实时渲染出来的“盒中世界”。


渲染目标是Three.js中一个从“会用”到“精通”的分水岭。它将渲染过程本身变成了创造工具,是实现高级视觉特效的基础。掌握了它,你的创意将不再受限于单一的场景!

#ThreeJS #特效 #渲染 #WebGPU #Shader #游戏开发 #前端开发 #JavaScript #技术干货

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

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

相关文章

浅析一种基于深度学习算法的维吾尔文OCR技术的实现原理及其应用场景

维吾尔文OCR技术是一种基于人工智能和深度学习技术的维吾尔文光学字符识别工具&#xff0c;能够快速、准确地将印刷体或手写体维吾尔文转换为可编辑、可搜索的数字化文本。该技术适用于政府、教育、出版、金融等多个行业&#xff0c;助力维吾尔文信息的高效处理与智能化管理。 …

如何使用MQTTX软件来进行MQTT协议的测试

下载MQTTX软件 下载地址及说明文档开始使用 - MQTTX 文档,比较详细 为什么使用MQTTX 何时要使用MQTTX软件呢&#xff1f;用来检测物联网模块上云的数据就很方便&#xff0c;当然云上如果有日志系统的话也是可以用的。 物联网模块&#xff0c;以利尔达模块为例 NT26-KCN系列…

ELK 和 OpenShift 中的 EFK

ELK 和 OpenShift 中的 EFK 确实是同类日志解决方案的不同实现&#xff0c;核心功能相似但组件略有差异。以下是详细对比和解释&#xff1a; 1. ELK vs EFK&#xff1a;核心区别 组件ELK 栈EFK 栈&#xff08;OpenShift 默认&#xff09;日志收集Logstash&#xff08;Java 实现…

Python UDP Socket 实时在线刷卡扫码POS消费机门禁控制服务端示例源码

本示例使用的设备&#xff1a;https://item.taobao.com/item.htm?spma21dvs.23580594.0.0.1d292c1bk8Qc9r&ftt&id17021194999 一、服务端绑定IP开启UDP端口接收消费机提交的请求 import sys import os import socket import time import datetimeIpList[] if sys.pl…

对于高考边界的理解以及未来就业层级的学习与思考

目录 一、2024年高考全国多少考生&#xff0c;文化课&#xff0c;文科理科&#xff0c;分别总分多少分&#xff1f;清北得多少分能上&#xff1f;二、1342万人里面&#xff0c;有多少人能上清北&#xff0c;多少能上985&#xff0c;多少能上211&#xff0c;多少能上二本&#x…

JVM调优实战 Day 4:JVM类加载机制

【JVM调优实战 Day 4】JVM类加载机制 文章内容 在Java虚拟机&#xff08;JVM&#xff09;的运行过程中&#xff0c;类加载机制是整个程序启动和运行的基础。它决定了Java类是如何被动态加载到JVM中&#xff0c;并为后续的字节码执行做好准备。理解JVM类加载机制不仅有助于我们…

R 语言中的判断语句

R 语言中的判断语句 在R语言编程中&#xff0c;判断语句是执行条件逻辑的基础。它们允许程序根据特定的条件执行不同的代码块。本文将深入探讨R语言中的几种常见判断语句&#xff0c;包括if语句、if-else语句和switch语句&#xff0c;并探讨它们的用法和场景。 1. if语句 if…

从设备自动化到智能管控:MES如何赋能牛奶饮料行业高效生产?

万界星空科技全新推出的&#xff1a;新一代智能化MES系统&#xff0c;深度融合AI大数据技术&#xff0c;实现生产全流程可视化、智能排产、实时质量追溯与设备互联&#xff0c;助力企业降本增效30%。 现开放免费试用名额&#xff0c;体验智能化生产管理的高效与便捷&#xff01…

TDengine 技术参数配置大全

1. 背景 TDengine 的 taos.cfg 中配置项及使用 SQL 命令 alter 修改的系统变量之间的关系如何&#xff0c;哪些是持久存储项&#xff0c;哪些设置是临时项&#xff0c;这章将详细说明。 本文是技术参考资料&#xff0c;请收藏。 2.定义 1. 全局配置参数 全局配置参数&#…

无人机神经网络模块运行与技术难点

一、神经网络模块的运行方式 1. 分层处理架构 感知层 多模态数据融合&#xff1a;通过八元数卷积网络&#xff08;OCNN&#xff09;统一处理LiDAR、摄像头、IMU等异构传感器数据&#xff0c;将点云坐标&#xff08;x/y/z&#xff09;、图像RGB与光流信息编码至8维虚部&#…

前端react框架实现打包时间动态加入配置展示在指定页面

注意&#xff1a; 当前方法特定为 create-react-app 构建框架&#xff0c;其他的构建流程不同&#xff0c;不能直接照搬 react-scripts 的方式。 ✅ 目标&#xff1a; 在 React 打包&#xff08;build&#xff09;时&#xff0c;自动将当前时间写入代码中某个变量或 console…

原子操作(CAS)

原子操作 原子操作原理什么是原子操作&#xff1f;原子性原子变量相关接口内存序 shared_ptr的实现 原子操作原理 什么是原子操作&#xff1f; 原子操作其实就是指在多线程的环境下&#xff0c;确保对共享变量的操作不会被干扰&#xff0c;从而避免了竞态条件。 我们都知道&…

马克思主义基本原理期末复习下

二十、资本的原始积累 所谓资本原始积累&#xff0c;就是以暴力手段使生产者与生产资料分离资本快速集中于少数人手中&#xff0c;资本主义得以快速发展的历史过程。具体过程其一&#xff0c;用暴力手段夺取农民的土地&#xff0c;如英国圈地运动在国外建立殖民地&#xff0c;…

体育数据api接口,足球api篮球api电竞api,比赛赛事数据api

在体育行业&#xff0c;数据驱动一切&#xff0c;从内容分发到竞猜预测&#xff0c;从用户互动到商业变现&#xff0c;背后少不了一个关键词&#xff1a;数据接口&#xff08;API&#xff09;。无论是实时比分、比赛事件、历史统计&#xff0c;还是球员详情、战绩排名&#xff…

Harmony 状态监听 @Monitor和@Computed

Monitor与Computed装饰器在ArkUI状态管理中的协同应用 一、装饰器概述 1. Monitor装饰器 Monitor是ArkUI状态管理V2中的核心装饰器&#xff0c;用于深度监听状态变量的修改&#xff1a; 支持监听嵌套类属性、多维数组项和对象数组中的指定项变化能够获取变化前后的值进行比…

同济大学多模态感知具身导航全面综述

作者&#xff1a; I-Tak Ieong, Hao Tang 单位&#xff1a;同济大学计算机学院&#xff0c;北京大学计算机学院 论文标题&#xff1a; Multimodal Perception for Goal-oriented Navigation: A Survey 论文链接&#xff1a;https://arxiv.org/pdf/2504.15643 主要贡献 基于…

2025年CCF先进音频技术竞赛

由中国计算机学会主办、CCF语音对话与听觉专委会承办、语音之家协办、华为终端有限公司赞助的CCF先进音频技术大赛正式启动。大赛旨在推动国内高等院校及科研院所在音频技术领域的专业人才培养&#xff0c;支持学生科技创新&#xff0c;选拔优秀人才。 赛事官网&#xff1a;ht…

手撕线程池

线程池的目的&#xff1a; 1.复用线程&#xff0c;减少频繁创建和销毁的开销 创建和销毁线程是昂贵的系统操作&#xff0c;涉及内核调度、内存分配&#xff1b; 使用线程池预先创建一批线程&#xff0c;在多个任务间循环复用&#xff0c;避免资源浪费&#xff0c;提高性能。 …

3DTiles三维模型

1. 3DTiles 介绍​ 2016 年&#xff0c;Cesium 团队借鉴传统 2DGIS 的地图规范&#xff1a;WMTS&#xff0c;借鉴图形学中的层次细节模型&#xff0c;打造出大规模的三维数据标准&#xff1a;3d-Tiles&#xff0c;中文译名&#xff1a;三维瓦片。 它在模型上利用了 gltf 渲染…

Golang Kratos 系列:业务分层的若干思考(一)

在使用 Kratos 框架开发云服务的过程中&#xff0c;渐渐理解和感受到“领域层”这个概念和抽象的强大之处&#xff0c;它可以将业务和存储细节解耦、将业务和开发初期频繁变更的API结构&#xff0c;让Mock单元测试变得更加容易、对细节的变化更鲁棒。让业务代码摆脱技术细节依赖…