GAMES101 Notes_Lec03~04_Transform

1 なぜ変革を研究するのか なぜ変革を研究するのか

1.1 モデル変換のモデリング

  • シーン表示 - カメラの位置移動を説明します
  • ロボットダンス - オブジェクトの回転
  • ピクサーのオープニング アニメーション 電気スタンドが I の文字を押しつぶす - オブジェクトの拡大縮小

1.2 ビュー変換 表示

  • ラスター化されたイメージングには多数のビュー変換が含まれます
    ここに画像の説明を挿入

2 2次元変換 2次元変換

3B1B ライン生成の本質 (線形変換の視覚的理解): https://www.bilibili.com/video/BV1ns41167b9?spm_id_from=333.999.0.0

2.1 スケール変換行列 Scale Matrix

  • 不均一なロック率なし
    ここに画像の説明を挿入

( x ′ y ′ ) = ( sx 0 0 sy ) ( xy ) \begin{pmatrix} { } { x ^ { \prime } } \\ { y ^ { \prime } } \end{pmatrix} = \begin{ pmatrix} { } { s _ { x } } & { 0 } \\ { 0 } & { s _ { y } } \end{pmatrix} \begin{pmatrix} { } { x } \\ { y } \end {pマトリックス}(バツy)=(s×00sはい)(バツはい)

2.2 対称変換行列 反射行列

  • 水平方向の反射を水平方向に反転します。
    ここに画像の説明を挿入

( x ′ y ′ ) = ( − 1 0 0 1 ) ( xy ) \begin{pmatrix} { } { x ^ { \prime } } \\ { y ^ { \prime } } \end{pmatrix} = \begin {pmatrix} { } { - 1 } & { 0 } \\ { 0 } & { 1 } \end{pmatrix} \begin{pmatrix} { } { x } \\ { y } \end{pmatrix}(バツy)=(1001)(バツはい)

2.3 せん断マトリックス

  • 水平方向の変位は y=0 で 0、a は y=1 で、垂直方向の変位は常に 0 です。
    ここに画像の説明を挿入

( x ′ y ′ ) = ( 1 a 0 1 ) ( xy ) \begin{pmatrix} { } { x ^ { \prime } } \\ { y ^ { \prime } } \end{pmatrix} = \begin{ pmatrix} { } { 1 } & { a } \\ { 0 } & { 1 } \end{pmatrix} \begin{pmatrix} { } { x } \\ { y } \end{pmatrix}(バツy)=(10ある1)(バツはい)

2.4 回転変換行列 (デフォルトは原点回り、反時計回り方向) 回転行列

  • 回転角はθです
    ここに画像の説明を挿入

R θ = ( cos ⁡ θ − sin ⁡ θ sin ⁡ θ cos ⁡ θ ) R _ { \theta } = \begin{pmatrix} { } { \cos \theta } & { -\sin \theta } \\ { \ sin \theta } & { \cos \theta } \end{pmatrix}R=(コスコス)

2.5 線形変換 線形変換

  • 座標と行列を乗算する形式で、同じ次元の行列乗算を使用して、新しい座標を取得します
    ( x ′ y ′ ) = ( abcd ) ( xy ) \begin{pmatrix} { } { x ^ { \prime } } \\ { y ^ { \prime } } \end{pmatrix} = \begin{pmatrix} { } { a } & { b } \\ { c } & { d } \end{pmatrix} \begin{pmatrix} { } { x } \\ { y } \end{pmatrix}(バツy)=(あるcbd)(バツはい)

3 同次座標

3.1 なぜ同次座標を学ぶのか なぜ同次座標を学ぶのか

  • 平行移動変換は線形変換ではないため、行列形式で直接表現することはできません。
    ここに画像の説明を挿入

( x ′ y ′ ) = ( abcd ) ( xy ) + ( txty ) \begin{pmatrix} { } { x ^ { \prime } } \\ { y ^ { \prime } } \end{pmatrix} = \begin {pmatrix} { } { a } & { b } \\ { c } & { d } \end{pmatrix} \begin{pmatrix} { } { x } \\ { y } \end{pmatrix} + \begin{ pmatrix} { } { t _ { x } } \\ { ty } \end{pmatrix}(バツy)=(あるcbd)(バツはい)+(t×_)

  • 翻訳を特殊なケースにしたくない
  • すべての変換を表現する統一的な方法はありますか?またそのコストはどれくらいですか? すべての変換を表現する統一された方法はありますか? (コストはどれくらいですか?)

3.2 同次座標を通じて問題を解く 解決策: 同次座標

3.2.1 3 番目の座標の追加 3 番目の座標の追加 (w 座標)

2D 点 = ( x , y , 1 ) T , 2D ベクトル = ( x , y , 0 ) T \rm{2D\,point}=(x,y,1)^T,\quad\rm{2D \,ベクトル}=(x,y,0)^T2D _ポイント_ _ _ _=( x ,1 )2D _ベクトル_ _ _ _ _=( x ,0 )T

