1

使用言語/ライブラリ: C++、OpenGL、GLUT

よし、契約だ。

炎を生成するためにアルファ ブレンド テクスチャを発射するパーティクル システムがあります。システムは、タイムアライブ、ライフ、xyz、スプレッドなどの非常に基本的なもののみを追跡します。

炎が現在動いている方向は、私のコードで起こっている他のことに純粋に基づいています(私は推測します)。

ただし、私の目標は、炎をカメラに取り付け (完了)、カメラが向いている方向に炎を向けることです (動作していません)。

x、y、z の両方で glRotate を試しましたが、正しく動作しません。

現在、gluLookAt を使用してカメラを移動し、glTranslatef(camX, camY - offset, camZ); を呼び出すことで炎をカメラの XYZ に追従させています。

カメラで炎の方向を回転させる方法についての提案は大歓迎です。

ほとんど関係ありませんが、ここに画像があります(念のため) http://i.imgur.com/YhV4w.png

4

1 に答える 1

1

炎のパーティクルの向きを変更する方法を理解するには、カメラの向きを知る必要があります。基本的に、カメラの回転行列を逆にする必要があります。これを行う場合、変換のコピーをローカルに保持して、カメラの回転にすばやくアクセスできるようにします。別の方法は、変換行列を読み取り、行列から逆回転を計算することです。

static void inverseRotMatrix(const GLfloat in[4][4], GLfloat out[4][4])
{
    out[0][0] = in[0][0];
    out[0][1] = in[1][0];
    out[0][2] = in[2][0];
    out[0][3] = 0.0f;
    out[1][0] = in[0][1];
    out[1][1] = in[1][1];
    out[1][2] = in[2][1];
    out[1][3] = 0.0f;
    out[2][0] = in[0][2];
    out[2][1] = in[1][2];
    out[2][2] = in[2][2];
    out[2][3] = 0.0f;
    out[3][0] = 0.0f;
    out[3][1] = 0.0f;
    out[3][2] = 0.0f;
    out[3][3] = 1.0f;
}

void RenderFlame() 
{
    GLfloat matrix[4][4];
    GLfloat invMatrix[4][4];
    glGetFloatv(GL_MODELVIEW_MATRIX, matrix[0]);

    inverseRotMatrix(matrix, invMatrix);

    glPushMatrix();

    // glMultMatrixf(invMatrix[0]); If you want to rotate the entire body of particles

    for ... each particle
        ...
        glTranslatef(particleX, particleY, particleZ);
        glMultMatrixf(invMatrix[0]);

        DrawParticle();

        ...

     glPopMatrix();
}

これは、あなたが何をしているかにもよりますが、うまくいくかもしれませんし、うまくいかないかもしれません。粒子があらゆる方向に広がる場合は問題ありませんが、炎が基本的に平らである場合は、別の問題が発生します。これでできることは、各パーティクルが画面に向くように回転することだけです。カメラを回転させるだけなら問題なく動作します。カメラを動かす場合は、炎の中心点を中心にすべての点を回転させる必要があります。しかし、これは回転行列を逆にすることで必要な回転を提供します。それは単に変換を適用する回数の問題です。(別の回転を適用してパーティクル全体を回転させるというコメントを追加しました)

于 2012-03-05T01:35:01.530 に答える