4.Three.js 中 Camera 摄像机详解

一、什么是 Camera?

在 Three.js 中,Camera(摄像机)决定了我们如何观察三维场景

你可以把它理解为我们“眼睛”的位置和方向,场景中的物体再复杂,如果没有摄像机,就没有“观察角度”,也就不会渲染在屏幕上。

Three.js 中的 Camera 类被设计为抽象类,常用的子类有两种:

  • PerspectiveCamera(透视摄像机):更符合人眼的视觉方式。

  • OrthographicCamera(正交摄像机):常用于2D界面、建筑图等场景。

本篇文章聚焦于 Camera 的通用概念、构造参数和基本使用方式,后续我会为每个摄像机类型单独写文章深入讲解。


二、摄像机的构成原理

一个摄像机主要包含以下几个核心参数:

参数说明
position摄像机在三维空间中的位置(Vector3
lookAt摄像机的朝向目标点,通常设置为场景中心
near, far可视范围(近平面与远平面之间的物体才会被渲染)
fov视角(field of view),透视摄像机特有
aspect宽高比,通常为画布宽度/高度
left/right/top/bottom正交摄像机特有的可视范围边界定义

三、最简单的 Camera 示例(透视摄像机)

我们先创建一个最基本的 Three.js 场景,添加一个透视摄像机并渲染一个立方体。

示例代码(使用 Vue 3 + Composition API + Three.js):

import { onMounted, ref } from 'vue'
import * as THREE from 'three'export default {setup() {const containerRef = ref<HTMLDivElement | null>(null)onMounted(() => {const scene = new THREE.Scene()// 创建透视摄像机const camera = new THREE.PerspectiveCamera(75,                                      // fov:视角window.innerWidth / window.innerHeight, // aspect:宽高比0.1,                                     // near:近平面1000                                     // far:远平面)camera.position.set(0, 0, 5) // 设置摄像机位置camera.lookAt(0, 0, 0)       // 看向场景中心const renderer = new THREE.WebGLRenderer()renderer.setSize(window.innerWidth, window.innerHeight)containerRef.value?.appendChild(renderer.domElement)// 添加一个简单的立方体const geometry = new THREE.BoxGeometry()const material = new THREE.MeshBasicMaterial({ color: 0x00ff00 })const cube = new THREE.Mesh(geometry, material)scene.add(cube)// 渲染循环function animate() {requestAnimationFrame(animate)cube.rotation.x += 0.01cube.rotation.y += 0.01renderer.render(scene, camera)}animate()})return () => <div ref={containerRef} />}
}

🔍 核心解释:

  • PerspectiveCamera(fov, aspect, near, far) 是透视摄像机的构造函数。

  • camera.position.set(...) 设置相机的位置坐标。

  • camera.lookAt(...) 指定相机的朝向目标。

  • 摄像机需要和 renderer.render(scene, camera) 一起配合使用,才会生效。


四、Camera 的常见使用场景

使用场景推荐摄像机类型
游戏视角(如第一人称/第三人称)PerspectiveCamera(透视)
俯视图/地图/界面UIOrthographicCamera(正交)
建筑建模图纸OrthographicCamera
数据可视化视角稳定时可考虑正交,动态可用透视

五、Camera 操作技巧

  • 动态改变位置:可以使用动画库(如 gsap)平滑移动摄像机。

  • 添加 OrbitControls(轨道控制器):

    import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls'const controls = new OrbitControls(camera, renderer.domElement)
    controls.enableDamping = true
    

    这可以让用户用鼠标自由旋转视角,非常适合初期调试或展示场景。


六、总结

  • Camera 是观察场景的“眼睛”,必须有;

  • 最常用的是 PerspectiveCameraOrthographicCamera

  • 使用时注意 位置 + 朝向 + 可视范围 三要素;

  • 配合控制器能带来更强交互体验。


💡 预告

在后续系列中,我将详细拆解每种摄像机的使用场景、构造参数、示例效果和高级技巧,敬请关注:

  • ✅ 《透视摄像机详解》

  • ✅ 《正交摄像机详解》


📌 如果你觉得有帮助,欢迎点赞、收藏、评论,你的支持是我持续创作的最大动力!

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

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

相关文章

gem5-gpu教程03 当前的gem5-gpu软件架构(因为涉及太多专业名词所以用英语表达)

Current gem5-gpu Software Architecture 这是当前gem5-gpu软件架构的示意图。 Ruby是在gem5-gpu上下文中用于处理CPU和GPU之间内存访问的高度可配置的内存系统 CudaCore (src/gpu/gpgpu-sim/cuda_core.*, src/gpu/gpgpu-sim/CudaCore.py) Wrapper for GPGPU-Sim shader_cor…

负载均衡的实现方式有哪些?

负载均衡实现方式常见的有: 软件负载均衡、硬件负载均衡、DNS负载均衡 扩展 二层负载均衡&#xff1a;在数据链路层&#xff0c;基于MAC地址进行流量分发&#xff0c;较少见于实际应用中 三层负载均衡&#xff1a;在网络层&#xff0c;基于IP地址来分配流量&#xff0c;例如某…

MyBatis 和 MyBatis-Plus 在 Spring Boot 中的配置、功能对比及 SQL 日志输出的详细说明,重点对比日志输出的配置差异

以下是 MyBatis 和 MyBatis-Plus 在 Spring Boot 中的配置、功能对比及 SQL 日志输出的详细说明&#xff0c;重点对比日志输出的配置差异&#xff1a; 1. MyBatis 和 MyBatis-Plus 核心对比 特性MyBatisMyBatis-Plus定位基础持久层框架MyBatis 的增强版&#xff0c;提供代码生…

《数据结构世界的乐高积木:顺序表的奇幻旅程》

目录 1. 线性表 2. 顺序表 2.1 概念与结构 2.2 分类 2.2.1 静态顺序表 2.2.2 动态顺序表 2.3 动态顺序表的实现 1. 线性表 线性表&#xff08;linear list&#xff09;是n个具有相同特性的数据元素的有限序列。线性表是⼀种在实际中⼴泛使⽤的数据结构&#xff0c;常⻅的…

RHCE 练习二:通过 ssh 实现两台主机免密登录以及 nginx 服务通过多 IP 区分多网站

一、题目要求 1.配置ssh实现A&#xff0c;B主机互相免密登录 2.配置nginx服务&#xff0c;通过多ip区分多网站 二、实验 实验开始前需准备两台 linux 主机便于充当服务端以及客户端&#xff0c;两台主机 IP 如下图&#xff1a; 实验1&#xff1a;配置 ssh 实现 A&#xff0…

第十五届蓝桥杯 2024 C/C++组 好数

题目&#xff1a; 题目描述&#xff1a; 题目链接&#xff1a; 好数 思路&#xff1a; 第一种思路详解&#xff1a; 因为每次检查数都是从个位开始&#xff0c;所以对于每一个数都是先检查奇数位再检查偶数位&#xff0c;即存在先检查奇数位再检查偶数位的循环。注意一次完…

展锐Android13状态栏默认显示电池电量百分比

展锐Android13电池状态默认不显示电池电量百分比&#xff0c;打开 /frameworks/base/packages/SettingsProvider/res/values/defaults.xml 在xml的文件最后&#xff0c;增加一项配置def_show_battery_percent&#xff1a; <?xml version"1.0" encoding"u…

OpenCV 高斯模糊 cv2.GaussianBlur

OpenCV 高斯模糊 cv2.GaussianBlur flyfish cv2.GaussianBlur 是 OpenCV 库中用于对图像进行高斯模糊处理的函数。 高斯模糊的含义 高斯模糊是一种常见的图像滤波技术&#xff0c;它可以对图像进行平滑处理&#xff0c;减少图像中的噪声和细节&#xff0c;使得图像看起来更…

[密码学基础]密码学发展简史:从古典艺术到量子安全的演进

密码学发展简史&#xff1a;从古典艺术到量子安全的演进 密码学作为信息安全的基石&#xff0c;其发展贯穿人类文明史&#xff0c;从最初的文字游戏到量子时代的数学博弈&#xff0c;每一次变革都深刻影响着政治、军事、科技乃至日常生活。本文将以技术演进为主线&#xff0c;…

PostgreSQL认证培训推荐机构

首先来看一张2025年4月份db-engines上的数据库排行情况&#xff0c;前三名是雷打不动的Oracle、MySQL、Microsoft SQL Server&#xff0c;排名第四的就是我们今天的主角 - PostgreSQL数据库&#xff0c;从这张图上可以看出&#xff0c;PostgreSQL数据库的上升超非常明显&#x…

STM32 CubeMx下载及安装(一)

CubeMx及Java下载安装&#xff08;一&#xff09; 1 背景1.1 基本介绍1.2 主要特点1.3 相关准备 2 软件下载2.1 Java 官网下载2.2 CubeMx官网下载2.4 CubeMX网盘下载 3 软件安装3.1 Java 软件安装3.1.1 安装过程 3.2 CubeMx软件安装 总结 1 背景 1.1 基本介绍 STM32CubeMX&am…

Spring Boot 应用优雅关闭

写这篇文章是因为看到 “线程池在使用结束后应该正确关闭.” 那么如果我们的 Spring 应用都无法正确关闭, 那么线程池肯定也无从保障 1. 优雅关闭 kill with pid, without -9 大多数情况下无须在意这个问题, 正确使用 kill 命令关闭就行 (注意不能使用 kill -9) kill $(cat …

linux与c语言基础知识(未全部完成)

文章很多处理论&#xff0c;没办法写出来&#xff0c;&#xff08;linux的一些理论问题&#xff0c;我有时间后&#xff0c;会逐个解决&#xff09; 文章大多数的理论来字这个链接&#xff0c; C语言快速入门-C语言基础知识-CSDN博客 一. linux&#xff08;Ubuntu&#xff09; …

面试经历(一)雪花算法

uid生成方面 1&#xff1a;为什么用雪花算法 分布式ID的唯一性需要保证&#xff0c;同时需要做到 1&#xff1a;单调递增 2&#xff1a;确保安全&#xff0c;一个是要能体现出递增的单号&#xff0c;二一个不能轻易的被恶意爬出订单数量 3&#xff1a;含有时间戳 4&#…

基于GA遗传优化TCN-BiGRU注意力机制网络模型的时间序列预测算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 (完整程序运行后无水印) 2.算法运行软件版本 matlab2024b&#xff08;提供软件版本下载&#xff09; 3.部分核心程序 &#xff08;完整版代码包…

深度强化学习 pdf 董豪| 马尔科夫性质,马尔科夫过程,马尔科夫奖励过程,马尔科夫决策过程

深度强化学习 pdf 百度云 hea4 pdf 主页 概念 马尔可夫奖励过程和价值函数估计的结合产生了在绝大多数强化学习方法中应用的核心结果——贝尔曼 &#xff08;Bellman&#xff09;方程。最优价值函数和最优策略可以通过求解贝尔曼方程得到&#xff0c;还将介绍三种贝尔曼 方…

验证Kubernetes的服务发现机制

验证Kubernetes的服务发现机制 文章目录 验证Kubernetes的服务发现机制[toc]一、验证基于环境变量的服务发现机制 服务发现是让客户端能够以固定的方式获取到后端Pod访问地址的机制。下面验证环境变量和DNS这两种机制。 一、验证基于环境变量的服务发现机制 对于需要访问服务…

FPGA系列之DDS信号发生器设计(DE2-115开发板)

一、IP核 IP(Intellectual Property)原指知识产权、著作权等&#xff0c;在IC设计领域通常被理解为实现某种功能的设计。IP模块则是完成某种比较复杂算法或功能&#xff08;如FIR滤波器、FFT、SDRAM控制器、PCIe接口、CPU核等&#xff09;并且参数可修改的电路模块&#xff0c…

Java单例模式详解:实现线程安全的全局访问点

精心整理了最新的面试资料和简历模板&#xff0c;有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 一、什么是单例模式&#xff1f; 单例模式&#xff08;Singleton Pattern&#xff09;是一种创建型设计模式&#xff0c;它保证一个类仅有一个实例&#xff…

JVM 生产环境问题定位与解决实战(七):实战篇——OSSClient泄漏引发的FullGC风暴

本文已收录于《JVM生产环境问题定位与解决实战》专栏&#xff0c;完整系列见文末目录 引言 在前六篇博客中&#xff0c;我们系统性地学习了 JVM 生产环境问题定位与解决的全套工具链&#xff0c;涵盖jps、jmap、jstat、jstack、jcmd 等基础工具的使用技巧&#xff0c;深入剖析…