3.2.2 翻訳の行列表現

( x ′ y ′ w ′ ) = ( 1 0 tx 0 1 ty 0 0 1 ) ⋅ ( xy 1 ) = ( x + txy + ty 1 ) \begin{pmatrix} { } { x ^ { \prime } } \ \ { y ^ { \prime } } \\ { w ^ { \prime } } \end{pmatrix} = \begin{pmatrix} { } { 1 } & { 0 } & { t_x } \\ { 0 } & { 1 } & { t_y } \\ { 0 } & { 0 } & { 1 } \end{pmatrix}\cdot\begin{pmatrix} { } { x } \\ { y } \\ { 1 } \end{pmatrix } = \begin{pmatrix} { } { x + t_x } \\ { y + t_y } \\ { 1 } \end{pmatrix}バツyw=100010t×tはい1バツy1=バツ+t×y+tはい1

3.2.3 翻訳がベクトルの場合はどうなりますか? ベクトルを翻訳するとどうなるでしょうか?

  • ベクトルには平行移動不変性があり、平行移動変換後も元のベクトルのままです
    ( x ′ y ′ w ′ ) = ( 1 0 tx 0 1 ty 0 0 1 ) ⋅ ( xy 0 ) = ( xy 0 ) \begin{ pmatrix} { } { x ^ { \prime } } \\ { y ^ { \prime } } \\ { w ^ { \prime } } \end{pmatrix} = \begin{pmatrix} { } { 1 } & { 0 } & { t_x } \\ { 0 } & { 1 } & { t_y } \\ { 0 } & { 0 } & { 1 } \end{pmatrix}\cdot\begin{pmatrix} { } { x } \ \ { y } \\ { 0 } \end{pmatrix} = \begin{pmatrix} { } { x } \\ { y } \\ { 0 } \end{pmatrix}バツyw=100010t×tはい1バツy0=バツy0

3.2.4 同次座標の美しさ

  • w座標の結果が1または0の場合は有効な演算であり、平行移動変換の形式が均一になるだけでなく、ベクトルや点の加算・減算演算の操作性も維持されます。
  • 同次座標を使用する場合、(x, y, w) は平面 (x/w, y/w, 1) 内の点を意味し、w≠0
    • ベクトル + ベクトル = ベクトル 0+0=0
    • 点 – 点 = ベクトル 1-1=0
    • 点 + ベクトル = 点 1+0=1
    • ポイント + ポイント = ??

point+pointで得られる結果は2点を結ぶ線の中点になります(w座標は1に変更されます)

3.2.5 アフィン変換

  • アフィン変換 = 線形変換 + 平行移動変換 アフィン マップ = 線形マップ + 平行移動
    ( x ′ y ′ ) = ( abcd ) ⋅ ( xy ) + ( txty ) \begin{pmatrix} { } { x ^ { \prime } } \ \ { y ^ { \prime } } \end{pmatrix} = \begin{pmatrix} { } { a } & { b } \\ { c } & { d } \end{pmatrix} \cdot \begin{pmatrix} { } { x } \\ { y } \end{pmatrix} + \begin{pmatrix} { } { t_x } \\ { t_y } \end{pmatrix}(バツy)=(あるcbd)(バツはい)+(t×tはい)
  • 同次座標の使用:
    アフィン変換 : ( x ' y ' 1 ) = ( abtxcdty 0 0 1 ) ⋅ ( xy 1 ) \rm{Affine\;Transformations:}\begin{pmatrix} { } { x ^ { \prime } } \\ { y ^ { \prime } } \\ { 1 } \end{pmatrix} = \begin{pmatrix} { } { a } & { b } & { t _ { x } } \ \ { c } & { d } & { t _ { y } } \\ { 0 } & { 0 } & { 1 } \end{pmatrix} \cdot \begin{pmatrix} { } { x } \\ { y }\\{1} \end{pマトリックス}アフィン_ _ _ _ _トランスフォーム_ _ _ _ _ _ _ _ _ _ _ _ _バツy1=あるc0bd0t×tはい1バツy1

3.2.6 同次座標を使用した 2D 変換

スケール : S ( sx , sy ) = ( sx 0 0 0 sy 0 0 0 1 ) \rm{スケール:}S (s _ { x , } s _ { y } ) = \begin{pmatrix} {} { s _ { x } } & { 0 } & { 0 } \\ { 0 } & { s _ { y } } & { 0 } \\ { 0 } & { 0 } & { 1 } \end{pmatrix}スケールS ( s _ _ _ _× ,sはい)=s×000sはい0001

