3.js - 裁剪场景(多个scence)

news2024/11/27 6:35:21

不给newScence添加background、environment时

在这里插入图片描述

给newScence添加background、environment时

在这里插入图片描述

源码

// @ts-nocheck

// 引入three.js
import * as THREE from 'three'

// 导入轨道控制器
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls'

// 导入lil.gui
import { GUI } from 'three/examples/jsm/libs/lil-gui.module.min.js'

// 导入tween
import * as TWEEN from 'three/examples/jsm/libs/tween.module.js'

// 导入hdr加载器
import { RGBELoader } from 'three/examples/jsm/loaders/RGBELoader.js'

// 导入gltf加载器
import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js'

// 导入draco解码器
import { DRACOLoader } from 'three/examples/jsm/loaders/DRACOLoader.js'

//#region
const scence = new THREE.Scene()

const camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.1, 1000)
camera.position.set(2, 2, 5) // 设置相机位置
camera.lookAt(0, 0, 0)

const renderer = new THREE.WebGLRenderer({
  antialias: true // 开启抗锯齿
})
renderer.setSize(window.innerWidth, window.innerHeight)
document.body.appendChild(renderer.domElement)
//#endregion

//#region
// 添加世界坐标辅助器,红色-X轴; 绿色-Y轴; 蓝色-Z轴
const axesHelper = new THREE.AxesHelper(5)
scence.add(axesHelper)

const controls = new OrbitControls(camera, renderer.domElement)
// 设置带阻尼的惯性
// controls.enableDamping = true
// 设置阻尼系数
controls.dampingFactor = 0.05

//#endregion

// --------------------------------------------------------------
// --------------------------------------------------------------

let rgbeLoader = new RGBELoader()
rgbeLoader.load('../public/assets/texture/Alex_Hart-Nature_Lab_Bones_2k.hdr', envMap => {
  envMap.mapping = THREE.EquirectangularRefractionMapping
  `第一个场景`
  scence.background = envMap
  scence.environment = envMap
  `第二个场景`【可以注掉newScence的background、environment试试,newScence的背景就成了黑色的了】
  newScence.background = envMap
  newScence.environment = envMap
})

`创建环形结的几何体`
new THREE.TorusKnotGeometry(radius, tube, radialSegments, tubularSegments)
	radius:环形(Torus)的半径,即:环形中心到环形表面的距离;这个值越大,环形就越大。
	tube(管半径): 环形上的管道的半径,这个值决定了环形表面的厚度。
	radialSegments(径向分段数):环形沿着其半径的分段数。这个值越大,环形的边缘就越平滑。
	tubularSegments(管分段数):管道沿着其长度的分段数。这个值也影响表面的平滑度,但它是沿着环形的周长方向。

const geometry = new THREE.TorusKnotGeometry(5, 1, 100, 16)
const material = new THREE.MeshPhysicalMaterial({
  side: THREE.DoubleSide
})
const torusKnot = new THREE.Mesh(geometry, material)
scence.add(torusKnot)

// 创建场景
const newScence = new THREE.Scene()
const geometry_1 = new THREE.TorusKnotGeometry(5, 1, 100, 16)
const material_1 = new THREE.MeshBasicMaterial({
  wireframe: true
})
const torusKnot_1 = new THREE.Mesh(geometry_1, material_1)
newScence.add(torusKnot_1)

let params = {
  scissorWidth: window.innerWidth / 2
}

