【ThreeJS Basics 1-6】Camera
文章目录
- Camera 相机
- PerspectiveCamera 透视相机
- 正交相机
- 用鼠标控制相机
- 大幅度转动(可以看到后面)
- 控制组件
- FlyControls 飞行组件控制
- FirstPersonControls 第一人称控制
- PointerLockControls 指针锁定控制
- OrbitControls 轨道控制
- TrackballControls 轨迹球控制
- TransformControls 变换控制组件
- 拖拽组件
- 尝试引入并使用控件:OrbitControls 轨道
- 导入
- DAMPING 阻尼
Camera 相机
以下是几种常见的相机简介
ArrayCamera: 数组相机StereoCamera:双眼相机,可以使用两个相机来渲染场景,类似 VR,以及双人成行的屏幕分开的双人游戏CubeCamera:立方体相机,有 6 个相机,分别渲染 6 个面,ThreeJS 可以用它来渲染环境,贴图,反射,折射阴影OrthographicCamera:正交相机,RTS 游戏,相对于透视相机(透视相机更接近人眼的观察效果)PerspectiveCamera:透视相机
PerspectiveCamera 透视相机
参数如下图所示

第一个参数是视野:建议的值在 45~75

如果视野足够大的话,那么规则的立方体可能被挤压变形,类似这样的效果

第二个参数是:横纵比,一般是画布的长/宽
const sizes = {width: 800,height: 600
}const camera = new THREE.PerspectiveCamera(75, sizes.width / sizes.height, 0.1, 100)
第三个和第四个参数 near 和 far
默认值是
1, 1000,意味着:
任何比近处更近,或者比远处更远的物体,都不会显示出来
选择合适的取值范围,如果远端有山庄,山脉,云朵之类的,可以取合适的值来判断是否渲染它们。
正交相机
正交相机有六个参数,前四个是位置,左右上下,第五个和第六个跟透视相机的参数类似,远近的渲染

const camera = new THREE.OrthographicCamera(-1, 1, 1, -1, 0.1, 100)

上面的形状并不规则,因为渲染的比例不对,我们获取
const aspectRatio = sizes.width / sizes.height
// Camera
// const camera = new THREE.PerspectiveCamera(75, sizes.width / sizes.height)
const camera = new THREE.OrthographicCamera(-1 * aspectRatio, 1 * aspectRatio, 1, -1, 0.1, 100)
- 正交相机不受透视影响,能保证物体形状不因深度而发生变化,适合 2D、UI、地图等场景。
- 乘以 aspectRatio 让视口匹配屏幕比例,确保物体不会在不同设备下发生拉伸变形。
- 如果你需要准确控制几何形状或在屏幕上保持形状固定,正交相机是更好的选择。
用鼠标控制相机
获取坐标位置,并处理坐标值的范围在 [-0.5, 0.5]
/*** Cursor*/
const cursor = {x: 0,y: 0,
}
window.addEventListener('mousemove', (event) => {cursor.x = event.clientX / sizes.width - 0.5cursor.y = event.clientY / sizes.height - 0.5console.log('cursor:>>', cursor)
})
之后再 tick 函数里更改相机的位置
const tick = () => {const elapsedTime = clock.getElapsedTime()// Update objects// mesh.rotation.y = elapsedTimecamera.position.x = cursor.x * 10camera.position.y = cursor.y * 10camera.lookAt(mesh.position )// Renderrenderer.render(scene, camera)// Call tick again on the next framewindow.requestAnimationFrame(tick)
}
但是这里会有奇怪的问题, 似乎 x 轴跟 y 轴的逻辑是反着的

所以改变一下 cursor.y 的值,整体取值负数,这样x,y轴都是反方向的了

或者 x 轴取负数,这样就是类似跟随鼠标的效果

但是这样有个问题:我看不到物体的后面,那么,如何才能看到后面呢?或者说让相机旋转起来
大幅度转动(可以看到后面)
const tick = () => {const elapsedTime = clock.getElapsedTime()// Update objects// mesh.rotation.y = elapsedTimecamera.position.x = Math.sin(cursor.x * Math.PI * 2) * 3camera.position.z = Math.cos(cursor.x * Math.PI * 2) * 3camera.position.y = cursor.y * 5camera.lookAt(mesh.position)// Renderrenderer.render(scene, camera)// Call tick again on the next framewindow.requestAnimationFrame(tick)
}

