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
相关产品推荐
相关产品推荐