回転 : R ( α ) = ( cos ⁡ α − sin ⁡ α 0 sin ⁡ α cos ⁡ α 0 0 0 1 ) \rm{Rotation:}R ( \alpha ) = \begin{pmatrix} {} { \cos \soft } & { - \sin \soft } & { 0 } \\ { \sin \soft } & { \cos \soft } & { 0 } \\ { 0 } & { 0 } & { 1 } \end{ピマトリックス}回転: R ( a ) _ _ _ _ _ _ _=コスあるある0あるコスある0001

翻訳: T ( tx , ty ) = ( 1 0 tx 0 1 ty 0 0 1 ) \rm{翻訳:}T ( t _ { x , } t _ { y } ) = \begin{pmatrix} { } { 1 } & { 0 } & { tx } \\ { 0 } & { 1 } & { t _ { y } } \\ { 0 } & { 0 } & { 1 } \end{pmatrix}翻訳T ( t _ _ _ _ _ _ _ _ _ _× ,tはい)=100010×tはい1

同次座標のコストは、計算に含まれる追加の数値の導入です。

4 逆変換 逆変換

  • M − 1 M^{-1}M1は M 行列の逆行列であるだけでなく、行列の幾何学的逆行列でもあります
    ここに画像の説明を挿入

5 複合変換

5.1 変換の順序は結果に影響します。注文の問題を変革しましょう!

  • 平行移動してから回転する vs. 回転して平行移動する
    ここに画像の説明を挿入

  • 行列演算の観点から見ると、行列の乗算は交換法則を満たしていません 行列の乗算は可換ではありません
    R 45 ⋅ T ( 1 , 0 ) ≠ T ( 1 , 0 ) ⋅ R 45 R _ { 45 } \cdot T _ { ( 1 , 0 ) } \neq T _ { ( 1 , 0 ) } \cdot R _ { 45 }R4 5T( 1 , 0 )=T( 1 , 0 )R4 5

  • 行列は右から左に適用されることに注意してください。
    T ( 1 , 0 ) ⋅ R 45 ( xy 1 ) = ( 1 0 1 0 1 0 0 0 1 ) ( cos ⁡ 4 5 ∘ − sin ⁡ 4 5 ∘ 0 sin ⁡ 4 5 ∘ cos ⁡ 4 5 ∘ 0 0 0 1 ) ( xy 1 ) T ( 1 , 0 ) \cdot R _ { 45 } \begin{pmatrix} { } { x } \ \ { y } \\ { 1 } \end {pmatrix} = \begin{pmatrix} {} { 1 } & { 0 } & { 1 } \\ { 0 } & { 1 }&{0} \\ { 0 } & { 0 } & { 1 } \end {pmatrix}\begin{pmatrix} { } { \cos 45 ^ { \circ } } & { - \sin 45 ^ { \circ } } & { 0 } \\ { \sin 45 ^ { \circ } } & { \cos 45 ^ { \circ } } & { 0 } \\ { 0 } & { 0 } & { 1 } \end{pmatrix} \begin{pmatrix} { } { x } \\ { y } \\ { 1 } \end{p行列}T ( 1 ,0 )R4 5バツy1=100010101コス4 54 504 5コス4 50001バツy1

5.2 複合変換

  • アフィン変換 A 1、A 2、A 3 、...のシーケンスでは、最初に結合法則を使用して、結合された変換を表す単一の行列を取得できます。これはパフォーマンスの消費にとって非常に重要です。
    A n ( ⋯ A 2 ( A 1 ( X ) ) ) = A n ⋯ A 2 ⋅ A 1 ⏟ 事前乗算 ⋅ ( xy 1 ) A _ { n } ( \cdots A _ { 2 } ( A _ { 1 } ( X ) ) ) =\underbrace{ A _ { n } \cdots A _ { 2 } \cdot A _ { 1 } }_{\rm{前乗算}}\cdot \begin{pmatrix} {} { x } \\ { y } \\ { 1 } \end{pmatrix}( 2( A1( X ) ) )=事前複数実行_ _ _ _ _ _ _ 21バツy1

6 複雑な変換の分解 複雑な変換の分解

  • 与えられた点 c を中心に回転するにはどうすればよいでしょうか?
    • まず回転の中心を原点に移動します 中心を原点に移動します
    • 回転
    • 元の位置に移動します 元の位置に移動します
      ここに画像の説明を挿入

7 3D 変換 3D 変換

