2011-05-25 11 views
3

私はカメラクラスを作成しました。私のマウスで360度回転させて上下に動かすことができます。ちょうど私が意図したとおり、すべてのゲームのように。また、すべてのゲームのように前後に移動することもできます。しかし、私はどのように左右に移動する実装するのか分からない。strafeを実装する - Opengl - カメラ

私は、次の手順を実行します

これは、フレームごとに呼び出されます:

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

私の移動機能
doesntの仕事:

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

+0

@ user748790:完了。 –

+0

_viewX - = x、... - = y、...- = zでなければなりません。おそらくタイプミスでした。しかし、これは動作します、あなたの助けを大変ありがとうございます。 – fibera

関連する問題