2013-07-23 48 views
1

我正在一個FPS風格的相機上使用OpenGL在我的3D場景飛行。我正在使用GLM來進行數學運算,並且我使用鼠標移動來計算glm :: rotate在x軸和y軸上的方向向量。我有一個靜態向上矢量,因爲我對橫軸上的掃射很好,並且不需要任何滾動。GLM ::的lookAt垂直相機翻轉,在z <= 0

然而,當我向前朝負z方向和我最終到達攝像機的垂直翻轉場景(Z = 0)(y方向)的中心點。向下移動鼠標現在將導致向上運動。方向向量的計算就像他們應該這樣,我猜它與glm :: lookAt如何計算其視圖Matrix有關?

下面是相關代碼:

// Player movement 
glm::vec3 position(0.0f, 0.0f, 5.0f); 
glm::vec3 direction(0.0f, 0.0f, -1.0f); 
glm::vec3 up(0.0f, 1.0f, 0.0f); 
float speed = 0.05f; 
bool warped = false; 
... 

void render() 
{ 
    ... 
    view = glm::lookAt(position, position + direction, up); 
    glUniformMatrix4fv(glGetUniformLocation(basicShader.shaderProgram, "view"), 1, GL_FALSE, glm::value_ptr(view)); 
    ...  
} 


void handleKeyboard() 
{ 
    float speed = 0.05f; 
    if(keys['w']) 
     position += speed * direction; 
    if(keys['s']) 
     position -= speed * direction; 
    if(keys['a']) 
     position -= speed * glm::cross(direction, up); 
    if(keys['d']) 
     position += speed * glm::cross(direction, up); 
    if(keys['q']) 
     exit(1); 
} 

// Set with following callbacks: 
// glutMotionFunc(mouse); 
// glutPassiveMotionFunc(mouse); 
void mouse(int x, int y) 
{ 
    if(!warped) 
    { 
     float mouseSensitivity = 15.0f; 

     float horizontal = (width/2) - x; 
     float vertical = (height/2) - y; 

     horizontal /= mouseSensitivity; 
     vertical /= mouseSensitivity; 

     direction = glm::rotate(direction, horizontal, glm::vec3(0.0f, 1.0f, 0.0f)); 
     direction = glm::rotate(direction, vertical, glm::vec3(1.0f, 0.0f, 0.0f)); 

     warped = true; 
     glutWarpPointer((width/2), (height/2)); 
    } 
    else 
     warped = false; 
} 

回答

2

我不能完全確定是什麼問題,但是當我使用注視一個FPS凸輪我還包括前向單位向量。

EG(從一些代碼複製相關的段我有) - 使用四元(定向),但我敢肯定,矩陣將具有相同的結果)

static glm::vec3 defaultUpVector() { return glm::vec3(0, 1, 0); } 
static glm::vec3 defaultForwardVector() { return glm::vec3(0, 0, -1); } 

pUpVector = defaultUpVector() * orientation; 
pLookAt = position + (defaultForwardVector() * orientation); 
pView = glm::lookAt(position, pLookAt, pUpVector); 

upvector和LOOKAT都是VEC3,並查看是MAT4

希望這有助於。

編輯:我注意到您使用的是方向,所以我可能會看在您使用旋轉。如果你決定使用季銨鹽

這將設置爲FPS凸輪四元沒有卷

pLocalOrientation = 
    glm::angleAxis(pLocalEularAngles.x, glm::vec3(1, 0, 0)) * 
    glm::angleAxis(pLocalEularAngles.y, glm::vec3(0, 1, 0)); 

pLocalOrientation ==方向(爲例子)

+0

我喜歡這個主意,想看看是否正向矢量將解決我的問題,但並沒有unfortanetly,據我可以看到我的旋轉是OKE。除了翻蓋外,一切都很完美。方向矢量即使在翻轉後也是一樣的。我還沒有開始quaternions,所以這是一個不行了:) –

+0

我推薦quats爲這些目的。 (pLocalOrientation = glm :: quat(glm :: radians(pRotationIncr))* pLocalOrientation;) - 如果你需要的話,會做6dof。 pRotationIncr =在幀中旋轉的量(vec3)。 – Rebirth

+0

我知道,從我聽說四元數似乎消除了所有的問題矩陣和eular角度有更少的代碼(AFAIK),我最終會開始學習這些,但此刻我正在學習OpenGL,我會學習它當時只有一步:) quats是爲了以後;)它不是不可能得到一個體面的FPS相機,我只是有一個奇怪的bug :) –