如何让我的相机朝着我面向的方向移动

时间:2013-04-21 21:35:48

标签: c++ c opengl camera

我试图在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)的矢量类。

我的问题是,如何修改我的代码以实现免费漫游?

1 个答案:

答案 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中也使用相同的技术(但坐标系略有不同)。