You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

OpenGL中使用glm::lookAt实现相机绕X、Y轴旋转的问题咨询

OpenGL 基于 glm::lookAt 实现相机绕X/Y轴旋转方案(无四元数实现)

核心思路

通过维护相机的**欧拉角(俯仰角pitch+偏航角yaw)**计算前向观察向量,直接适配glm::lookAt的入参要求,全程仅用基础三角函数实现,不需要引入四元数。

实现步骤

1. 定义相机核心状态变量

// 相机初始空间位置
glm::vec3 cameraPos = glm::vec3(0.0f, 0.0f, 3.0f);
// 俯仰角:绕X轴旋转的角度,初始0为平视
float pitch = 0.0f;
// 偏航角:绕Y轴旋转的角度,初始-90°对应默认朝向Z轴负方向
float yaw = -90.0f;
// 世界空间固定上向量
const glm::vec3 worldUp = glm::vec3(0.0f, 1.0f, 0.0f);

2. 通过欧拉角计算相机前向向量

用欧拉角转方向向量的公式直接计算,对应旋转矩阵的数学逻辑:

// 俯仰角限幅,避免超过±89°出现画面翻转
pitch = glm::clamp(pitch, -89.0f, 89.0f);

glm::vec3 cameraFront;
cameraFront.x = cos(glm::radians(yaw)) * cos(glm::radians(pitch));
cameraFront.y = sin(glm::radians(pitch));
cameraFront.z = sin(glm::radians(yaw)) * cos(glm::radians(pitch));
// 归一化为单位向量
cameraFront = glm::normalize(cameraFront);

3. 生成视图矩阵

直接将计算好的参数传入glm::lookAt即可:

// lookAt入参依次为:相机位置、观察目标点、世界上向量
// 观察目标点 = 相机位置 + 前向向量
glm::mat4 view = glm::lookAt(cameraPos, cameraPos + cameraFront, worldUp);

4. 绑定交互更新角度

如果需要通过鼠标/键盘控制旋转,只需要更新pitch和yaw的值即可,示例鼠标控制逻辑:

// xoffset为鼠标水平偏移量,yoffset为鼠标垂直偏移量,sensitivity为旋转灵敏度
void updateCameraAngle(float xoffset, float yoffset, float sensitivity = 0.1f)
{
    xoffset *= sensitivity;
    yoffset *= sensitivity;

    yaw += xoffset;
    pitch += yoffset;
}

补充说明

  • 如果需要实现相机平移功能,可以通过前向向量和右向量计算位移:右向量glm::vec3 cameraRight = glm::normalize(glm::cross(cameraFront, worldUp))
  • 每一帧渲染前重新计算cameraFront和view矩阵,再传入着色器即可生效

内容的提问来源于stack exchange,提问作者kostger

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 04:24:03