前言:记录OpenGL学习过程中的一些知识点,以个人理解为主。
LookAt函数将顶点的世界空间坐标转换为观察空间坐标,实际上是以相机为原点重新定义的三维空间。
glm::mat4 LookAt(glm::vec3 pos, glm::vec3 target, glm::vec3 up)
函数接受三个参数,相机位置pos,目标位置target以及相机上向量up。工作流程是:glm::vec3 zaxis = normalize(pos-target)指向观察空间正Z轴方向,glm::vec3 xaxis = normalize(glm::cross(up, zaxis))指向观察空间正X轴方向,glm::vec3 = glm::cross(zaxis, xaxis)指向观察空间正Y轴方向。
欧拉角Euler Angle可以表示三维空间中任何旋转的三个值,包括俯仰角Pitch、偏航角Yaw和滚转角Roll。想象在OpenGL右手坐标空间中沿着Z轴开飞机,飞机头抬起或者下降的角度是俯仰角Pitch(绕X轴),飞机头向左或向右摆动是偏航角Yaw(绕Y轴),飞机做战术翻滚是滚转角(绕Z轴)。
欲让场景中的模型移动,相对改变相机的位置即可;旋转的实现比较复杂,需要进行较复杂的数学运算。
当前实验,实现旋转用Trackball比较合适,不过网上一大堆资料都是glut那一套,现在用的glfw,半吊子水平。幸运看到一篇直接针对模型进行旋转(/qq_40515692/article/details/102902559),改了改挺好使的:
//全局变量float xrot = 0.0f, yrot = 0.0f;float xdiff = 0.0f, ydiff = 0.0f;//回调函数void cursor_position_callback(GLFWwindow*window, double xpos, double ypos){if (glfwGetMouseButton(window, GLFW_MOUSE_BUTTON_RIGHT) == GLFW_PRESS){yrot = xpos - xdiff;xrot = ypos + ydiff;}}void mouse_button_callback(GLFWwindow*window, int button, int action, int mods);{double xpos, ypos;glfwGetCursorPos(window, &xpos, &ypos);if (glfwGetMouseButton(window, GLFW_MOUSE_BUTTON_RIGHT) == GLFW_PRESS){xdiff = xpos - yrot;ydiff = -ypos + xrot;}}int main(){……glm::mat4 tmpmodel=glm::mat4(1.0f);while (!glfwWindowShouldClose(window)){……glm::mat4 model=glm::mat4(1.0f);if(glfwGetMouseButton(window, GLFW_MOUSE_BUTTON_RIGHT) == GLFW_PRESS){model = glm::rotate(model, 0.1f*xrot, glm::vec3(1.0, 0.0, 0.0));model = glm::rotate(model, 0.1f*yrot, glm::vec3(0.0, 1.0, 0.0));tmpmodel=model;}else{model=tmpmodel; //鼠标释放后,保持模型停在当前状态}……}……return 0;}
不如Trackball,但好歹转起来了o(* ̄▽ ̄*)ブ
如果觉得《OpenGL LookAt函数理解》对你有帮助,请点赞、收藏,并留下你的观点哦!