2

私は元々、オブジェクトの原点、前方、上方向を表す 3 つのベクトルを使用して、オブジェクトの原点と方向を 3D 空間に格納しました。

モデルビュー マトリックス スタックに正しい変換を適用するには、これら 3 つのベクトルを使用してアフィン変換マトリックスを構成します。

平行移動は簡単ですが、(回転の角度と軸に応じて) 正しい回転行列を作成し、これらの 3 つのベクトルに適用することで、回転が適用されます。

非常に多数のオブジェクトに対してこのメ​​ソッドを使用していますが、回転/アフィン行列の構成がパフォーマンスのボトルネックを引き起こしています。

向きを保存するためのより賢明で効率的な方法があるかどうか疑問に思っていますか?

4

4 に答える 4

6

私は元々、オブジェクトの原点、前方、上方向を表す 3 つのベクトルを使用して、オブジェクトの原点と方向を 3D 空間に格納しました。

つまり、3×3 行列を格納しています。OpenGL が使用する行列は 4×4 ですが、まったく同じですが、唯一の違いは、要素 4,4 が常に 1 であり、要素 0...3,4 がすべて 0 であり、最初の列 0,0...3 は forward と up の外積で、通常はrightと呼ばれます。

これは、実際には、3D 空間でのオブジェクトの配置を表す最も簡潔で直接アクセスできる方法です。次に、単一の行列乗算を実行することにより、あらゆる種類の変換を適用できます。

別の方法は、クォータニオンをオフセット ベクトルと一緒に使用することです。ただし、オブジェクトを平行移動可能にする場合は、四元数を行列に変換する必要があります (または、変換階層のために多くの平行移動/回転の組み合わせを連鎖させることもできますが、行列を使用すると実際にはオーバーヘッドが少なくなります)。

于 2012-05-08T19:26:30.333 に答える
4

メモリ以外に、4x4 アフィン行列全体を保存するのを妨げているものは何ですか?

さらに良いことに、配列が正規化されている場合、通常 [0, 0, 0, 1]は一番下の行が表示されるため、一番上の 3 行のみを格納する必要があることを ISTR は示しています。

于 2012-05-08T18:04:23.613 に答える
2

クォータニオンはおそらく、向きを格納する最も自然で効率的な方法です (すべての点で、前方/上向きベクトルよりも優れているはずです)。クォータニオンは、格納するために 4 つの値を取り、10 回の乗算と 15 回の加算を行って 3x3 回転行列に変換します。除算や超越関数は必要ありません。

特にスペースが必要な場合は、残りの 3 つの値から単位四元数の最初の要素をロバストに生成できるため、おそらく 3 つの値だけで十分です。これには、さらに 3 つの乗算、3 つの加算、および平方根が必要です (この最初の要素が非負であることを確認する必要があるため、これも少し注意が必要です...)。

于 2012-05-09T21:34:01.903 に答える
1

グローバル メモリへのアクセスがローカル メモリへのアクセスよりもはるかに遅い現在の GPGPU では、Quaternions 変換は Matrix よりも高速である可能性があります。この表によると、計算量は 2 倍になりますが、フェッチする必要があるメモリは半分以下です。

レンダリングでは、頂点シェーダー ユニフォームがローカル メモリとして格納されます。ここで唯一合理的なのは、マトリックスの使用です。

于 2012-05-09T15:11:00.457 に答える