0

そのため、すべてのオブジェクトを保持するシーン グラフがあり、すべてに独自のマトリックス クラスを使用する必要があります (要件であるため、任意ではありません。学校)。すべての数学クラスを作成しましたが、Matrix Stack を正確にコードに実装する方法がわかりません。

私はそれがどのように機能するかについて理論的に理解しています。基本的に、私のシーンはアイデンティティ マトリックスです。次に、Matrix 4 クラスを使用して作成したカメラ マトリックスを取得する必要があります。それから、シーン グラフと glMultMatrix の各レベルをその親と共にループする必要があります。

それは正しい方向に進んでいると思いますが、これまでコーディングしたことがなく、その背後にある理論を研究しただけです。

私はこれで正しい軌道に乗っていますか?

これが見えるはずです。

Identity Matrix -> Camera Matrix -> For Each Object Reset back to Identity Matrix -> Camera Matrix -> Translate からマトリックスを生成し、Quaternion と Identity Matrix を乗算します -> Camera Matrix。子ごとに、変換から行列を生成し、それを親の行列とクォータニオンで乗算します

したがって、基本的に glMatrixMode はありません。シーン グラフのために存在するマトリックス スタックだけです。

これが正しい軌道に乗っていることを願っています。

4

2 に答える 2

1

シーンは恒等行列です

いいえ、恒等行列は単なる行列であり、乗算しても何も変わりません。

シーン グラフと glMultMatrix の各レベルをその親と共にループする必要があります。

あまり。独自の行列計算を行うという考えは、OpenGL が何かを行うことに依存しないことです。これには、行列の乗算が含まれます。実際に OpenGL 固定関数行列を使用する場合は、glLoadMatrix を使用します。ただし、最新の方法を使用することをお勧めします。シェーダーを使用し、マトリックスをユニフォームとして提供します。

変換パイプラインの仕組みの要約として、https://stackoverflow.com/a/13223392/524368を参照してください。

これが正しい軌道に乗っていることを願っています。

ほとんどの場合、あなたは少し複雑に考えすぎています。独自の行列計算を行うことの良い点は、物事をどのように実装するかについて非常に自由であることです。

個人的には、インプレース演算のファンです。このパラダイムを使用すると、マトリックス階層の各ステップで下位レベルのコピーを取得し、そのレベルで変更を行います。このようなツリーはうまくトラバースされます。そして、描画操作ごとに、変換階層ツリーのブランチ/リーフでマトリックスをロードするだけで、現在トラバースしています。そして、それぞれを描画した後、リセットする必要はありません。次のものをロードするだけで、中間結果のメモリを解放することができます。

于 2012-11-06T23:32:07.677 に答える
0

さて、あなたは正しい道を進んでいますが、ほとんどの場合、処理が少し異なります。

スタックの一番上がアクティブ マトリックスであると仮定します。そのため、最初に単位行列を含むスタックがあります。プッシュ コールとポップ コールに精通している必要があります。これらは基本的に次のことを行います。

push(Matrix m)
{
    newMatrix = stack.top() * m; //Or the other way round. This depends on the matrix definition and the function of the * operator
    put newMatrix on stack;
}
pop()
{
    remove first element from stack;
}

最初に射影行列とビュー行列が必要であることは既に確認しました。そう:

push(cameraMatrix);

その後、シーン グラフを反復できます。各子に対して次のメソッドを呼び出す単純な再帰的反復があると仮定します。

iterate_node(node)
{
    generate matrix from translate and quaternions
    push(matrix);
    for each (children of this node)
        iterate_node(child)
    next
    pop();
}

したがって、ノードに入るとノードのマトリックスがスタックに追加され、そこから出るとマトリックスが削除されます。このようにして、任意の深さと複雑さのグラフを作成できます。各マトリックスが子の変換に影響を与えることはすでにお気づきでしょう。

于 2012-11-06T23:31:33.950 に答える