需求
需求:摄像机在世界空间位置、观察方向、右向量和上向量。
1.摄像机位置
::世界空间中代表摄像机的向量。
glm::vec3 cameraPos=glm::vec3(0.0f,0.0f,3.0f);
!!!Z轴是屏幕指向自己。如果希望摄像机往后移动,把Z往正方向移动。
2.摄像机方向
::摄像机位置方向—场景原点向量=指向原点。
glm::vec3 cameraTarget=glm::vec3(0.0f,0.0f,0.0f);
glm::vec3 caremaDiretion=glm::normalize(cameraPos-cameraTarget);
!!!:方向向量:摄像机到目标向量的反方向(如上图)
3.右轴和上轴
获取右轴(代表摄像机空间X轴的正方向):定义一个上向量(Up Vector),将上向量和摄像机方向向量叉乘。(交换顺序得到X轴负方向的向量)
glm::vec3 up=glm::vec3(0.0f,1.0f,0.0f)
glm::vec3 cameraRight=glm::normalize(glm::cross(up,cameraDirection));
获取上轴(正Y轴):把右轴和方向向量进行叉乘。
glm::vec3 cameraUp=glm::corss(cameraDirection,cameraRight);
4.Look At
作用:如果你定义了一个坐标空间,里面有3个相相互垂直的轴,你可以用这三个轴+一个平移向量来创建一个矩阵,用这个矩阵乘以任何向量来变换到那个坐标空间!
glm::mat4 view;
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));
//只需要:摄像机位置,目标位置,表示上向量的世界空间中的向量)
5.摄像机在场景旋转
目的:摄像机在场景旋转,注视点始终在(0,0,0)
每一帧创建x,z坐标。x和z在一个圆圈上的一点。
GLfloat radius=10.0f;
GLfloat camx=sin(glfwGetTime())*radius;
GLfloat camz=cos(glfwGetTime())*radius;
glm::mat4 view;
view = glm::lookAt(glm::vec3(camx,0.0,camz),glm::vec3(0.0,0.0,0.0),glm:vec3(0.0,1.0,0.0));