// 每一帧根据控制器更新画面
function animate() {
  // 如果,需要控制器带有阻尼效果,或者自动旋转等效果,就需要加入`controls.update()`
  controls.update()
  // `requestAnimationFrame`:在屏幕渲染下一帧画面时,触发回调函数来执行画面的渲染
  requestAnimationFrame(animate)

  // 渲染
  `启用或禁用裁剪检测,若启用,则,只有在裁剪区域的像色才会受影响`
  renderer.setScissorTest(true)
  
  `
    设置裁剪区域
      0,0:代表的是,裁剪区域的左上角坐标,这意着裁剪区域的起点与渲染目标(通常是canvas)的左上角对齐。
      params.scissorWidth:是裁剪区域的宽度,它决定了裁剪区域在水平方向上的大小。
      window.innerHeight:是裁剪区域的高度,这里使用浏览器窗口的内部高度。
                          意味着,裁剪区域的高度将随浏览器窗口高度的变化而变化,
                          这样能确保,渲染内容能够覆盖整个视窗的垂直高度。
  `
  renderer.setScissor(0, 0, params.scissorWidth, window.innerHeight)
  renderer.render(scence, camera)

  renderer.setScissor(params.scissorWidth, 0, window.innerWidth - params.scissorWidth, window.innerHeight)
  renderer.render(newScence, camera)
  
  renderer.setScissorTest(false)

  // 更新tween
  TWEEN.update()
}
animate()

const gui = new GUI()
gui.add(params, 'scissorWidth', 0, window.innerWidth)


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

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

相关文章

leetcode每日一题-3033. 修改矩阵

