用opengl实现鼠标水平方向漫游天空盒
时间: 2024-01-01 15:05:23 浏览: 34
在OpenGL中实现鼠标水平方向漫游天空盒的方法如下:
首先,我们需要创建一个窗口和一个OpenGL上下文。然后,我们需要加载天空盒的纹理,并将其绑定到一个立方体的顶点数组对象(VAO)上。
接下来,我们需要设置一个摄像机,使其能够根据鼠标的水平移动来旋转。我们可以使用GLFW的鼠标回调函数来获取鼠标的位置,并计算鼠标的偏移量。然后,我们可以根据鼠标的偏移量来更新摄像机的旋转角度。
最后,我们需要在渲染循环中更新观察矩阵,并将其传递给着色器程序。观察矩阵可以通过glm库的lookAt函数来创建,其中摄像机的位置可以根据鼠标的旋转角度来计算。
下面是一个示例代码,演示了如何使用OpenGL实现鼠标水平方向漫游天空盒:
```cpp
#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <glm/glm.hpp>
#include <glm/gtc/matrix_transform.hpp>
#include <iostream>
// 窗口大小
const GLuint WIDTH = 800, HEIGHT = 600;
// 鼠标初始位置
GLfloat lastX = WIDTH / 2.0f;
GLfloat lastY = HEIGHT / 2.0f;
// 摄像机参数
glm::vec3 cameraPos = glm::vec3(0.0f, 0.0f, 3.0f);
glm::vec3 cameraFront = glm::vec3(0.0f, 0.0f, -1.0f);
glm::vec3 cameraUp = glm::vec3(0.0f, 1.0f, 0.0f);
// 鼠标是否是第一次获取输入
bool firstMouse = true;
// 鼠标回调函数
void mouse_callback(GLFWwindow* window, double xpos, double ypos)
{
if (firstMouse)
{
lastX = xpos;
lastY = ypos;
firstMouse = false;
}
GLfloat xoffset = xpos - lastX;
GLfloat yoffset = lastY - ypos; // 注意这里的坐标系是反的(y轴向上为正)
lastX = xpos;
lastY = ypos;
GLfloat sensitivity = 0.05f;
xoffset *= sensitivity;
yoffset *= sensitivity;
// 根据鼠标的偏移量来更新摄像机的旋转角度
// 这里使用glm库的yaw和pitch函数来实现
// yaw表示绕y轴旋转,pitch表示绕x轴旋转
cameraFront.x = cos(glm::radians(xoffset)) * cameraFront.x - sin(glm::radians(xoffset)) * cameraFront.z;
cameraFront.z = sin(glm::radians(xoffset)) * cameraFront.x + cos(glm::radians(xoffset)) * cameraFront.z;
cameraFront = glm::normalize(cameraFront);
cameraFront.y += yoffset;
cameraFront = glm::normalize(cameraFront);
}
int main()
{
// 初始化GLFW
glfwInit();
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);
// 创建窗口
GLFWwindow* window = glfwCreateWindow(WIDTH, HEIGHT, "Skybox", nullptr, nullptr);
glfwMakeContextCurrent(window);
// 初始化GLEW
glewExperimental = GL_TRUE;
glewInit();
// 设置鼠标回调函数
glfwSetCursorPosCallback(window, mouse_callback);
// 设置视口大小
glViewport(0, 0, WIDTH, HEIGHT);
// 渲染循环
while (!glfwWindowShouldClose(window))
{
// 检查是否有触发事件(例如按下了关闭按钮)
glfwPollEvents();
// 清空颜色缓冲
glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
// 更新观察矩阵
glm::mat4 view;
view = glm::lookAt(cameraPos, cameraPos + cameraFront, cameraUp);
// 将观察矩阵传递给着色器程序
// ...
// 绘制天空盒
// ...
// 交换缓冲
glfwSwapBuffers(window);
}
// 清理资源
glfwTerminate();
return 0;
}
```