7.1 同次座標を使用して 3 次元空間内の点とベクトルを記述する

  • 再度同次座標を使用します。
    3D 点 = ( x , y , z , 1 ) T , 3D ベクトル = ( x , y , z , 0 ) T \rm{3D\,point}=( x,y,z, 1)^T,\quad\rm{3D\,vector}=(x,y,z,0)^T3D_ _ポイント_ _ _ _=( x ,z 1 )3D_ _ベクトル_ _ _ _ _=( x ,z 0 )T
  • 同次座標を使用する場合、(x、y、z、w) は 3 次元空間内の点 (x/w、y/w、z/w) を表します。w≠0
  • アフィン変換には 4×4 行列を使用します
    ( x ′ y ′ z ′ 1 ) = ( abctxdeftyghitz 0 0 0 1 ) ⋅ ( xyz 1 ) \begin{pmatrix} {} { x ^ { \prime } } \ \ { y ^ { \ プライム } } \ \ { z ^ { \ プライム } } \\ { 1 } \end{pmatrix} =\begin{pmatrix} { } { a } & { b } &{c}&{t_{x} }\\{d}&{e}&{f}&{t_{y}}\\{g}&{h}&{i}&{t_ { z } } \\ { 0 } & { 0 } & { 0 } & { 1 } \ end{pmatrix}\cdot\begin{pmatrix} { } { x } \\ { y } \\ { z } \\ { 1 } \ end { pmatrix }バツyz1=あるdg0beh0cf0t×tはいtz1バツyz1
  • アフィン変換の順序は、線形変換、平行移動の順です。

7.2 3D 空間でのスケールと移動

  • 缩放スケール
    S(sx,sy,sz) = (sx 0000 sy00000 sz000001) S(s_{x},s_{y},s_{z}) = \begin{pmatrix}{}{s_{x}}&{ 0}&{0}&{0}\\{0}&{s_{y}}&{0}&{0}\\{ 0} & {0}&{s_z}&{0}\\{ 0}&{0}&{0}&{1}\end{pmatrix}S ( s×sはいsz)=s×0000sはい0000sz00001
  • 平移変換
    T ( tx , ty , tz ) = ( 1 0 0 tx 0 1 0 ty 0 0 1 tz 0 0 0 1 ) T ( t _ { x }, t _ { y }, t _ { z }) = \begin{pmatrix} { } { 1 } & { 0 } & { 0 } & { t _ { x } } \\ { 0 } & { 1 } & { 0 } & { t _ { y } } \\ { 0 } & { 0 } & { 1 } & { t _ { z } } \\ { 0 } & { 0 } & { 0 } & { 1}\end{pmatrix}T ( t×tはいtz)=100001000010t×tはいtz1

7.3 3D 空間での 3D 回転

7.3.1 x、y、または z 軸を中心とした回転

ここに画像の説明を挿入

R x ( α ) = ( 1 0 0 0 0 cos ⁡ α − sin ⁡ α 0 0 sin ⁡ α cos ⁡ α 0 0 0 1 ) R _ { x } ( \alpha ) = \begin{pmatrix} { } { 1 } & { 0 } & { 0 } & { 0 } \\ { 0 } & { \cos \soft } & { - \sin \soft } & { 0 } \\ { 0 } & { \sin \soft } & { \cos \alpha } & { 0 } \ \ { 0 } & { 0 } & { 0 } & { 1 } \ end{pmatrix}R×( a )=10000コスあるある00あるコスある00001
R y ( α ) = ( cos ⁡ α 0 sin ⁡ α 0 0 1 0 0 − sin ⁡ α 0 cos ⁡ α 0 0 0 0 1 ) R _ { y } ( \alpha ) = \begin{pmatrix} {} { \cos \soft } & { 0 } & { \sin \soft } & { 0 } \\ { 0 } & { 1 } & { 0 } & { 0 } \\ { - \sin \soft } & { } & { \cos \alpha } & { 0 } \ \ { 0 } & { 0 } & { 0 } & { 1 } \ end{pmatrix}Rはい( a )=コスある0ある00100ある0コスある00001
R z ( α ) = ( cos ⁡ α − sin ⁡ α 0 0 sin ⁡ α cos ⁡ α 0 0 0 0 1 0 0 0 1 0 ) R _ { z } ( \alpha ) = \begin{pmatrix} { } { \cos \soft } & { - \sin \soft } & { 0 } & { 0 } \\ { \sin \soft } & { \cos \soft } & { 0 } & { 0 } \\ { 0 } &{0}&{1}&{0}\\{0}&{0}&{1}&{0}\end{pmatrix}Rz( a )=コスあるある00あるコスある0000110000

注: y 軸に沿って回転すると、行列はわずかに異なります (x に z を乗算するのではなく、z に x を乗算して y 軸を取得します) バレットチャットの説明: xyz、yzx、zxy、があります
。これら 3 つに本質的な違いはありません。これを理解すれば、前部分は簡単に解決できます。

