OpenGL之yaw、pitch、fov 和 lookAt

在 3D 图形学中,yawpitchfov 和 lookAt 都是控制摄像机(Camera)行为的关键参数,但它们的 作用层级 和 使用场景 不同。

1. yawpitchfov 的作用

(1) yaw(偏航角)

  • 作用:控制摄像机 左右旋转(绕世界坐标系的 Y 轴)。

  • 影响

    • yaw = 0:默认朝向 +Z 轴(OpenGL 的初始视角)。

    • yaw = -90:朝向 -X 轴(常用于 FPS 游戏的默认视角)。

  • 计算

    cpp

    front.x = cos(yaw) * cos(pitch);
    front.z = sin(yaw) * cos(pitch);

(2) pitch(俯仰角)

  • 作用:控制摄像机 上下旋转(绕摄像机的 X 轴)。

  • 影响

    • pitch = 0:水平向前。

    • pitch > 0:向上看(如看向天空)。

    • pitch < 0:向下看(如看向地面)。

  • 计算

    cpp

    front.y = sin(pitch);

(3) fov(视野范围,Field of View)

  • 作用:控制 透视投影的视角宽度(类似人眼的视野)。

  • 影响

    • fov 越大,视野越广(类似广角镜头,但可能变形)。

    • fov 越小,视野越窄(类似望远镜)。

  • 典型值

    • 45.0f(默认自然视角)。

    • 90.0f(更广的视野)。

2. lookAt 的作用

lookAt 是一个 矩阵计算函数(如 glm::lookAt),用于直接定义摄像机的 位置、目标点和上方向,而不需要手动计算 yaw 和 pitch

函数原型(GLM)

cpp

glm::mat4 view = glm::lookAt(glm::vec3(cameraPos),   // 摄像机位置 (x,y,z)glm::vec3(cameraTarget),// 看向的目标点 (x,y,z)glm::vec3(0.0f, 1.0f, 0.0f) // 上方向 (通常取世界Y轴)
);

lookAt 的特点

  1. 直接指定目标点,不需要计算 yaw 和 pitch

  2. 适用于固定视角(如第三人称跟随摄像机)。

  3. 内部自动计算 摄像机的 frontrightup 向量。

3. yaw/pitch/fov vs lookAt 的区别

特性yaw/pitch/fovlookAt
控制方式通过角度计算方向直接指定目标点
适用场景第一人称游戏(FPS)、自由摄像机固定视角(如RPG、第三人称)
计算复杂度需要手动计算 front 向量自动计算方向
灵活性适合动态旋转(如鼠标控制视角)适合静态或跟随目标
典型应用WASD 移动 + 鼠标旋转摄像机看向角色

第一人称与第三人称游戏的核心区别:在于视角范围和沉浸感。
第一人称以角色主观视角呈现,视野受限但代入感强,常见于射击类游戏;第三人称以旁观视角展现角色全身及环境,视野开阔且操作灵活,多用于动作冒险类游戏。
核心差异
1)视角范围
第一人称:仅显示角色视线范围内的场景,类似现实视野(水平约110度),无法观察角色自身或后方环境。
第三人称:可显示角色全身及周围更广范围(约270度视野),支持通过调整镜头观察掩体后或侧方动态。
2)沉浸感与操作
第一人称:通过限制视野强化代入感,如《使命召唤》中核爆场景直接传递角色濒死体验,但快速镜头移动易引发3D眩晕。
第三人称:允许分离操控角色移动与镜头转向,更适合复杂动作场景(如《古墓丽影》攀爬跳跃),但情感共鸣较弱。
 

4. 如何结合使用?

(1) 用 yaw/pitch 计算 front,再用 lookAt

cpp

// 计算前向向量
glm::vec3 front;
front.x = cos(yaw) * cos(pitch);
front.y = sin(pitch);
front.z = sin(yaw) * cos(pitch);
front = glm::normalize(front);// 使用 lookAt
view = glm::lookAt(cameraPos, cameraPos + front, glm::vec3(0, 1, 0));

(2) 直接用 lookAt 控制

cpp

// 让摄像机始终看向某个目标(如玩家角色)
view = glm::lookAt(cameraPos, playerPos, glm::vec3(0, 1, 0));

