2011-05-25 65 views
3

我創建了一個相機類。可以用鼠標旋轉360度並上下移動。就像我的意圖一樣,就像所有的遊戲一樣。就像在所有的遊戲中一樣,前進和後退也是可能的。但我不知道如何實現左右移動。執行strafe - Opengl - 相機

我做到以下幾點:

這被稱爲每一幀:

gluLookAt(_posX , _posY , _posZ, 
      _viewX, _viewY, _viewZ, 
      _upX, _upY, _upZ); 

我的移動功能
不工作:

void Camera::moveLeft() 
{ 

    float rot= (_viewY/180 * PI); 
    _moveX -= float(cos(rot)) * 0.5; 
    _moveZ -= float(sin(rot)) * 0.5; 
} 

不工作
向前移動場景:

​​3210

當我只用鼠標移動時,沒有問題。但是,如果我使用這個功能,並用我的鼠標旋轉,我得到一些奇怪的相機運動

任何想法如何解決這個問題?

謝謝

@edit

所以我刪除了glTranslated聲明,我改變了我的moveLeft功能如下:

void Camera::moveLeft(){

float x = ((_viewY * _upZ) - (_viewZ * _upY)); 
float y = ((_viewZ * _upX) - (_viewX * _upZ)); 
float z = ((_viewX * _upY) - (_viewY * _upX)); 

float magnitude = sqrt((x * x) + (y * y) + (z * z)); 

x /= magnitude; 
y /= magnitude; 
z /= magnitude; 

_posX -= x; 
_posY -= y; 
_posZ -= z; 

}

我清楚地做一些錯誤的,因爲運動左右是「更好」,但仍然不是你所期望的。

回答

5

要獲得一個向量,該向量與包含向上視圖向量的平面成90度角,則需要執行交叉產品:http://en.wikipedia.org/wiki/Cross_product。任何像樣的矢量數學圖書館都有這個功能。

生成的向量可以是左向量或右向量(嘗試它並找出哪個),然後根據需要將它添加到您的位置。

請注意,如果您的視圖矢量與向上矢量完全相同,那麼這將不起作用。

編輯:根據您編輯的問題我認爲你需要做的是:

你需要獲取視圖方向矢量和使用,與其在交叉產品視圖載體,然後添加到無論是位置和視圖矢量:

void Camera::moveLeft() 
{ 

    float viewX = _viewX - _posX; 
    float viewY = _viewY - _posY; 
    float viewZ = _viewZ - _posZ; 

    float x = ((viewY * _upZ) - (viewZ * _upY)); 
    float y = ((viewZ * _upX) - (viewX * _upZ)); 
    float z = ((viewX * _upY) - (viewY * _upX)); 

    float magnitude = sqrt((x * x) + (y * y) + (z * z)); 

    x /= magnitude; 
    y /= magnitude; 
    z /= magnitude; 

    _posX -= x; 
    _posY -= y; 
    _posZ -= z; 

    _viewX -= x; 
    _viewY -= y; 
    _viewZ -= z; 
} 
+0

如果你有時間,我已經編輯它,你能再次閱讀我的問題嗎?謝謝 – fibera 2011-05-25 15:46:43

+0

@ user748790:完成。 – 2011-05-25 15:57:04

+0

它必須是_viewX - = x,...- = y,...- = z。可能是一個錯字。但是,這工作,非常感謝你的幫助。 – fibera 2011-05-25 16:07:30