控制组件
FlyControls 飞行组件控制
演示地址点我: https://threejs.org/examples/#misc_controls_fly
FirstPersonControls 第一人称控制
https://threejs.org/examples/#webgl_geometry_terrain
PointerLockControls 指针锁定控制
https://threejs.org/examples/#misc_controls_pointerlock
OrbitControls 轨道控制
https://threejs.org/examples/#misc_controls_orbit
TrackballControls 轨迹球控制
https://threejs.org/examples/#misc_controls_trackball
TransformControls 变换控制组件
https://threejs.org/examples/#misc_controls_transform

拖拽组件
https://threejs.org/examples/#misc_controls_drag

尝试引入并使用控件:OrbitControls 轨道
导入
OrbitControls 它不在 THREE 这个变量中,需要手动的导入
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls.js'const controls = new OrbitControls(camera, canvas)
两句话,就可以有下图的使用效果了

DAMPING 阻尼
拖拽的时候有些生涩,加入阻尼之后,会有一定的加速度

但是会有些奇怪,因为需要再每一帧上更新控件才能正常的显现,在 tick 函数中添加更新 controls.update()

相关文章:
【ThreeJS Basics 1-6】Camera
文章目录 Camera 相机PerspectiveCamera 透视相机正交相机用鼠标控制相机大幅度转动(可以看到后面) 控制组件FlyControls 飞行组件控制FirstPersonControls 第一人称控制PointerLockControls 指针锁定控制OrbitControls 轨道控制TrackballControls 轨迹球…...
SpringBoot-模拟SSE对话交互
SpringBoot-模拟SSE对话交互 后端使用SSE进行会话,前端使用Html模拟大模型的问答交互->【前端】【后端】 1-学习目的 本项目代码仓库:https://gitee.com/enzoism/springboot_sse 1-核心知识点 1)什么是SSE协议->客户端发起一次请求&am…...
删除链表的倒数第N个节点 力扣19
一、题目 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。 示例 1: 输入:head [1,2,3,4,5], n 2 输出:[1,2,3,5]示例 2: 输入:head [1], n 1 输出:[]示例 3&a…...
IvorySQL v4 逻辑复制槽同步功能解析:高可用场景下的数据连续性保障
功能简介 IvorySQL v4 基于 PostgreSQL 17,引入了逻辑复制槽同步至热备份数据库的功能。这一改进有效解决了旧版本中主数据库与备份数据库切换后逻辑复制中断的问题。对于那些追求数据高可用性和业务连续性的数据库来说,这无疑是一个重大的利好消息。它…...
vxe-table开启表尾和el-collapse-transition不兼容,动画卡顿
调用控制台 发现是el-collapse-transition内置的计算高度函数计算的高度总是会高一点 直接放弃使用el-collapse-transition 使用下面的div包裹住vxe-table 我的table是渲染出来的会有多个 <el-button click"group.messShow !group.messShow" type"text&q…...
康谋分享 | 3DGS:革新自动驾驶仿真场景重建的关键技术
随着自动驾驶技术的迅猛发展,构建高保真、动态的仿真场景成为了行业的迫切需求。传统的三维重建方法在处理复杂场景时常常面临效率和精度的挑战。在此背景下,3D高斯点阵渲染(3DGS)技术应运而生,成为自动驾驶仿真场景重…...
golang学习笔记——go语言安装及系统环境变量设置
文章目录 go语言安装go envgo getgoproxy测试安装 Go 插件安装 Go 插件依赖工具参考资料用户环境变量和系统环境变量用户环境变量系统环境变量示例设置环境变量的步骤设置用户环境变量设置系统环境变量 验证环境变量总结 2024年最火的5大Go框架1. Gin:高并发接口的“…...
Redis|集群 Cluster
文章目录 是什么能干嘛集群算法-分片-槽位slotredis集群的槽位slotredis集群的分片分片槽位的优势slot槽位映射——业界的3种解决方案小厂:哈希取余分区中厂:一致性哈希算法分区大厂:哈希槽分区 面试题:为什么 Redis 集群的最大槽…...
解锁MacOS开发:环境配置与应用开发全攻略
✨✨✨这里是小韩学长yyds的BLOG(喜欢作者的点个关注吧) ✨✨✨想要了解更多内容可以访问我的主页 小韩学长yyds-CSDN博客 目录 引言 一、MacOS 开发环境配置 (一)必备工具安装 (二)集成开发环境(IDE)选…...
如何通过卷积神经网络(CNN)有效地提取图像的局部特征,并在CIFAR-10数据集上实现高精度的分类?
目录 1. CNN 提取图像局部特征的原理 2. 在 CIFAR - 10 数据集上实现高精度分类的步骤 2.1 数据准备 2.2 构建 CNN 模型 2.3 定义损失函数和优化器 2.4 训练模型 2.5 测试模型 3. 提高分类精度的技巧 卷积神经网络(Convolutional Neural Network, CNN&#…...
监听 RabbitMQ 延时交换机的消息数、OpenFeign 路径参数传入斜杠无法正确转义
背景 【MQ】一套为海量消息和高并发热点消息,提供高可用精准延时服务的解决方案 我现在有一个需求,就是监听 RabbitMQ 一个延时交换机的消息数,而 RabbitTemplate 是不存在对应的方法来获取的。 而我们在 RabbitMQ 的控制台却可以发现延时交…...
希音(Shein)前端开发面试题集锦和参考答案
用 Node 写过什么工具或 npm 包 在实际开发中,使用 Node 编写过多种实用工具和 npm 包。 自动化构建工具 开发了一个简单的自动化构建工具,用于处理前端项目的资源压缩和合并。在前端项目中,为了优化性能,需要对 CSS 和 JavaScript 文件进行压缩,减少文件体积,同时将多个…...
python全栈-Linux基础
python全栈-Linux基础 文章目录 Linux安装/配置网络配置配置Linux远程登录配置虚拟机内部ip配置真机的ip安装XShell和Xftp目录结构用户和用户组用户管理添加用户useradd查看用户id修改用户usermod (选项)(参数)用户密码设置passed (选项)(参数)删除用户userdel [选项] 用户名 用…...
DeepSeek R1助力,腾讯AI代码助手解锁音乐创作新
目录 1. DeepSeekR1模型简介2. 歌词创作流程2.1 准备工作2.2 歌词生成技巧 3. 音乐制作环节3.1 主流AI音乐生成平台 4. 歌曲欣赏5. 总结展望 1. DeepSeekR1模型简介 腾讯AI代码助手最新推出的DeepSeekR1模型不仅在代码生成方面表现出色,其强大的自然语言处理能力也…...
Git安装与配置
安装部分: Windows:下载官网安装包,双击安装,路径选择(注意是否修改),安装选项(是否勾选某些选项,如提到安装时更换编辑器为Nano)。Linux:通过包管…...
【Linux】自定协议和序列化与反序列化
目录 一、序列化与反序列化概念 二、自定协议实现一个加法网络计算器 (一)TCP如何保证接收方的接收到数据是完整性呢? (二)自定义协议 (三)自定义协议的实现 1、基础类 2、序列化与反序列…...
C++基础系列【19】运算符重载
博主介绍:程序喵大人 35- 资深C/C/Rust/Android/iOS客户端开发10年大厂工作经验嵌入式/人工智能/自动驾驶/音视频/游戏开发入门级选手《C20高级编程》《C23高级编程》等多本书籍著译者更多原创精品文章,首发gzh,见文末👇…...
Python-04BeautifulSoup网络爬虫
2025-03-04-BeautifulSoup网络爬虫 记录BeautifulSoup网络爬虫的核心知识点 文章目录 2025-03-04-BeautifulSoup网络爬虫 [toc]1-参考网址2-学习要点3-核心知识点1. 安装2. 导入必要的库3. 发送 HTTP 请求4. 创建 BeautifulSoup 对象5. 解析 HTML 内容5.1 查找标签5.2 根据属性…...
芯科科技通过全新并发多协议SoC重新定义智能家居连接
MG26系列SoC现已全面供货,为开发人员提供最高性能和人工智能/机器学习功能 致力于以安全、智能无线连接技术,建立更互联世界的全球领导厂商Silicon Labs(亦称“芯科科技”,NASDAQ:SLAB),日前宣…...
python-leetcode-零钱兑换 II
518. 零钱兑换 II - 力扣(LeetCode) 这个问题是 完全背包问题 的一个变体,可以使用 动态规划 来解决。我们定义 dp[i] 为凑成金额 i 的硬币组合数。 思路: 定义 DP 数组 设 dp[i] 表示凑成金额 i 的组合数,初始化 dp[…...
STC32G单片机开发实战:GPIO模式配置与寄存器详解
1. STC32G单片机GPIO基础认知 第一次拿到STC32G开发板时,我习惯性地想用STM32那套HAL库来操作GPIO,结果发现根本行不通。这就像拿着汽车钥匙去开保险箱,虽然都是"开锁",但机制完全不同。STC32G作为增强型8051架构单片机…...
STM32定时器中断配置详解:从时钟树到回调函数,一次搞懂ARR和PSC怎么算
STM32定时器中断配置详解:从时钟树到回调函数,一次搞懂ARR和PSC怎么算 在嵌入式开发中,定时器是最基础也最强大的外设之一。很多开发者虽然能够通过复制代码让定时器工作,但对于如何精确控制定时周期、理解时钟信号的传递路径以及…...
深入解析OpenWrt启动流程:从Bootloader到procd的完整指南
1. 项目概述与核心价值搞OpenWrt开发,尤其是涉及到系统定制、驱动适配或者故障排查,你迟早会碰到一个绕不开的核心问题:这玩意儿到底是怎么启动的?很多人可能觉得,启动流程嘛,不就是上电、加载内核、跑起来…...
基于RP2040与CircuitPython的复古电话点歌系统:从矩阵键盘到音频播放
1. 项目概述:当复古电话遇见现代微控制器几年前,我在一个旧货市场淘到了一台成色还不错的Western Electric 2500DM电话机。这种经典的按键式电话,拿在手里沉甸甸的,听筒里仿佛还残留着上个世纪的通话声。当时我就在想,…...
用STM32G431RBT6复刻一个简易示波器+信号发生器:蓝桥杯嵌入式外设综合应用实战
基于STM32G431RBT6的嵌入式示波器与信号发生器开发实战 在嵌入式系统开发领域,将理论知识转化为实际应用能力是每个工程师成长的必经之路。本文将带你使用STM32G431RBT6开发板,从零开始构建一个兼具示波器和信号发生器功能的综合系统。这个项目不仅能够…...
对比直接使用厂商 API 观察 Taotoken 在用量与成本可视化方面的优势
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 对比直接使用厂商 API 观察 Taotoken 在用量与成本可视化方面的优势 效果展示类,从个人开发者视角出发,分享…...
AI视频时间一致性失效的7种隐藏诱因(GPU显存碎片化、隐空间梯度漂移、跨模态时钟不同步…业内首次系统归因)
更多请点击: https://intelliparadigm.com 第一章:AI视频时间一致性失效的系统性归因框架 AI视频生成中,时间一致性失效并非孤立现象,而是多层级模型组件、训练范式与推理机制耦合失配的结果。其根源横跨数据建模、特征传播、时序…...
FreeRTOS优先级设置踩坑实录:为什么你的高优先级任务跑不起来?
FreeRTOS优先级设置实战指南:从原理到调试的完整解决方案 当你第一次在FreeRTOS中创建多个任务并设置不同优先级时,可能会遇到一个令人困惑的现象:明明设置了高优先级任务,但系统运行时低优先级任务却先执行。这种情况在从其他RT…...
通俗易懂的C++前缀和与差分算法图文示例详解
1、前缀和 前缀和是指某序列的前n项和,可以把它理解为数学上的数列的前n项和,而差分可以看成前缀和的逆运算。合理的使用前缀和与差分,可以将某些复杂的问题简单化。 2、前缀和算法有什么好处? 先来了解这样一个问题:…...
MindStudio组合技,让Host Bound问题看得见、调得准
背景介绍:Host Bound问题在NPU训练和推理场景中,Host侧(CPU)的任务下发(如算子调度、内存分配)与Device侧(NPU)的任务执行是异步进行的。当Host侧任务下发耗时超过Device侧任务执行耗…...