5. 总结

  • yaw/pitch/fov

    • 适用于 自由摄像机(如FPS游戏),通过角度控制方向。

    • 需要手动计算 front 向量。

  • lookAt

    • 适用于 固定目标摄像机(如RPG、第三人称),直接指定看向的位置。

    • 自动计算方向,无需处理 yaw/pitch

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

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

相关文章

STM32-第一节-新建工程,GPIO,点亮LED,蜂鸣器

一、新建工程&#xff1a; 1.Keil中新建工程&#xff0c;选择开发板型号。 2.工程文件夹建立Start&#xff0c;Library等分类&#xff0c;复制模版工程中的文件到工程文件夹中。 3.在Keil中添加分组&#xff0c;添加文件。 4.工程选项设置&#xff1a; c/c中&#xff1a;Inc…

Rust标量、复合类型与自定义类型、第三方并发结构

以下是 Rust 中标量类型、对象类型&#xff08;含结构体、复合类型、堆分配类型&#xff09;以及常用第三方并发数据结构的完整分类、示例和区别对比&#xff0c;帮助你系统掌握它们的本质异同&#xff1a; &#x1f7e2; 一、标量类型&#xff08;Scalar Types&#xff0c;存储…

基于STM32温湿度检测—串口显示

基于STM32温湿度检测 &#xff08;仿真&#xff0b;程序&#xff09; 功能介绍 具体功能&#xff1a; 1.使用DHT11检测温湿度&#xff1b; 2.单片机处理完控制LCD1602显示温湿度&#xff1b; 3.单片机也通过串口显示检测到的温湿度&#xff1b; 添加图片注释&#xff0c;不…

Windows 10 查询 Nginx 进程教程

1. 打开命令提示符&#xff08;CMD&#xff09; 按 Win R&#xff0c;输入 cmd&#xff0c;回车。或者在开始菜单搜索栏输入“cmd”&#xff0c;选择“命令提示符”。 2. 查看是否有正在运行的 Nginx 进程 输入命令&#xff1a; tasklist | findstr nginx这个命令会列出所有…

使用 Kafka 优化物流系统的实践与思考

使用 Kafka 优化物流系统的实践与思考 在现代物流系统中&#xff0c;订单处理、仓储管理、运输调度等环节复杂且实时性要求高。为了满足异步解耦、高吞吐、高可用、事件驱动和数据可靠性等需求&#xff0c;Kafka 作为分布式消息队列和流处理平台&#xff0c;成为了我们的首选。…

Rust中模式匹配let Some(gas_price) = tx.gas_price用法

你问得非常好&#xff0c;let Some(gas_price) tx.gas_price 是 Rust 中的一种模式匹配写法&#xff0c;它用于从 Option 类型中提取值。 ✅ 背景知识&#xff1a;什么是 Option&#xff1f; 在 Rust 中&#xff0c;如果一个值可能存在也可能不存在&#xff0c;就会用 Option…

什么是LLM大语言模型

什么是LLM大语言模型 LLM的全称是&#xff0c;Large Language Model&#xff0c;简称LLM&#xff0c;翻译为大语言模型&#xff0c;其核心是模拟人类语言的复杂规律&#xff0c;实现语义理解、推理分析、文本生成等任务&#xff0c;主要目的是实现能读懂和说出人类语言的模型。…

杂谈-架构时代演进

关于未来 5-10 年软件系统演化方向 1. 云原生 ➝ 超云原生&#xff08;Post Cloud Native&#xff09; Kubernetes 平台自治化&#xff1a; K8s Operator 日益强大&#xff0c;逐步具备自愈、自动扩缩容、自动调优能力。 云厂商与企业私有云逐步融合为一体…

如何查看服务器的运行日志?

&#x1f7e2; 一、Linux服务器 Linux日志都在**/var/log**目录下&#xff0c;最常用的有&#xff1a; &#x1f4c2; 常用日志文件 文件内容/var/log/messages大部分系统日志&#xff08;CentOS常见&#xff09;/var/log/syslog系统消息日志&#xff08;Ubuntu/Debian常见&a…

在幸狐RV1106开发板上用gcc14.2本地编译安装postgresql 17.5数据库

