在 3D 图形学中,yaw、pitch、fov 和 lookAt 都是控制摄像机(Camera)行为的关键参数,但它们的 作用层级 和 使用场景 不同。
1. yaw、pitch、fov 的作用
(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 的特点
-
直接指定目标点,不需要计算
yaw和pitch。 -
适用于固定视角(如第三人称跟随摄像机)。
-
内部自动计算 摄像机的
front、right、up向量。
3. yaw/pitch/fov vs lookAt 的区别
| 特性 | yaw/pitch/fov | lookAt |
|---|---|---|
| 控制方式 | 通过角度计算方向 | 直接指定目标点 |
| 适用场景 | 第一人称游戏(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。
-