- 欧拉角: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;
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);
}
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);
glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_DISABLED);
glfwSetScrollCallback(window, scroll_callback);
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,
cameraUP);
- 运行效果: