/ / 4x4 3D行列操作 - C#、オブジェクト、行列、3D

4x4 3Dマトリックス操作 - c#、オブジェクト、マトリックス、3d

私は現在、C#のゲームプロジェクトに取り組んでいます。私は3D空間でカメラを動かすことに取り組んでいます。私は4x4の世界的な世界の行列を持っています。私はこの行列が空間内のオブジェクトの平行移動と回転を処理することを理解しています。私は現在、3行目がオブジェクトの位置を処理しているので、カメラをxyz平面に沿って移動できることを知っています。しかし、私はローカル軸とグローバル軸の両方に沿ってカメラを回転させたい。参照する この 私はカメラをどのように回転させるか考えています。 しかし、私は、行列と、さまざまな行と列が翻訳と回転に関して何を表しているのかをはっきりと理解したいと思います。また、4x4マトリックスにカメラのローカル位置とグローバル位置の両方に関する情報が含まれているかどうかを知りたい。意味は、行列を操作して、カメラを外部の軸または点の周りで回転させることができますか?この行列を与えられたカメラにどれくらいのことをすることができますか

回答:

回答№1は0

3Dグラフィックスでは、回転は行列ではなく四元数で表されます。四元数を操作する関数のセットがあります。

あなたはできる 任意の軸に沿って回転を実行する あなたはクォータニオンで欲しいです。あなたは簡単に組み合わせることができます(行列にはほとんどあり得ません)でも四元数を補間することができます。

クォータニオンは行列に変換できます。任意の回転行列を生成する方法。 オブジェクトに回転を適用したり、回転や回転などを別の変換(換算やスケーリングなど)と組み合わせたい場合は、最初に四元数を行列に変換する必要があります。

DirectX SDKは、実際に使用しているAPIにかかわらず、行列と四元数に関する情報の素晴らしいソースです。数学はすべての3D APIで統一されています。

行列の行/列の意味についてのあなたの質問に: 行列は、オブジェクトのジオメトリ中心以外の点を横切るスケーリングまたは回転を含む、非常に複雑な変換を表すことができます。そのような方法で行列を考えるべきではありません。複雑な行列を単純な行列の積として考えるべきです。


回答№2の場合は0

実際の(1)の質問に答えると、3D数学はあなたが考えるよりもはるかに複雑です。

今のところクォータニオンを無視すると、マトリックスは以下の点で考えることができます:

Rx Ry Rz 0
Ux Uy Uz 0
Ax Ay Az 0
Px Py Pz 1

またはそれは上記の転置かもしれません、それはどのようにシステムをセットアップするかによって異なりますが、最終的には実際にはほとんど差がなく、ハードウェアによって大きく左右されます。 Rは右軸、Uは上軸、AはAt軸、Pは位置です。 x、y、zサフィックスは各ベクトルの成分です。これは非常に簡単に視覚化することができます:回転を定義するための最初の3つの直交単位ベクトルの集合を考え、最後は行列が世界にあり、それが上記の行列です。

上記の周りに頭を浮かべたら、移動するのがかなり簡単になるはずですが、それを回転させることははるかに複雑です。

 A = |target pos - camera pos| (pos is bottom row here)

RとUは、Aと正しい方向を指すグローバル軸との外積です。

行列は任意の軸を中心に回転することができます(これに言及するローカル軸とグローバル軸)が、計算は非常に複雑です(この答えには複雑すぎます)。

このサイトの詳細は次のとおりです。 ウィキペディア ここには、いくつかの標準マトリックス操作がリストされています。また、Wolframのサイトでもっと深い議論をしてみることもできます。見てみると、確かにオンラインで良いリソースがあります。

行列を乗算することができ、結果効果的には、各マトリックスが独自に行うアクションの組み合わせです。だから、一般的な動き(単位、方向部分のための軸に沿ったベクトル)で1つの行列を持つことができ、別の行列は(0,0,0)で回転行列になる可能性があります。これらの2つの積は、移動および回転行列になります。これは、オブジェクト階層がどのように機能し、オブジェクトの配置が世界で機能するかです。また、アニメーションにも使われています。

あなたが使用しているAPIは、任意の軸について行列を回転させるAPIを提供する必要がありますが、何が起こっているのかを知るのに便利です。

いったんすべてのことを頭に入れたら、四元数を見ることができます。行列を使って行うことができない四元数では何もできません。

(1)私が言うことができる限り