【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[…...
label-studio的使用教程(导入本地路径)
文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...
【入坑系列】TiDB 强制索引在不同库下不生效问题
文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...
基于Flask实现的医疗保险欺诈识别监测模型
基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施,由雇主和个人按一定比例缴纳保险费,建立社会医疗保险基金,支付雇员医疗费用的一种医疗保险制度, 它是促进社会文明和进步的…...
高频面试之3Zookeeper
高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个?3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制(过半机制࿰…...
cf2117E
原题链接:https://codeforces.com/contest/2117/problem/E 题目背景: 给定两个数组a,b,可以执行多次以下操作:选择 i (1 < i < n - 1),并设置 或,也可以在执行上述操作前执行一次删除任意 和 。求…...
IT供电系统绝缘监测及故障定位解决方案
随着新能源的快速发展,光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域,IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选,但在长期运行中,例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...
OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 在 GPU 上对图像执行 均值漂移滤波(Mean Shift Filtering),用于图像分割或平滑处理。 该函数将输入图像中的…...
深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用
文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么?1.1.2 感知机的工作原理 1.2 感知机的简单应用:基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...
Linux nano命令的基本使用
参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时,显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...
android13 app的触摸问题定位分析流程
一、知识点 一般来说,触摸问题都是app层面出问题,我们可以在ViewRootImpl.java添加log的方式定位;如果是touchableRegion的计算问题,就会相对比较麻烦了,需要通过adb shell dumpsys input > input.log指令,且通过打印堆栈的方式,逐步定位问题,并找到修改方案。 问题…...
