我创建了一个网格来表示要行走的地面。
我已经链接了箭头键以旋转/移动视图:
switch(currentKey)
{
case sf::Key::Up:
z_trans+=1;
break;
case sf::Key::Down:
z_trans-=1;
break;
case sf::Key::Left:
y_angle-=0.5;
break;
case sf::Key::Right:
y_angle+=0.5;
break;
}
z_trans是 z 中的平移,y_angle是 glRotatef() 中 y 轴的旋转。
我可以让我的"角色"向前走,左右转弯,然后继续向他面对的方向直行。唯一的问题是,当我离开原点(0,0,0)时,旋转发生在原点周围,而不是相机周围。因此,如果我离原点 100 个单位,我的角色基本上遵循 100 半径圆的路径。
不使用gluLookAt,有人知道如何实现这一点吗?完全被难住了,坐在这里整整2个小时试图弄清楚。
完整代码:
float elapsedTime=Clock.GetElapsedTime();
if(elapsedTime>REFRESH_RATE){
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(x_trans, y_trans, z_trans); // y_trans == -25.f to keep us above the plane
glRotatef(x_angle,1,0,0);
glRotatef(y_angle,0,1,0);
glRotatef(z_angle,0,0,1);
currentKey=sf::Key::Num9;
if (Event.Type == sf::Event::KeyPressed) currentKey = Event.Key.Code;
switch(currentKey)
{
case sf::Key::Up:
z_trans+=1;
break;
case sf::Key::Down:
z_trans-=1;
break;
case sf::Key::Left:
y_angle-=0.5;
break;
case sf::Key::Right:
y_angle+=0.5;
break;
}
drawGrid();
Clock.Reset();
}
旋转拳头,然后翻译第二?
编辑:我刚刚检查了一些现有的代码。
glLoadIdentity();
// Rotate around origin first
glRotatef(RotY,-1.0f ,0.0f, 0.0f);
glRotatef(RotX, 0.0f, 1.0f, 0.0f);
// Then move the camera
glTranslatef(-Player.x, -Player.y, -Player.z);