我试图在OpenGL中制作一个免费的漫游相机。目前,相机向前,向后,向左和向右移动。我的下一个目标是让它朝你所看的方向移动。
到目前为止我的代码:
float yawRad = Rotation -> y * (3.1415f/180);
float pitchRad = Rotation -> x * (3.1415f/180);
if(myInput.Keys[VK_W]) //Forward
{
curPos->x += sin(yawRad) * myInput.Sensitivity;
curPos->z -= cos(yawRad) * myInput.Sensitivity;
}
else if(myInput.Keys[VK_S]) //Backward
{
curPos->x -= sin(yawRad) * myInput.Sensitivity;
curPos->z += cos(yawRad) * myInput.Sensitivity;
}
if(myInput.Keys[VK_A]) //Left
{
curPos->x -= cos(yawRad) * myInput.Sensitivity;
curPos->z -= sin(yawRad) * myInput.Sensitivity;
}
else if(myInput.Keys[VK_D]) //Right
{
curPos->x += cos(yawRad) * myInput.Sensitivity;
curPos->z += sin(yawRad) * myInput.Sensitivity;
}
if(myInput.Keys[VK_E]) //Up
{
curPos->y += myInput.Sensitivity;
}
else if(myInput.Keys[VK_Q]) //Down
{
curPos->y -= myInput.Sensitivity;
}
myInput.Sensitivity
是由鼠标滚轮控制的浮点数,值增加/减少0.0005。
Rotation
是一个存储x,y,z值(float)的矢量类。
我的问题是,如何修改我的代码以实现免费漫游?
答案 0 :(得分:1)
您可以从模型视图矩阵的第一,第二和第三列获取摄像机的左,上和前向量 - 当然是在配置完毕后。
float mview[16];
float front[4], up[4], left[4];
glGetFloatv(GL_MODELVIEW_MATRIX, mview);
left[0] = mview[0]; left[1] = mview[1]; left[2] = mview[2]; left[3] = 1.0;
up[0] = mview[4]; up[1] = mview[5]; up[2] = mview[6]; up[3] = 1.0;
front[0] = mview[8]; front[1] = mview[9]; front[2] = mview[10]; front[3] = 1.0;
从那时起,您只需要将适当的矢量添加到移动位置。
if(myInput.Keys[VK_A]) //Left
{
curPos->x += left[0] * myInput.Sensitivity;
curPos->z += left[z] * myInput.Sensitivity;
}
else if(myInput.Keys[VK_D]) //Right
{
curPos->x -= left[0] * myInput.Sensitivity;
curPos->z -= left[2] * myInput.Sensitivity;
}
// etc.
有关详细信息,请参阅this page。 在同一站点上,this other page描述了如何使用旋转角度来获取模型视图矩阵,因此列向量如上所示。例如,quake game engines serie中也使用相同的技术(但坐标系略有不同)。