7.3.2 あらゆる回転は、軸を中心としたいくつかの回転の組み合わせとみなすことができます。 Rx、Ry、Rz から任意の 3D 回転を構成します。

  • オブジェクトの回転を記述する 3 つのパラメーターのセットはオイラー角と呼ばれます オイラー角

  • フライト シミュレータでよく使用される: ロール、ピッチ、ヨー
    ここに画像の説明を挿入

  • ロドリゲスの回転公式ロドリゲスの回転公式は、
    n 軸の周りに α を回転させます: ( n , α ) = cos ⁡ ( α ) I + ( 1 − cos ⁡ ( α ) ) nn T + sin ⁡ ( α ) ( 0 − nznynz 0 − nx − nynx 0 ) ⏟ N \rm{n 軸を中心に \alpha の角度を回転:} ( n , \alpha ) = \cos ( \alpha ) I + ( 1 - \cos ( \alpha ) ) nn ^ { T } + \sin ( \alpha ) \underbrace{\begin{pmatrix} { } { 0 } & { - n _ { z } } & { n _ { y } } \\ { n _ { z } } & { 0 } & { - n _ { x } } \\ { - n _ { y } } & { n _ { x } } & { 0 } \end{pmatrix}}_{\rm{N}}nを中心にα角度回転します: ( n ,_=cos ( α ) I+( 1cos ( a ) ) n nT+( α )N 0nznはいnz0n×nはいn×0

  • 2D と同様に、任意の軸に沿って回転したい場合は、回転の開始点を軸に移動してから回転し、最後に元の位置に戻す必要があります。

  • クォータニオンの導入は主に、回転角度間の補間問題を解決するために行われますが、このレッスンでは取り上げません。

8 観察変換 観察変換

8.1 ビュー変換 ビュー/カメラ変換

8.1.1 ビュー変換とは ビュー変換とは何ですか?

  • 写真の撮り方を考える
    1. 良い場所を見つけて人を配置する(モデル変換
    2. カメラを設置する適切な「角度」を見つけます (ビューの変換)
    3. ナス!(射影変換) Cheese! (射影変換)

8.1.2 ビュー変換を決定する方法 ビュー変換を実行するにはどうすればよいですか?

  • カメラを定義する
    • 位置を決定します 位置e ⃗ \vec{e}e
    • 見る方向を決める 視線・視線方向g ^ \hat{g}g^
    • 上方向を決める(カメラの左右の傾き方向を決める) 上方向t ^ \hat{t}t^
      ここに画像の説明を挿入

8.1.3 標準的な場所 主な観察事項

  • カメラとすべての物体が一緒に動けば「写真」は同じになる
    ここに画像の説明を挿入

  • 通常はカメラの位置を原点に移動し、上方向をY軸方向、-Z軸方向を上方向としてオブジェクトとカメラを同時に変形させます。カメラを原点に移動し、Y を上にして、-Z を見て、カメラと一緒にオブジェクトを変換します
    ここに画像の説明を挿入

  • マトリックスM を通して M_{view} を表示Mv i e wカメラを変形するにはM ビュー M_{view}でカメラを変形しますMv i e w
    M ビュー = R ビュー T ビュー M_{ビュー}=R_{ビュー}T_{ビュー}Mv i e w=Rv i e wTv i e w

    1. e を原点に変換します
      T view = ( 1 0 0 − xc 0 1 0 − yc 0 0 1 − zc 0 0 0 1 ) T _ {view } = \begin{pmatrix} { } { 1 } & { 0 }&{ 0}&{-x_{c}}\\{0}&{1}&{0}&{-y_{c}}\\{0}&{0}&{1}& {-z_c}\ \{0}&{0}&{0}&{1}\end{pmatrix}Tv i e w=100001000010×cyc−z _c1
    2. g を -Z に、t を Y に、(gxt) を X に回転します
      R ビュー − 1 = ( xg ^ × t ^ xtx − g 0 yg ^ × t ^ yty − g 0 zg ^ × t ^ ztz − g 0 0 0 0 1 ) ⟹ R ビュー = ( xg ^ × t ^ yg ^ × t ^ zg ^ × t ^ 0 xtytzt 0 x − gy − gz − g 0 0 0 0 1 ) R^{-1}_{view}=\begin{pmatrix} {} { x _ { \hat{g } \times \hat{t}} } & { x _ { t } } & { x _ { -g } } & { 0 } \\ { y _ { \hat{g} \times \hat{t}} } & { y _ { t } } & { y _ { - g } } & { 0 } \\ { z _ {\hat{g} \times \hat{t}}} & { z _ { t } } & { z _ { - g } } & { 0 } \\ { 0 } & { 0}&{0}&{1}\end{pmatrix}\implies R_{view}=\begin{pmatrix} {} { x _ { \hat{g} \times \hat{t}} } & { y _ { \hat{g} \times \hat{t}} } & { z _ { \hat{g} \times \hat {t}} } & { 0 } \\ { x _ { t } } & { y _ { t } } & { z _ { t } } & { 0 } \\ { x _ { - g } } & { y _ { - g } } & { z _ { - g } } & { 0 }\\ { 0 } & { 0 }&{ 0 }&{ 1 }\end{pmatrix}Rv i e w 1=バツg^×t^yg^×t^zg^×t^0バツyz0バツ gy gz g00001Rv i e w=バツg^×t^バツバツ g0yg^×t^yy g0zg^×t^zz g00001

回転行列は直交行列(Orthogonal Matrix)ですが、ここでは逆行列が比較的書きやすいため、直交行列の逆行列が等しいという性質を利用して回転行列を求めます。そのトランスポーズに。

8.2 射影変換 射影変換

8.2.1 パース投影と正投影

  • 人間の目は透視投影に近いため、正投影は工業用グラフィックスでよく使用されます。
  • 「近くて大きくて、遠くて小さい」「一枚の葉っぱで目がくらむ」「本当のことはわかっているけど、ハトはなぜあんなに大きいの」はすべて透視図法を指します。
    ここに画像の説明を挿入

ここに画像の説明を挿入

8.2.2 正投影

簡単な理解方法

  1. カメラは原点にあり、-Z を見て Y を上に見ています
  2. Z 軸座標を削除 Z 座標を削除
  3. 結果の四角形を[ − 1 , 1 ] 2 [-1, 1]^2に移動およびスケールします。[ 1 1 ]2結果の四角形を[ − 1 , 1 ] 2 [-1, 1]^2[ 1 1 ]2

正式な理解 一般的に

  • 立方空間[ l , r ] × [ b , t ] × [ f , n ] [l, r] × [b, t] × [f, n] が必要です。[ l r ]×[ b t ]×[ f n ]は標準立方体[ − 1 , 1 ] 3 [-1, 1]^3[ 1 1 ]3直方体 [ l , r ] × [ b , t ] × [ f , n ] [l, r] × [b, t] × [f, n] をマッピングしたい[ l r ]×[ b t ]×[ f n ]を「正準立方体[ − 1 , 1 ] 3 [-1, 1]^3」[ 1 1 ]3

  • 変形するときは、まず平行移動(中心が原点に移動)してからスケール(長さ、幅、高さが 2 になります) まず平行移動(中心から原点に)してからスケール(長さ/幅/高さを 2 にします) M ortho = ( 2 r − l
    0 0 0 0 2 t − b 0 0 0 0 2 n − f 0 0 0 0 1 ) ( 1 0 0 − r + l 2 0 1 0 − t + b 2 0 0 1 − n + f 2 0 0 0 1 ) M_{ortho}=\begin{pmatrix} { } { \frac { 2 } { r - l } } & { 0 } & { 0 } & { 0 } \\ { 0 } & { \ frac { 2 } { t - b } } & { 0 } & { 0 } \\ { 0 } & { 0 } & { \frac { 2 } { n - f } } & { 0 } \\ { 0 } & { 0 } & { 0 } & { 1 } \end{pmatrix}\begin{pmatrix} {} { 1 } & { 0 } & { 0 } & { - \frac { r + l } { 2 } } \\ { 0 } & { 1 } & { 0 } & { - \frac { t + b } { 2 } } \\ { 0 } & { 0 } & { 1 } & { - \frac { n + f } { 2 } } \\ { 0 } & { 0 } & { 0 } & { 1 } \end{pmatrix}Mそれとも_ _ _ _=r l20000t b20000n f2000011000010000102r + l2t + b2n + f1
    ここに画像の説明を挿入

  • 予防

    • カメラが -Z 方向を見ると、近くの座標が遠くの座標よりも大きくなります。 -Z に沿って見ると、近くと遠くが直感的ではなくなります (n > f)
    • OpenGL (グラフィックス API) が左手座標を使用するのはこのためです

8.2.3 透視投影

透視投影を行うにはどうすればよいですか?

  1. まず、錐台を直方体に「押しつぶします」 (n -> n、f -> f)( M persp → オルソ M_{persp\to ortho}Mper s p or t h _ _ _ _)
  2. 正投影を実行します 正投影を実行します ( M ortho M_{ortho}Mそれとも_ _ _ _、すでに知られています!)
    ここに画像の説明を挿入

「スクイーズ」変換の行列導出過程

  1. 相似な三角形から座標変換前後の関係が得られる 変換後の点(x', y', z')と元の点(x, y, z)の関係を求める
    ここに画像の説明を挿入

y ' = nzy , x ' = nzxy\prime=\frac{n}{z}y\rm{,}x\prime=\frac{n}{z}x=zy x '=zx
2. このとき、未知数を含む変換後の座標は同次座標で書くことができます 同次座標では
( xyz 1 ) ⇒ ( nx / zny / zuknown 1 ) = = ( nynystillunknownz ) \begin{pmatrix} { } { x } \\ { y } \\ { z } \\ { 1 } \end{pmatrix} \Rightarrow \begin{pmatrix} { } { nx / z } \\ { ny / z } \\ { 不明wn} \\ { 1 } \end{pmatrix} = = \begin{pmatrix} { } { ny } \\ { ny} \\ { まだ\;今は不明 }\\{z} \end{pmatrix}バツyz1nx / z _n y / zわかりませわかりませ1==いいえ_いいえ_まだ_ _ _ _わかりませわかりませz
3. したがって、「squish」変換行列には次の関係があります。 したがって、「squish」(パースプからオルソ)投影は次のようになります。
M persp → ortho ( 4 × 4 ) ( xyz 1 ) = ( nxnyunknownz ) M^{(4×4) )}_{persp\to ortho}\begin{pmatrix} { } { x } \\ { y } \\ { z } \\ { 1 } \end{pmatrix} = \begin{pmatrix} { } { nx } \\ { ニューヨーク } \\ {不明} \\{ z } \end{pmatrix}Mper s p or t h _ _ _ _( 4 × 4 )バツyz1=n ×いいえ_わかりませわかりませz
4. 上記の情報の一部をすでに入力できますM persp → ortho M_{persp\to ortho}Mper s p or t h _ _ _ _M persp → ortho M_{persp\to ortho}の一部を理解するにはすでに十分です。Mper s p or t h _ _ _ _(次に、行列の 3 行目の数値を調べます)
M persp → ortho = ( n 0 0 0 0 n 0 0 ? ? ? 0 0 1 0 ) M_{persp\to ortho }=\begin {pmatrix} { } { n } & { 0 } & { 0 } & { 0 } \\ { 0 } & { n } & { 0 } & { 0 } \\ { ? } & { ? } & { ? } & { ? } \\ { 0 } & { 0 } & { 1 } & { 0 } \end{pmatrix}Mper s p or t h _ _ _ _=n0?00n?000?100?0
5. 近傍平面上の点座標は変化しません。
M persp → ortho ( 4 × 4 ) ( xyz 1 ) = ( nxnyunknownz ) z を n → M persp → ortho ( 4 × 4 ) ( xyn 1 ) = ( xyn 1 ) = ( nxnyn 2 n ) = ( nxnyunknownz ) M^{(4×4)}_{persp\to ortho}\begin{pmatrix} {} { x } \ \ { y } \\ { z } \\ { 1 } \end{pmatrix} = \begin{pmatrix} {} { nx } \\ { ny } \\ {unknown} \\{ z } \end{pmatrix} \quad\underrightarrow{\rm{置換\;z\;を\;n}}\quad M^{(4×4)}_{persp\to ortho}\begin{pmatrix} {} { x } \\ { y } \\ { n } \\ { 1 } \end{pmatrix} =\begin{pmatrix} {} { x } \\ { y } \\ { n } \\ { 1 } \end{pmatrix}= \begin{pmatrix} {} { nx } \\ { ny } \\ {n^2} \\{ n } \end{pmatrix}=\begin{pmatrix} {} { nx } \\ { ny } \\ {不明} \\{ z } \end{pmatrix}Mper s p or t h _ _ _ _( 4 × 4 )バツyz1=n ×いいえ_わかりませわかりませz 交換ください_ _ _z一緒_ _Mper s p or t h _ _ _ _( 4 × 4 )バツyn1=バツyn1=n ×いいえ_n2=n ×いいえ_わかりませわかりませz
n 2 n^2n2 はx、y とは関係がないので、M persp → オルソ M_{persp\to ortho}Mper s p or t h _ _ _ _行は (0 0 AB)
( n 0 0 0 0 n 0 0 0 0 AB 0 0 1 0 ) ( xyn 1 ) = ( nxnyn 2 n ) ⟹ ( 0 0 AB ) ( xyn 1 ) = の形式である必要があります。 n 2 ⟹ A n + B = n 2 \begin{pmatrix} { } { n } & { 0 } & { 0 } & { 0} \\{0}&{n}&{0}&{0}\ \{0}&{0}&{A}&{B}\\{0}&{0}&{1}& { 0 } \end{pmatrix} \begin{pmatrix} { } { x } \\ { y } \\{n}\\ { 1 } \end{pmatrix} = \begin{pmatrix} {} { nx } \ \{new}\\{n^2}\\{n}\end{pmatrix }\implies\begin{pmatrix}{}{0}&{0}&{A}&{B}\end{pmatrix} \begin{pmatrix}{}{x}\\{y}\\{n} \\{1}\end{pmatrix}=n^{2}\は An+B=n^2 を意味しますn0000n0000100B0バツyn1=n ×いいえ_n2(00B)バツyn1=n2あん_+B=n2
6. 遠方平面上のどの点の Z 軸座標も変化せず、遠方平面の中心点は変換前後で (0, 0, f, 1) になります。変わらないだろうM パースプ → オルソ (4 × 4 ) (xyz 1 ) = ( nxnyunknownz ) ( x , y , z , 1 ) から ( 0 , 0 , f , 1 ) → M パースプ → オルソ ( 4 × 4 ) ( 0 0 f 1 ) = ( 0 0 f 1 ) = ( 0 0 f 2 f ) = ( nxnyunknownz ) M^{(4×4)}_{persp\to ortho}\begin{pmatrix} {} { x } \\ { y } \\ { z } \\ { 1 } \end{pmatrix} = \begin{pmatrix} {} { nx } \\ { ny } \\ {unknown} \\{ z } \end{pmatrix}\quad \underrightarrow{\rm{(x,y,z,1)to(0,0,f,1)}}\quad M^{(4×4)}_{persp\to ortho}\begin{pmatrix} {} { 0 } \\ { 0 } \\ { f } \\ { 1 } \end{pmatrix} =\begin{pmatrix} {} { 0 } \\ { 0 } \\ { f } \\ { 1 } \end{pmatrix}= \begin{pmatrix} {} {0} \\ {0 } \\ {f^2} \\{ f } \end{pmatrix}=\begin{pmatrix} {} { nx } \\ { ニューヨーク } \\ {不明} \\{ z } \end{pmatrix}Mper s p or t h _ _ _ _( 4 × 4 )バツyz1=n ×いいえ_わかりませわかりませz ( x ,z 1 )から( 0 _0 f 1 )Mper s p or t h _ _ _ _( 4 × 4 )00f1=00f1=00f2=n ×いいえ_わかりませわかりませz
3 番目の動作が (0 0 AB) の場合、関係式
( n 0 0 0 0 n 0 0 0 0 AB 0 0 1 0 ) ( 0 0 f 1 ) = ( 0 0 f 2 f ) ⟹ ( ll 0 0 AB ) ( 0 0 f 1 ) = f 2 ⟹ A f + B = f 2 \begin{pmatrix} { } { n } & { 0 } & { 0 } & { 0 } \\ { 0 } & { n } & { 0 } & { 0 } \\ { 0 } & { 0 } & { A } & { B } \\ { 0 } & { 0 } & { 1 } & { 0 } \end{pmatrix} \begin{ pmatrix } { } { 0 } \\ { 0 } \\{f}\\ { 1 } \end{pmatrix} = \begin{pmatrix} {} { 0 } \\ { 0 } \\ {f^2} \ \{ f } \end{pmatrix}\implies \begin{pmatrix} { ll } { 0 } & { 0 } & { A } & { B } \end{pmatrix} \begin{pmatrix} { } { 0 } \ \ { 0 } \\{f}\\ { 1 } \end{pmatrix} = f ^ { 2 } \implies Af+B=f^2n0000n0000100B000f1=00f2(l l 00B)00f1=f2A f+B=f2
7. A と B の解法 A と B を解く
{ A n + B = n 2 A f + B = f 2 ⟹ { A = n + f B = − nf \begin{cases}An+B= n^2\\Af+B=f^2\end{cases}\implies \begin{cases}A=n+f\\B=-nf\end{cases}{ あん_+B=n2A f+B=f2{ =n+fB=nf _

  1. 最後に、M persp → オルト M_{persp\to ortho}であることがすでにわかっています。Mper s p or t h _ _ _ _的每一项 最後に、Mpersp->ortho のすべてのエントリが判明しました。
    M persp → オルソ = ( n 0 0 0 0 n 0 0 0 0 n + f − nf 0 0 1 0 ) M_{persp\to ortho}=\begin{pmatrix} { } { n } & { 0 } & { .0} & {0}\\{0}&{n}&{0}&{0}\\{0}&{0}&{n+f}&{-nf}\\{0}& { 0 } & { 1 } & { 0 } \end{pmatrix}Mper s p or t h _ _ _ _=n0000n0000n+f100n f0

押し出しの過程で、遠方平面と近方平面の中間にある点が、変更後に遠くに押し出されます。
私の推測: これは、近方、大方、遠方の中間点が押し出されるという事実に関連している可能性があります。描画時の距離 (つまり <b)
ここに画像の説明を挿入

  • 完全な透視投影変換
    M persp = M オルソ M persp → オルソ M_{persp}=M_{ortho}M_{persp\to ortho}Mあたり_ _ _ _=Mそれとも_ _ _ _Mper s p or t h _ _ _ _
  • 錐台内の平面の l、r、b、t の近くにあるものを定義する方法
    • 垂直視野角 垂直視野 (fovY)

    • アスペクト比
      ここに画像の説明を挿入

    • 垂直視野角とアスペクト比とl,r,b,t変換の関係 fovYとアスペクトからl,r,b,tに変換するにはどうすればよいですか?
      ここに画像の説明を挿入

Tan ⁡ fov Y 2 = t ∣ n ∣ 、アスペクト = rt \tan \frac { fov Y } { 2 } = \frac { t } { | n | },\quad アスペクト=\frac{r}{t}黄褐色2f o v Y=n 側面_ _ _ _ _=tr

おすすめ

転載: blog.csdn.net/Ziiur/article/details/122782287