在幸狐RV1106开发板上用gcc14.2本地编译安装postgresql 17.5数据库 编译环境&#xff1a; RV1106G3 Linux luckfox-rv1106 5.10.160 #3 Fri Jun 27 14:16:20 AWST 2025 armv7l GNU/Linux BusyBox v1.36.1 gcc version 14.2.0 (GCC) GNU ld (GNU Binutils) 2.44 GNU Make 4.4 n…

Go语言中map[string]interface{} 和 map[string]string的区别

在 Go 语言中&#xff0c;map[string]interface{} 和 map[string]string 是两种不同类型的 map&#xff0c;它们的主要区别在于值的类型以及这种差异带来的使用场景和灵活性的不同。 1. 值的类型 map[string]interface{}&#xff1a;这里的 interface{} 表示 Go 中的空接口类型…

AdGuard Home 安装及使用

AdGuard Home 是 AdGuard 开源的一个私人 DNS 服务端,只需在网关部署,即可实现全局域网的广告拦截与隐私反追踪。在 DNS 解析的过程中,匹配规则库内的 URL 进行拦截,同时在客户端中,还可以通过自定义过滤规则实现网页 DOM 的拦截。 基于 Golang 编写的 AdGuard Home,官方…

绕过 GraphQL 暴力破解保护

题目要求&#xff1a; 本实验的用户登录机制由 GraphQL API 提供支持。API 终端节点有一个速率限制器&#xff0c;如果它在短时间内收到来自同一源的太多请求&#xff0c;则会返回错误。 要解决实验问题&#xff0c;请暴力破解登录机制以 .使用身份验证实验室密码列表作为密码…

C/C++ 使用rapidjson库 操作Json格式文件(创建、插入、解析、修改、删除)

目录 一、前言 1.简介 2.兼容性 3.下载 4.安装 5.官方文档 6.自述 二、封装Json 1. 创建一个 Document 对象 2. "key":"value" 3. { } 4. [ ] 5. [ { }, { } ] 6. [ [ ], [ ] ] 7. { [ ], [ ] } 8. { { }, { } } 9. 将Document转换为字符串…

免安装一键修复网络诊断 + 权限修复!打印机共享错误工具适配 Win7/10/11

各位打印小能手们&#xff01;你们有没有遇到过共享打印机出问题&#xff0c;搞得自己焦头烂额的情况&#xff1f;比如系统一更新&#xff0c;打印机就连不上&#xff0c;打印任务失败&#xff0c;真的是让人崩溃啊&#xff01;别慌&#xff0c;今天就给大家全面介绍一款打印机…

电脑分屏快捷键5

按window右箭头&#xff1a; 按window左箭头&#xff1a;

nt!CcFlushCache函数分析之nt!CcFindBcb

nt!CcFindBcb函数分析 第一部分&#xff1a; 1: kd> p nt!CcAcquireByteRangeForWrite0x377: 80a13c49 e866e4ffff call nt!CcFindBcb (80a120b4) 1: kd> t nt!CcFindBcb: 80a120b4 55 push ebp 1: kd> kc # 00 nt!CcFindBcb 01 nt!CcAcqu…

矩阵及矩阵快速幂

一.矩阵与模板 【模板】矩阵求和 时间限制&#xff1a;1秒 内存限制&#xff1a;128M 题目描述 给出两个&#x1d45b;行&#x1d45a;列的矩阵&#xff0c;求两个矩阵的和 输入描述 第一行输入两个以空格分隔的整数&#x1d45b;,&#x1d45a;&#xff0c;表示矩…

rk3588获取探维雷达数据

可以在上期部署完 FASTLIO 的工作空间内&#xff0c;继续部署探维雷达的驱动程序。不要问为什么不用 mid360&#xff0c;因为我手上只有探维雷达。 探维雷达的驱动链接&#xff1a;https://github.com/TanwayLab/tanwaylidar_view/blob/main/README.md 下载驱动并编译 因为沿…

HTML简介,初步了解HTML

<html> <body> <h1>我的第一个标题</h1> <p1>我的第一个段落</p1> </body> </html> 什么是HTML HTML是用来描述网页的一种语言。 HTML指的是超文本标记语言。 HTML不是一种编程语言&#xff0c;而是一种标记语言。 标记语…