-1

紹介: 私は、opengl で小さなタワー ディフェンス ゲームを開発しています。現在、ちょっとした問題に絶望しています....

タワーからの発射物は、頭をユニットに向けて照準を合わせてほしい。したがって、私の問題は数学的なものですが、openglに属しています:)

次のアイデアがありました。ドット積を使用して、x 軸を中心に回転する角度を取得して、地面までまっすぐまたは平らな距離に応じて頭を取得し、その後、矢印の頭が y 軸を中心に回転する追加の角度を取得できます。狙っているユニットに合わせて毎回調整します。

X 軸を中心とした回転角度のコード (x 軸を中心に回転することで頭の高さ (Y) が変化するため、m_fYNeigung と呼びます) は次のようになります。

plocalTowerArray[(sizeMapIndexY * 12) + sizeMapIndexX].Projektils[byteProjectilIndex].m_fYNeigung = 
RADIANS_TO_DEGREES (acos ((float)
        (
            (faTowerPosition[0]) * (plocalTowerArray[(sizeMapIndexY * 12) + sizeMapIndexX].Projektils[byteProjectilIndex].m_faProDirectionVector[0]) +
            (faTowerPosition[1] - 1) * (plocalTowerArray[(sizeMapIndexY * 12) + sizeMapIndexX].Projektils[byteProjectilIndex].m_faProDirectionVector[1]) +
            (faTowerPosition[2]) * (plocalTowerArray[(sizeMapIndexY * 12) + sizeMapIndexX].Projektils[byteProjectilIndex].m_faProDirectionVector[2])
        )
        /
        (
            fabs (faTowerPosition[0]) * fabs (plocalTowerArray[(sizeMapIndexY * 12) + sizeMapIndexX].Projektils[byteProjectilIndex].m_faProDirectionVector[0]) +
            fabs (faTowerPosition[1] - 1) * fabs (plocalTowerArray[(sizeMapIndexY * 12) + sizeMapIndexX].Projektils[byteProjectilIndex].m_faProDirectionVector[1]) +
            fabs (faTowerPosition[2]) * fabs (plocalTowerArray[(sizeMapIndexY * 12) + sizeMapIndexX].Projektils[byteProjectilIndex].m_faProDirectionVector[2])
        )
));    

ここで、faTowerPosition は最初のベクトルで、タワーの最上部から下を向いています (矢印も faTowerPosition[X/Y/Z] から始まります)。内積の 2 番目のベクトルは m_faProDirectionVector で、ルートを表す正規化された方向ベクトルです。タワーからユニットへの矢印の。

Opengl Drawing 部分は、次のように単純に見えます。

        for (sizeJ = 0; sizeJ < localTowerArray[sizeI].m_byteProjectilAmount; sizeJ++)
        {
            if (localTowerArray[sizeI].Projektils[sizeJ].m_bOnFlight == true)
            {
                glPushMatrix();
                glTranslatef (localTowerArray[sizeI].Projektils[sizeJ].m_faProPosition[0], localTowerArray[sizeI].Projektils[sizeJ].m_faProPosition[1], localTowerArray[sizeI].Projektils[sizeJ].m_faProPosition[2]);
                //glRotatef (360.0f - localTowerArray[sizeI].Projektils[sizeJ].m_fXNeigung, 0, 1, 0);
                glRotatef (localTowerArray[sizeI].Projektils[sizeJ].m_fYNeigung, 1, 0, 0);
                    DrawWaveFrontObject (m_pArrowProjektilObject);
                glPopMatrix();
            }
        } 

角度に対して行っている計算は無視してください。矢印の動作を実験するために行っただけです。矢印によって動作が異なるように見えることに気付きました (言う必要があります: ビルド可能なマップはスケーリングされます)。 x: -3.4 から 3.4 および z から 4 から -4) タワーが構築されたコード -x/z、-z/x、z/x、-z/-x これらのケースはすべて異なると思いますが、少なくともユニットがタワーの左側または右側を走っているかどうかに応じて、演技も異なります....このように内積を使用して思い出させるのを忘れていたことは何ですか?

4

1 に答える 1