2011-12-15 6 views
7

私はゲーム開発に新しい経験があり、3D地形のモデリングに成功し、ゲーム世界で自由に動き回ることができるカメラを持っていますが、私は把握することができません。3Dゲームでのストラッピング/サイドステッピングの処理

次のように現在、/後方前方に移動するために、私はメソッドを持っています:

のVector3は、単純なX、Y、Zの構造体であり、ラジアン度がある
void Player::moveForward(const float speed) 
{ 
    Vector3 pos = getPosition(); 

    float cosYaw = cosf(degreesToRadians(m_yaw)); 
    float sinYaw = sinf(degreesToRadians(m_yaw)); 
    pos.x += float(cosYaw)*speed; 
    pos.z += float(sinYaw)*speed; 

    setPosition(pos); 
} 

:へ

inline float degreesToRadians(const float degrees) { 
    const float PIOver180 = 3.14159f/180.0f; 
    return degrees * PIOver180; 
} 

を前進するハンドル私は単純に引数に正のfloatを置き、負のfloatを後ろに移動します。

私はコースの前後に移動することができます - 私はまた、位置のpos.yを変更することによって上方に移動することができますが、左右のステップ/邪魔をする方法を理解できません。私はヨーは360/0、270、180又はしかしどこにでもそれらが角度と90が設けられてサイドステップにできることでxz結果を反転

は/転送-サイドステップ/後方サイドステップ又は前進するカメラを引き起こします後方に。

とにかく、これは私は紙の上で解決策を見つけることを試み、私を悩ませていた - これは働いていた:

inline float degreesToStrafe(const float degrees) 
{ 
    const float PIOver90 = 3.14159f/90.0f; 
    return degrees * PIOver90; 
} 

をしかし、ゲームでは、これは正確にxz結果を交換すると同じです。

ご協力いただければ幸いです。私はこれについてウェブ上で何かを見つけようと苦労しましたが、私は間違って検索していた可能性があります!

答えて

6

xとzの結果を入れ替えることはできません。 cosYaw == sinYaw:それらを反転すると、unflippedと同じ方向になります。これは、ベクトルを同じ方向に移動させずに90度移動しようとしているため、明らかに望ましくない動作です。

代わりに、あなたはMoveForwardのためにやっているのと同じことをやりたいのですが、最初にヨーを90度回転させてください。基本的に既知の合成速度をxとz成分に分解しています。角度を知っているので、これを行うことができます。前進と後退の間の角度の違いを考慮すると、90度なので、ヨーに90度を差し引くか、または同じ計算を使用します。

void Player::strafe(const float speed) 
{ 
    Vector3 pos = getPosition(); 

    float cosYaw = cosf(degreesToRadians(m_yaw - 90.f)); 
    float sinYaw = sinf(degreesToRadians(m_yaw - 90.f)); 
    pos.x += float(cosYaw)*speed; 
    pos.z += float(sinYaw)*speed; 

    setPosition(pos); 
} 
+0

ありがとうございました! – krslynx

+0

パーフェクト。ありがとう=] – Hobbes

関連する問題