ゲーム世界の3次元座標を画面座標に変換する原理の分析:三角関数変換と行列変換

3Dゲームでゲームキャラクターの敵のxyz座標を取得した後、画面に直接描画することはできません。一連の変換アルゴリズムが必要です。現在の主流のアルゴリズムには、三角関数変換と行列変換が含まれます。三角関数変換方法は次のとおりです。 。時代遅れと面倒な使用することをお勧めは、この記事では主にマトリックス変換の原則を語ります

 

1.ゲーム内の複数の座標行列の変換関係

CEは、世界空間座標の敵ゲーム、つまり、ゲーム世界空間座標XYZ、セグメンテーションアルゴリズムパースペクティブNDC座標、ウィンドウの座標、最後にマッピングによって取得された変換行列クリップ空間座標(座標せん断)によって見つけることができます。行列NDC、つまり画面座標を取得します

 

第二に、D3Dとopenglのマトリックスストレージフォーム

 Direct3Dは行メジャーストレージを使用します

「エフェクトマトリックスパラメーターとHLSLマトリックス変数は、値が行メジャーマトリックスか列メジャーマトリックスかを定義できます。ただし、DirectX APIは、常にD3DMATRIXとD3DXMATRIXを行メジャーとして扱います。」

OpenGLはColumeメジャーストレージを使用します

「mパラメーターは、列優先の順序で格納された単精度または倍精度の浮動小数点値の4x4行列を指します。つまり、マトリックスは次のように保存されます。」

  格納順序は、線形代数の行列が線形メモリ配列に格納される方法、d3dが配列の各行を行ごとに格納する方法、およびOpenGLが配列の各行の各列を格納する方法を説明します。

  したがって、スレッド代数の同じ行列の場合、d3dとOpenGLには異なる表現があります。

                  行置換マトリックス:a11、a12、a13、a14 d3d保存:a11、a12、a13、a14 OpenGL保存:a11、a21、a31、a41 
                       a21、a22、a23、a24 a21、a22、a23、a24 a12、a22、a32 、a42 
                       a31、a32、a33、a34 a31、a32、a33、a34 a13、a23、a33、a43 
                       a41、a42、a43、a44 a41、a42、a43、a44 a14、a24、a34、a44

 

3.アルゴリズムの実装プロセス(例としてD3Dを取り上げます)

1.敵の世界座標がX、Y、Z、Wであると仮定します。その中で、Wは2番目のアイテムであり、通常は1に設定されます(これはD3D仕様の場合であり、これは問題ではありません)。

2.切断座標を計算します。

切削座標X = a11 * X + a12 * Y + a13 * Z + a14

せん断座標Y = a21 * X + a22 * Y + a23 * Z + a24

せん断座標Z = a31 * X + a32 * Y + a33 * Z + a34

切削座標W = a41 * X + a42 * Y + a43 * Z + a44

(ここでのフィルター条件の設定に注意してください。以下の操作を続行できるのは、w> 0の切削座標のみです。0未満の座標は、あなたの視点ではないため無視できます。PS:信じていない学生は試すことができます。最後に追加する場合と追加しない場合の違い)

3. NDC座標を計算します:(パースペクティブセグメンテーションアルゴリズム:せん断座標XYZをWで除算します)

NDC座標X =せん断座標X /せん断座標W

NDC座標Y =せん断座標Y /せん断座標W

NDC座標Z =せん断座標Z /せん断座標W

4.NDC座標を画面座標に変換します。

換算式は次のとおりです。

画面座標。x=ウィンドウ幅÷2×NDC座標。x+ NDC座標。x+ウィンドウ幅÷2
画面座標。y=-(ウィンドウ高さ÷2×NDC座標。y)+ NDC座標。y+ウィンドウ高さ÷ 2

これまで、世界座標を画面座標に変換するためのアルゴリズムについて説明してきました。

 

 

 

座標をスクリーニングするためのNDCに関心がある場合は、引き続き見下ろすことができます。

4、式分析をスクリーニングするためのNDC

 

図に示すように、ビューポート変換行列ViewPortとNDC座標の行列乗算によって上記の式を取得できますが、この行列乗算から画面座標Yの式を導出することはできません。式の前の記号に注意してください。 :画面座標.y =(ウィンドウ高さ÷2×NDC座標.y)+ NDC座標.y +ウィンドウ高さ÷2

行列乗算の推論によれば、負の符号があってはなりませんが、次の理由でここに負の符号があります。

まず、通常の画面座標系と画面ビューポート座標系の違いを広めます。

このことから、VIewPortを使用した行列乗算演算では、Yは元の演算の反対である必要があることがわかります。

[バツ、

そして;

から、

1]垂直行列のyに記号を追加し、行列の乗算を行うと、上記の正しいアルゴリズム式を取得できます。

 

 

 

参照:

https://www.bilibili.com/video/BV1UK4y1D781/?spm_id_from=trigger_reload

https://www.cnblogs.com/icmzn/p/13531265.html

https://space.bilibili.com/442168898/channel/detail?cid=123750

https://www.bilibili.com/video/av286268338/

 

 

 

 

おすすめ

転載: blog.csdn.net/THMAIL/article/details/114462827