2

これは私がオンラインでよく目にするトピックですが、ほとんどの Web サイトはこれを適切に説明していません。私は現在、ゼロから構築された 3D レンダラーの一部として独自の Camera クラスを作成しています (何が起こるかを理解するにはどうすればよいでしょうか?)。しかし、カメラのワールド マトリックスとビュー マトリックスを作成する際に問題が発生しました。

私が理解しているように、カメラのワールド マトリックスは基本的に、カメラをワールド空間内の必要な場所に配置するマトリックスです。これは、何かをその位置にその向きに従ってレンダリングする必要がある場合にのみ必要です。一方、View マトリックスは、カメラをその位置からワールド空間の原点に配置するマトリックスであり、z 軸に沿ってある方向または別の方向 (右利きの場合は負、左利きの場合は正、I信じる)。私はこれまでのところ正しいですか?

位置が m_Eye として定義され、lookat が m_LookAt として定義されたマトリックスが与えられた場合、どのようにワールド マトリックスを生成しますか? さらに重要なことに、高価な逆操作を実行せずにビュー マトリックスを生成するにはどうすればよいでしょうか。回転要素の逆はその転置に等しいことを知っているので、それを考慮に入れると考えています。とにかく、これは私がいじっていたコードです。余談ですが、右手座標系を使用しています。

次のコードは、適切なローカル座標軸を生成する必要があります。

m_W = AlgebraHelper::Normalize(m_Eye - m_LookAt);
m_U = AlgebraHelper::Normalize(m_Up.Cross(m_W));
m_V = m_W.Cross(m_U);

次のコードは、これまでのところ、World マトリックスを生成するために持っているものです (注: 行ベースのマトリックスも使用するため、m_12 は最初の行と 2 番目の列を示します)。

Matrix4 matrix = Matrix4Identity;
matrix.m_11 = m_U.m_X;
matrix.m_12 = m_U.m_Y;
matrix.m_13 = m_U.m_Z;

matrix.m_21 = m_V.m_X;
matrix.m_22 = m_V.m_Y;
matrix.m_23 = m_V.m_Z;

matrix.m_31 = m_W.m_X;
matrix.m_32 = m_W.m_Y;
matrix.m_33 = m_W.m_Z;

matrix.m_41 = m_Eye.m_X;
matrix.m_42 = m_Eye.m_Y;
matrix.m_43 = m_Eye.m_Z;

これは World マトリックスを計算する良い方法ですか?その後、View マトリックスを抽出するにはどうすればよいですか?

この件についてご協力いただきありがとうございます。

4

0 に答える 0