当前位置:网站首页>OpenGL - Coordinate Systems

OpenGL - Coordinate Systems

2022-07-05 09:12:00 农场主er

从顶点坐标到我们最终看到的效果,中间要经历多个坐标系的转换:
在这里插入图片描述

对于我们来讲,只需要关注三个矩阵即可:Vclip=Mprojection⋅Mview⋅Mmodel⋅Vlocal

  • Mmodel:将局部坐标转为世界坐标的矩阵,注意此时的平移是以物体本身的坐标系为基准的
  • Mview:将世界坐标以摄像机的视角进行转换,比如向右平移,实际上视图会向左平移
  • Mprojection:对观察坐标进行投影

Camera/View space

通过view matrix,将世界坐标系相对摄像机的位置和方向进行转换,就可以得到view space。摄像机在世界坐标系的位置定义如下:
在这里插入图片描述

glm::vec3 cameraPos = glm::vec3(0.0f, 0.0f, 3.0f);  
glm::vec3 cameraTarget = glm::vec3(0.0f, 0.0f, 0.0f);
glm::vec3 cameraDirection = glm::normalize(cameraPos - cameraTarget);
glm::vec3 up = glm::vec3(0.0f, 1.0f, 0.0f); 
glm::vec3 cameraRight = glm::normalize(glm::cross(up, cameraDirection));
glm::vec3 cameraUp = glm::cross(cameraDirection, cameraRight);

有了位置信息之后,可以计算出LookAt matrix
在这里插入图片描述
利用glm可以更便捷的构造出该矩阵:

glm::mat4 view;
// Position Target Up
view = glm::lookAt(glm::vec3(0.0f, 0.0f, 3.0f), 
  		   glm::vec3(0.0f, 0.0f, 0.0f), 
  		   glm::vec3(0.0f, 1.0f, 0.0f));

Walk around

移动视图其实是改变摄像机的位置,具体代码可以参照 ->

Look around

Euler angles

在这里插入图片描述
俯仰角(pitch)是描述我们如何往上或往下看的角,可以在第一张图中看到。第二张图展示了偏航角(yaw),表示我们往左和往右看的程度。滚转角(roll)代表我们如何翻滚摄像机,通常在太空飞船的摄像机中使用。
鼠标左右移动改变了yaw,上下移动改变了pitch,变换的坐标可以计算为:

glm::vec3 direction;
// yaw 在xz平面, pitch 在yz平面
direction.x = cos(glm::radians(yaw)) * cos(glm::radians(pitch));
direction.y = sin(glm::radians(pitch));
direction.z = sin(glm::radians(yaw)) * cos(glm::radians(pitch));

Zoom

进行透射投影即可起到放大缩小的效果,具体代码可以参照 ->

Camera Class

方便使用,我们可以把摄像机的功能封装起来 -> ,使用方法 ->

原网站

版权声明
本文为[农场主er]所创,转载请带上原文链接,感谢
https://blog.csdn.net/qq_42403042/article/details/125362624