2012-12-13 125 views
2

所以,我試圖創建一個FPS風格的相機來探索我的場景,它似乎工作正常。目前無法改變相機的音調。我試圖創建一個函數,允許我將相機設置爲某些預定義的視點,但是當使用setPosition()函數將相機設置爲新視點後試圖旋轉相機時,我會遇到不在位置上的跳躍,而是在方向上當第一次按下旋轉按鈕時。使用gluLookAt的OpenGL FPS相機()

這是我的相機類的實現。

Camera::Camera(void) 
{ 
    angleX = 0.0; 
    angleY = 0.0; 
    directionX = 0.0; 
    directionZ = -5.0; 
    directionY = 0.0; 
    xPos = 0.0; 
    zPos = 1.0; 
    yPos = 2.0; 
} 

void Camera::setPosition(float xDir, float yDir, float zDir, float posX, float posZ, float posY) 
{ 
    directionX = xDir; 
    directionZ = zDir; 
    directionY = yDir; 
    xPos = posX; 
    zPos = posZ; 
    yPos = posY; 
} 

Camera::~Camera(void) 
{ 
} 

以下是我的特殊按鍵回撥功能,省略了攝像機移動以外的功能。

void specialKeys(int key, int xx, int yy) 
{ 
    float fraction = 0.3f; 

    switch(key) 
    { 
     // Camera Controls 
     case GLUT_KEY_LEFT: 
      camera.angleY -= 0.05f; 
      camera.directionX = sin(camera.angleY); 
      camera.directionZ = -cos(camera.angleY); 
      break; 
     case GLUT_KEY_RIGHT: 
      camera.angleY += 0.05f; 
      camera.directionX = sin(camera.angleY); 
      camera.directionZ = -cos(camera.angleY); 
      break; 
     case GLUT_KEY_UP: 
      camera.xPos += camera.directionX * fraction; 
      camera.zPos += camera.directionZ * fraction; 
      camera.yPos += camera.directionY * fraction; 
      break; 
     case GLUT_KEY_DOWN: 
      camera.xPos -= camera.directionX * fraction; 
      camera.zPos -= camera.directionZ * fraction; 
      camera.yPos -= camera.directionY * fraction; 
      break; 
     } 
} 

顯示回調函數,然後使用具有的gluLookAt下面的代碼:

glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 
    gluLookAt(camera.xPos, camera.yPos, camera.zPos, camera.xPos+camera.directionX, camera.yPos+camera.directionY, camera.zPos+camera.directionZ, 0, 1, 0); 

我不明白爲什麼我得到這個問題。我相信這是與設置相機和用於旋轉它的數學之間的相互作用有關。任何人都可以看到如何防止這種方向跳躍?

我設置在鍵盤的回調函數的攝像頭位置,代碼如下:

if(key == '1') // Default View 
     camera = Camera(); 
    if(key == '2') // Ferris Wheel View 
     camera.setPosition(-0.8, 0.0, -0.6, 3.6, 3.6, 6.5); 
    if(key == '3') // Fountain Water View 
     camera.setPosition(0.9, 0.0, -0.4, -0.59, -6.4, 0.6); 

回答

2

跳躍是因爲你是如何初始化你directionZ變量,看一下:

angleX = 0.0; 
    angleY = 0.0; 
    directionX = 0.0; 
    directionZ = -5.0; 
    directionY = 0.0; 

但後來您將directionX和directionZ定義爲:

camera.directionX = sin(camera.angleY); 
camera.directionZ = -cos(camera.angleY); 

cos是有界的o n層間[-1,1],並且由於角度Y是0.0f,directionZ將被設置爲-1。如果你改變你的初始化代碼來設置directionZ = -1.0;你應該擺脫跳躍。

不明確設置方向。下面是從這個角度設置的角度和計算方向的一個例子:

void Camera::setPosition(float angle, float posX, float posZ, float posY) 
{ 
    xPos = posX; 
    zPos = posZ; 
    yPos = posY; 

    //compute instead of set based on angle 
    angleY = angle; 
    camera.directionX = sin(angleY); 
    camera.directionZ = -cos(angleY); 
} 
+0

道歉,因爲我可能是在我最初的問題was't清楚,但相機初始化後直是好的。按下後,例如'1'鍵,我調用setPosition()將攝像機設置到特定的位置。在設置此位置之後,攝像機將首先旋轉。我會修改我原來的問題。 – fanatic

+0

我明白了。問題在於你設置的值和你計算的值之間的跳轉。你在用setPosition()調用什麼? –

+0

在鍵盤迴調中,我會將代碼添加到原始問題中。 – fanatic