2012-12-05 21 views
0

我创建了一个网格来表示地面走路。没有gluLookAt的旋转相机NOT场景

我有我的方向键连接起来旋转/移动视图:

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,没有人有任何想法如何实现这个?完全难住,在这里坐了好两个小时试图找出答案。

的完整代码:

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(); 
    } 

回答

0

旋转拳头,然后翻译第二?

编辑: 我刚刚检查了一些我现有的代码。

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); 
+0

我得到的问题,那个轴不旋转。如同,我可以面对我的右侧90度,我会按向上移动'前进',我会移动到我的左侧。 – Dezachu

+0

如果我调整RotY,RotX和Player变量..我得到正确的结果。 这就是正确的操作顺序。 – JohnD

+0

嗨,JohnD,我正在寻找Android中的平移功能,如移动GLSurfaceview,而不是对象[我需要使用触摸事件来移动GLSurfaceview]。如果你现在有任何想法,请给出任何示例代码。对我来说完成我的任务会有所帮助。我在这里奋斗。我的示例代码在这里.http://www.mediafire.com/?09f9q51xnqhq2l7.which – harikrishnan