opengl摄像机旋转缩放

该博客详细介绍了如何在OpenGL中通过鼠标和滚轮控制相机的视角。利用欧拉角的概念,分别处理偏航角和俯仰角的变化,限制角度范围以避免翻转问题。同时,通过滚轮事件修改视场角(fov),实现视角的缩放。在回调函数中更新相机方向和视场,最终实现交互式的3D场景浏览效果。
摘要由CSDN通过智能技术生成
  • 欧拉角:1.front是类似于单位向量,X是俯仰角的X变化投影与偏航角X变化投影的乘法(用两次角度投影画图来理解),Y轴就是改变pitch本身
    在这里插入图片描述
  • 定义函数鼠标控制与滚轮控制回调函数和fov:
//鼠标控制回调函数
void mouse_callback(GLFWwindow* window, double xpose, double ypose) {
    static float yaw = -90.0f, pitch = 0.0f, lastX= 800.0f / 2, lastY= 600.0f / 2, xoffset/*偏移量*/, yoffset;
    xoffset = xpose - lastX;
    yoffset =  lastY - ypose;   //注意Y是lastY - ypose

    lastX = xpose;
    lastY = ypose;

    yaw += xoffset * 0.1;   //偏航角(左右移动)
    pitch += yoffset * 0.1; //俯仰角(上下移动)
    glm::vec3 front;

    if (pitch > 89.0f)  //对角度进行限制
        pitch = 89.0f;
    if (pitch < -89.0f)
        pitch = -89.0f;

    front.x = cos(glm::radians(yaw)) * cos(glm::radians(pitch));
    front.y = sin(glm::radians(pitch));
    front.z = sin(glm::radians(yaw)) * cos(glm::radians(pitch));
    cameraFront = glm::normalize(front);
}

//通过滚轮修改fov视角的值
void scroll_callback(GLFWwindow* window, double xoffset, double yoffset)
{

    if (fov >= 1.0f && fov <= 85.0f)
        fov -= yoffset;
    if (fov <= 1.0f)
        fov = 1.0f;
    if (fov >= 85.0f)
        fov = 85.0f;
}
  • 使用glfw内部窗口函数对window里边的值在鼠标进行操作的时候进行修改。
	glfwSetCursorPosCallback(window, mouse_callback);  //  当我们有鼠标信息的时候就会进来,然后进行操作以此修改cameraFront进一步改变view
    glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_DISABLED);   //防止窗口对鼠标进行拦截

    glfwSetScrollCallback(window, scroll_callback);    //fov用于修改透视投影
    //渲染引擎

    glEnable(GL_DEPTH_TEST);    //打开深度缓存
    while (!glfwWindowShouldClose(window)) {    //当需要退出时候退出
  • 对while里边的透视投影进行修改让其根据滚轮的改变修改FOV
projection = glm::perspective(glm::radians(fov), 800.0f / 600.0f, 0.1f, 100.0f);  //透视投影
  • view矩阵不发生改变,通过回调函数修改的本身就是cameraFront
view = glm::lookAt(cameraPos/*相机位置*/,
                cameraPos +cameraFront/*看向平整的,不考虑旋转就不用顶着一个地方target*/,
                cameraUP);
  • 运行效果:
    在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值