题目描述: 解题思路:简单题目,思路非常直接。对列进行遍历,记录下最大值,然后再遍历一遍,把-1替换为最大值。需要注意的是进行列遍历和行遍历是不同的。 官方题解: class Solution { public:v…

工控人最爱的PLC触摸屏一体机,有多香

PLC触摸屏一体机是什么 PLC触摸屏一体机,听起来可能有点技术化,但简单来说,它就是一个集成了可编程逻辑控制器(PLC)和触摸屏的智能设备。这种设备不仅能够执行自动化控制任务,还能实时显示和操作设备状态&a…

作业训练二编程题3. 数的距离差

【问题描述】 给定一组正整数,其中最大值和最小值分别为Max和Min, 其中一个数x到Max和Min的距离差定义为: abs(abs(x-Max)-(x-Min)) 其中abs()为求一个数的绝对值 【输入形式】 包括两行,第一行一个数n,表示第二行有n个正整数…

如何在PD虚拟机中开启系统的嵌套虚拟化功能?pd虚拟机怎么用 Parallels Desktop 19 for Mac

PD虚拟机是一款可以在Mac电脑中运行Windows系统的应用软件。使用 Parallels Desktop for Mac 体验 macOS 和 Windows 的最优性能,解锁强大性能和无缝交互。 在ParallelsDesktop(PD虚拟机)中如何开启系统的嵌套虚拟化功能?下面我们…

新手教学系列——前后端分离API优化版

在之前的文章《Vue 前后端分离开发:懒人必备的API SDK》中,我介绍了通过Object对象自动生成API的方法。然而,之前的代码存在一些冗余之处。今天,我将分享一个改进版本,帮助你更高效地管理API。 改进版API SDK 首先,让我们来看一下改进后的代码: import request from …

华为OD机试 - 来自异国的客人(Java 2024 D卷 100分)

华为OD机试 2024D卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试(JAVA)真题(D卷C卷A卷B卷)》。 刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测…

自动控制:反馈控制

自动控制:反馈控制 反馈控制(Feedback Control)是一种在控制系统中通过测量输出信号,并将其与期望信号进行比较,产生误差信号,再根据误差信号调整输入来达到控制目标的方法。反馈控制是自动控制系统中最常…

C#——使用ini-parser第三方操作ini文件

使用ini-parser第三方操作ini文件 IniParser - 一个轻量级的.NET类库,用于读写INI文件。 安装 在NuGet程序包中下载IniParser第三方 使用IniParser第三方操作Ini文件 读取 // 初始化解析器var parser new FileIniDataParser();// 读取INI文件string iniFilePat…

家里老人能操作的电视直播软件,目前能用的免费看直播的电视软件app,适合电视和手机使用!

2024年许多能看电视直播的软件都不能用了,家里的老人也不会手机投屏,平时什么娱乐都没有了,这真的太不方便了。 很多老人并不喜欢去买一个广电的机顶盒,或者花钱拉有线电视。 现在的电视大多数都是智能电视,所以许多电…

如何在忘记密码的情况下解锁Android手机?

您的 Android 设备密码有助于保护您的数据并防止您的个人信息被滥用。但是,如果您被锁定在Android设备之外怎么办?我们知道忘记您的 Android 手机密码是多么令人沮丧,因为它会导致您的设备和数据无法访问。在本技术指南中,我们将向…

AI微电影制作教程:轻松打造高清小人国画面

AI微电影作为一种新兴的视频内容形式,以其独特的视觉效果和制作技术在各大视频平台上取得了显著的流量表现。 2. AI微电影的特点 2.1 高清画质与流畅动作:AI微电影以其高分辨率和流畅的动作给观众带来优质的视觉体验。 2.2 微缩画面效果:独…

CC2530寄存器编程学习笔记_按键中断

目录 无中断按键 第一步 分析原理图 电路工作原理 第二步 配置寄存器 第一步 配置为通用IO口 第二步 配置为输入 第三步 输入模式选择 按键抖动 中断按键 第一步中断寄存器的配置 上升沿 下降沿 第一步 开启总中断使能 第二步 开启端口中断使能 第三步 开启端口引…

VSCode推荐插件:Copy Class Name快速复制html中的类名

插件地址&#xff1a;https://marketplace.visualstudio.com/items?itemNamemouday.copy-class-name 复制Vue和React中HTML代码的类名&#xff0c;实现快速复制 使用方式&#xff1a; 选中代码&#xff0c;右键复制类名&#xff0c;再粘贴到文件中即可 示例 <div clas…

苹果电脑能玩赛博朋克2077吗 如何在mac上运行赛博朋克2077 crossover能玩什么游戏

各位喜欢赛博朋克风的一定不能错过《赛博朋克2077》。那么《赛博朋克2077》是一款什么样的游戏&#xff1f;《赛博朋克2077》在苹果电脑上可以运行吗&#xff1f;一起来看看介绍吧。 一、《赛博朋克2077》是一款什么样的游戏&#xff1f; 《赛博朋克2077》是一款由CD Projekt …

NVIDIA RTX Remix开源 让AI驱动的经典游戏重制复兴

游戏开发商往往会让激动的粉丝们在游戏发布后等待数年&#xff0c;以获得他们喜爱的游戏的重制版。不过&#xff0c;这个问题可能很快就会成为过去。NVIDIA 宣布其 RTX Remix 工具包将开放源代码&#xff0c;这将为钟情于经典游戏的玩家带来惊喜。 RTX Remix 是 NVIDIA 的修改套…

计算机组成原理学习笔记(一)

计算机组成原理 [类型:: [[计算机基础课程]] ] [来源:: [[B站]] ] [主讲人:: [[咸鱼学长]] ] [评价:: ] [知识点:: [[系统软件]] & [[应用软件]] ] [简单解释:: 管理计算机系统的软件&#xff1b; 按照任务需要编写的程序 ] [问题:: ] [知识点:: [[机器字长]] ] [简单…

外泌体相关基因肝癌临床模型预测——2-3分纯生信文章复现——4.预后相关外泌体基因确定之森林图(3)

内容如下&#xff1a; 1.外泌体和肝癌TCGA数据下载 2.数据格式整理 3.差异表达基因筛选 4.预后相关外泌体基因确定 5.拷贝数变异及突变图谱 6.外泌体基因功能注释 7.LASSO回归筛选外泌体预后模型 8.预后模型验证 9.预后模型鲁棒性分析 10.独立预后因素分析及与临床的…

IT之家最新科技热点 | 小米 AI 研究院开创多模态通用模型

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 目录 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌…

Sentinel-1 Level 1数据处理的详细算法定义(一)

《Sentinel-1 Level 1数据处理的详细算法定义》文档定义和描述了Sentinel-1实现的Level 1处理算法和方程&#xff0c;以便生成Level 1产品。这些算法适用于Sentinel-1的Stripmap、Interferometric Wide-swath (IW)、Extra-wide-swath (EW)和Wave模式。 今天介绍的内容如下&…

运维系列.Nginx配置文件结构功能总结

运维系列 Nginx配置文件结构功能总结 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:https://blog.csdn.net/qq_285…