0

我正在尝试在 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 值(浮点数)的向量类。

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

4

1 回答 1

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.

有关详细信息,请参阅此页面。在同一站点上,此其他页面描述了如何使用旋转角度来获取模型视图矩阵,因此列向量如上所示。同样的技术(但坐标系统略有不同)也被用于地震游戏引擎系列中。

于 2013-04-21T23:09:48.407 回答