Babylon.js学习之路《四、Babylon.js 中的相机(Camera)与视角控制》
文章目录
- 1. 引言:为什么相机是 3D 场景的“眼睛”?
- 1.1 相机的核心作用
- 1.2 常见相机类型概览
- 2. 相机基础参数解析
- 2.1 通用属性
- 2.2 相机坐标系
- 3. 详解常用相机类型
- 3.1 自由相机(FreeCamera)
- 3.2 弧形旋转相机(ArcRotateCamera)
- 3.3 跟随相机(FollowCamera)
- 3.4 其他相机类型(快速概览)
- 4. 视角交互实战技巧
- 4.1 多相机切换
- 4.2 自定义输入控制
- 4.3 相机动画与过渡
- 5. 相机性能优化与调试
- 5.1 视锥剔除(Frustum Culling)
- 5.2 避免过度绘制
- 5.3 使用调试工具
- 6. 实战任务
- 任务 1:构建可切换的相机系统
- 任务 2:实现“物体聚焦”功能
- 7. 常见问题解答
- 8. 总结与下一章预告
- 8.1 关键知识点回顾
- 8.2 下一章预告
1. 引言:为什么相机是 3D 场景的“眼睛”?
- 上一章简单介绍了场景中如何添加标准形状的物体,并且介绍了如何调整物体属性,包括位置、旋转、缩放,以及父级关系的设置。
- 这一章详细介绍一下Babylon中,相机相关的知识。涵盖相机类型、交互配置及实战技巧。
1.1 相机的核心作用
- 定义用户视角:观察场景的位置、方向、视野范围。
- 交互基础:通过鼠标/键盘/触控控制视角移动。
1.2 常见相机类型概览
- 自由相机(
FreeCamera
) - 弧形旋转相机(
ArcRotateCamera
) - 跟随相机(
FollowCamera
) - 第一人称相机(
UniversalCamera
)
2. 相机基础参数解析
2.1 通用属性
- 位置(Position):
camera.position = new BABYLON.Vector3(x, y, z)
。 - 目标(Target):
camera.setTarget(new BABYLON.Vector3(x, y, z))
。 - 视野(FOV):
camera.fov = 0.8
(弧度制,影响广角效果)。 - 近裁面与远裁面(Clipping Planes):
camera.minZ = 0.1; // 近裁面(避免渲染过近物体)camera.maxZ = 1000; // 远裁面(避免渲染过远物体)
2.2 相机坐标系
- 局部坐标系:相机的移动方向基于自身朝向。
- 世界坐标系:相机的移动方向基于全局坐标轴。
3. 详解常用相机类型
3.1 自由相机(FreeCamera)
- 特点:类似第一人称射击游戏的自由移动视角。
- 代码创建:
const camera = new BABYLON.FreeCamera("freeCamera", new BABYLON.Vector3(0, 5, -10), scene);camera.setTarget(BABYLON.Vector3.Zero());
- 控制配置:
- 键盘移动:默认 WASD 控制前后左右,QE 控制升降。
- 鼠标控制视角:
camera.attachControl(canvas, true)
。 - 灵敏度调整:
camera.speed = 0.5; // 移动速度camera.angularSensibility = 2000; // 鼠标灵敏度(值越大越迟钝)
3.2 弧形旋转相机(ArcRotateCamera)
- 特点:围绕目标点旋转、缩放,适合展示物体。
- 代码创建:
const camera = new BABYLON.ArcRotateCamera("arcCam", alpha, beta, radius, // 初始角度(弧度)、半径target, // 目标点(Vector3)scene);camera.attachControl(canvas, true);
- 关键参数:
- 限制旋转角度:
camera.lowerBetaLimit = 0.1; camera.upperBetaLimit = Math.PI/2
。 - 限制缩放范围:
camera.lowerRadiusLimit = 5; camera.upRadiusLimit = 20
。
- 限制旋转角度:
- 交互优化:
- 启用惯性效果:
camera.inertia = 0.9
(拖拽后平滑停止)。
- 启用惯性效果:
3.3 跟随相机(FollowCamera)
- 特点:跟随某个物体移动,适合角色扮演游戏。
- 代码创建:
const camera = new BABYLON.FollowCamera("followCam", new BABYLON.Vector3(0, 5, -10), // 初始位置scene);camera.radius = 10; // 跟随距离camera.heightOffset = 2; // 垂直偏移camera.lockedTarget = playerMesh; // 绑定目标物体
3.4 其他相机类型(快速概览)
- 第一人称相机(UniversalCamera):针对移动端优化的自由相机。
- VR 设备相机(WebXRCamera):通过 WebXR 支持 VR 头显。
4. 视角交互实战技巧
4.1 多相机切换
- 代码示例:
const camera1 = new BABYLON.FreeCamera(...);const camera2 = new BABYLON.ArcRotateCamera(...);scene.activeCamera = camera1; // 切换活动相机
4.2 自定义输入控制
- 覆盖默认按键事件:
camera.keysUp = [87]; // W 键前进camera.keysDown = [83]; // S 键后退camera.keysLeft = [65]; // A 键左移camera.keysRight = [68]; // D 键右移
- 添加鼠标滚轮缩放(适用于
ArcRotateCamera
):
camera.wheelPrecision = 50; // 滚轮灵敏度
4.3 相机动画与过渡
- 平滑移动相机到新位置:
BABYLON.Animation.CreateAndStartAnimation("camMove", camera, "position",30, 120, // 帧率、总帧数camera.position, // 起始位置new BABYLON.Vector3(10, 5, 0), // 目标位置BABYLON.Animation.ANIMATIONLOOPMODE_CONSTANT);
5. 相机性能优化与调试
5.1 视锥剔除(Frustum Culling)
- 原理:只渲染相机视野内的物体。
- Babylon.js 默认启用,可通过
mesh.isVisible = false
手动控制。
5.2 避免过度绘制
- 调整
maxZ
值,减少远处物体渲染。
5.3 使用调试工具
- 显示相机视锥:
camera.showFrustum = true; // 显示视锥线框
- 实时调试参数:通过
scene.debugLayer
调整相机属性。
6. 实战任务
任务 1:构建可切换的相机系统
- 场景中放置两个相机:自由相机(默认)和弧形旋转相机。
- 按空格键切换相机,并添加过渡动画。
任务 2:实现“物体聚焦”功能
- 点击场景中的物体,弧形旋转相机自动对准该物体并调整距离。
mesh.actionManager = new BABYLON.ActionManager(scene);mesh.actionManager.registerAction(new BABYLON.ExecuteCodeAction(BABYLON.ActionManager.OnPickTrigger,() => {arcCamera.setTarget(mesh.position);arcCamera.radius = mesh.getBoundingInfo().diagonalLength * 2;}));
7. 常见问题解答
- Q1:相机看不到物体?
- 检查相机位置与目标点是否在物体附近。
- 确认物体的位置未被其他物体遮挡。
- Q2:移动端触控不灵敏?
- 调整
angularSensibility
和wheelPrecision
。 - 使用
UniversalCamera
替代FreeCamera
。
- 调整
8. 总结与下一章预告
8.1 关键知识点回顾
- 自由相机、弧形旋转相机的适用场景与控制优化。
- 多相机切换与自定义交互逻辑。
8.2 下一章预告
- 《灯光与阴影:让场景栩栩如生的关键》:学习点光源、方向光与阴影渲染技术。
相关文章:

Babylon.js学习之路《四、Babylon.js 中的相机(Camera)与视角控制》
文章目录 1. 引言:为什么相机是 3D 场景的“眼睛”?1.1 相机的核心作用1.2 常见相机类型概览 2. 相机基础参数解析2.1 通用属性2.2 相机坐标系 3. 详解常用相机类型3.1 自由相机(FreeCamera)3.2 弧形旋转相机(ArcRotat…...

【Redis实战篇】秒杀优化
1. 秒杀优化-异步秒杀思路 我们来回顾一下下单流程 当用户发起请求,此时会请求nginx,nginx会访问到tomcat,而tomcat中的程序,会进行串行操作,分成如下几个步骤 1、查询优惠卷 2、判断秒杀库存是否足够 3、查询订单…...
RHCE认证通过率
红帽RHCE考试总体通过率38%(2023年数据),细分数据显示自学者通过率18%,参加官方培训者47%,企业团体考生53%。通过率差异由备考资源和考试策略决定。 RHCE考试重点考Ansible自动化运维,需在3.5小时内完成12…...
外贸礼品禁忌
一、亚洲 1.印度 牛是神圣动物,别送牛皮制品。另外,左手不洁,送礼得用右手或双手。 2.日本 “梳” 和 “苦” 谐音,不送梳子。日本男性不咋佩戴首饰,除结婚戒指。礼物得装盒、纸包、绳饰,白色包装得有…...

Trae IDE:AI深度集成的智能开发环境
(以高效人机协作重塑编程体验) 概述 Trae IDE(发音 /treɪ/)是一款深度集成AI能力的现代化开发工具,结合传统IDE的完备功能与前沿AI技术,提供智能问答、代码自动补全、跨文件编程及AI Agent驱动的自动化开…...

【大模型】AI智能体Coze 知识库从使用到实战详解
目录 一、前言 二、知识库介绍 2.1 coze 知识库功能介绍 2.2 coze 知识库应用场景 2.3 coze 知识库类型 2.4 coze 知识库权限说明 2.5 coze 知识库与记忆对比 2.6 知识库的使用流程 三、知识库创建与使用 3.1 创建知识库入口 3.2 创建文本知识库 3.2.1 上传文件 3.…...

【springcloud学习(dalston.sr1)】服务消费者通过restTemplate来访问服务提供者(含源代码)(五)
该系列项目整体介绍及源代码请参照前面写的一篇文章【springcloud学习(dalston.sr1)】项目整体介绍(含源代码)(一) 一般情况下,我们远程调用服务,可以用restTemplate来进行http请求的访问。接…...

打破边界,智评未来:AI如何重塑学科交叉融合的评价体系?
目录: 引言:当“学科孤岛”遇上“创新浪潮”透视现状:学科交叉融合的“热望”与“冰壁”他山之石:国际交叉融合模式与评价的“镜与灯”AI赋能:重构学科交叉评价的内涵、要素与方法论 4.1. 基本内涵:从“知识叠加”到“价值涌现”4.2. 评价要素:超越“单点指标”的“网络…...

ULVAC C30HMVRT系列冷冻泵和超捕集器压缩机组 安装、操作、维护和故障排除说明 含电路图
ULVAC C30HMVRT系列冷冻泵和超捕集器压缩机组 安装、操作、维护和故障排除说明 含电路图...

ORACLE查看归档是否打开
一、使用V$DATABASE视图 SELECT log_mode FROM v$database; 结果说明: ARCHIVELOG - 数据库处于归档模式 NOARCHIVELOG - 数据库处于非归档模式 二、 使用v$instance视图 SELECT archiver FROM v$instance; 结果说明: STARTED - 归档进程已启动(归档模…...

鸿蒙5.0项目开发——鸿蒙天气项目的实现(介绍)
【高心星出品】 文章目录 项目简介:项目运行效果图:主要功能:使用的技能点:开发环境: 项目简介: 这是一个基于鸿蒙系统(HarmonyOS)开发的天气应用,采用 ArkTS 语言开发&…...

3Dblox
TSMC 3Dblox Introduction 3Dblox是TSMC定义的一门语言,目标是将物理封装系统分解为模块化的组件,然后进行集成 RDL : 代表interposer的部分 Die的实例化信息 堆叠信息 连接信息 thickness:Die与Die连接Bump的高度 RedHawk-SC-Electrothermal…...

Python+大模型 day01
Python基础 计算机系统组成 基础语法 如:student_num 4.标识符要做到见名知意,增强代码的可读性 关键字 系统或者Python定义的,有特殊功能的字符组合 在学习过程中,文件名没有遵循标识符命名规则,是为了按序号编写文件方便查找复习 但是,在开发中,所有的Python文件名称必须…...

磁光克尔效应在量子计算中的应用
一、量子自旋态光学操控 1、拓扑量子态探测 磁光克尔效应通过检测拓扑磁结构(如磁斯格明子)的磁光响应,实现对量子材料中非平庸拓扑自旋序的非侵入式表征。例如,二维量子磁体中的“拓扑克尔效应”可通过偏振光旋转角变化揭示…...
【FileZilla】sftp协议的数据传输上传和下载
基于前面两篇及B站上大牛小方的解析视频: 【1】【Filezilla】 dispatch函数重载的例子-CSDN博客 【2】【C】【FileZilla】事件调用机制代码解析-CSDN博客 当线程entry()调用process_event()时,通过语句 (*std::get<0>(ev0))(*std::get<1>(…...
MySQL 深度分页怎么优化?
引言 分页查询是数据库应用中常见的需求,不同的分页方式对性能影响显著。逐页翻页通过记录上次查询的最大ID,避免了大量的偏移扫描,适合顺序浏览;而基于页数的直接跳页查询则面临主键不连续和偏移量过大的性能瓶颈。本文将介绍这…...

Vue.js---嵌套的effect与effect栈
4.3嵌套的effect与effect栈 1、嵌套的effect effect是可以发生嵌套的 01 effect(function effectFn1() { 02 effect(function effectFn2() { /* ... */ }) 03 /* ... */ 04 })有这么一段代码: 01 // 原始数据 02 const data { foo: true, bar: true } 03 /…...

AAAI-2025 | 电子科大类比推理助力精准识别!SPAR:基于自提示类比推理的无人机目标探测技术
作者: Nianxin Li, Mao Ye, Lihua Zhou, Song Tang, Yan Gan, Zizhuo Liang, Xiatian Zhu 单位:电子科技大学计算机科学与工程学院,上海理工大学机器智能研究所,重庆大学计算机学院,谢菲尔德大学,萨里大学…...
考研复习全年规划
25考研以330分成功上岸。 备考期间,我深知学习规划的重要性,为大家精心整理了一份初试备考时间线任务规划,希望能为正在备考的同学们提供参考。如果你对如何规划学习路线仍感迷茫,不妨参考这份时间表,合理分配时间&…...
信息安全入门基础知识
信息安全是保护信息系统和数据免受未经授权的访问、使用、披露、中断、修改或破坏的实践。对于个人和组织来说,了解信息安全的基础知识至关重要。 1. CIA三元组 信息安全的三个主要目标,也称为CIA三元组: 机密性(Confidentiality): 确保信息不被未经授权的人访问或披露完整性…...

速查 Linux 常用指令 II
目录 一、网络管理命令1. 查看和配置网络设备:ifconfig1)重启网络命令2)重启网卡命令 2. 查看与设置路由:route3. 追踪网络路由:traceroute4. 查看端口信息和使用情况1)netstat 命令2)lsof 命令…...

IIS服务器URL重写配置完整教程
1.下载URL Rewrite Module 2.1 https://www.iis.net/downloads/microsoft/url-rewrite https://download.microsoft.com/download/1/2/8/128E2E22-C1B9-44A4-BE2A-5859ED1D4592/rewrite_amd64_zh-CN.msi 2.安装...

注解和 XML 两种方式有什么区别?
注解和 XML 是两种常见的配置方式(尤其在 Java 开发中,如 Spring 框架),它们的主要区别体现在配置方式、代码耦合性、可读性、维护性等方面。以下是两者的对比: 1. 配置方式 注解(Annotation) 在…...

高速系统设计实例设计分析二
6.6 仿真约束的生成和实施 进行到这一步,我们已经完成了对实例进行仿真的所有条件的设置,包括对板子的设计要求分析和预布局处理。虽然从技术上讲,我们可以开始进行仿真分析并生成设计的约束,但是根据作者的工作经验,…...
计算机过程控制干燥操作实训装置JG-SX210化工单元操作实训装置
计算机过程控制干燥操作实训装置JG-SX210化工单元操作实训装置 一、装置功能 主要工艺设备采用卧式多室流化床干燥器,旋风分离器及布袋过滤器等。可以测定床层温度、差压曲线;恒定状态下介质湿度曲线和干燥速率曲线的测定。可以进行干燥物流的预热温控&…...

【MySQL】变更缓冲区:作用、主要配置以及如何查看
📢博客主页:https://blog.csdn.net/2301_779549673 📢博客仓库:https://gitee.com/JohnKingW/linux_test/tree/master/lesson 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! &…...

C2S-Scale:Cell2Sentence v2
目前的单细胞基础模型(scFMs)在可扩展性、跨多种任务的灵活性以及整合文本信息的能力方面仍然有限。基于Cell2Sentence(C2S)框架展开工作,该框架将单细胞RNA测序(scRNA-seq)图谱表示为文本形式的…...
vim启动的时候,执行gg
在 Vim 编辑器中,gg 命令是一个非常有用的命令,它可以将光标快速移动到当前窗口的顶部(即第一行)。如果你想在 Vim 启动时自动执行 gg 命令,有几种方法可以实现这一点: 方法 1:使用 Vim 的启动…...
SQLServer如何为数据库创建只读账号,并测试是否只读成功。直接代入替换就行,全流程,新手替换复制即可。
以下是为数据库 SQL_Xxxx 创建一个名为 zhidu_os 的只读账号,并将其密码设置为 SQL_Passwd 的详细步骤: 步骤 1:创建登录名 在 SQL Server 实例级别创建一个登录名(Login),并设置密码。 USE master; GO-…...
Linux 内核 IPv4 协议栈中的协议注册机制解析
1. 引言 在 Linux 内核的 IPv4 协议栈中,inetsw 是一个核心数据结构,负责管理不同套接字类型(如 SOCK_STREAM、SOCK_DGRAM)的协议实现。本文结合代码分析,深入探讨其设计原理、动态协议注册机制及并发安全实现。 2. inetsw 的结构与作用 2.1 定义与初始化 static struc…...