Skip to content

*)同次座標系の基礎

最終更新日時: 2025年08月25日 12:57

  • nothing
  • 本レポートでは3D空間における同次座標系と行列表現の数学的基礎について解説する
  • 直交行列の性質、回転行列の表現方法、射影変換、クォータニオンなどの重要な数学的概念も体系的に解説する

同次座標系は線形代数の概念を拡張したものであり、射影幾何学の基礎をなす。

  • 線形代数との関係

    • 通常のnn次元ベクトル空間を(n+1)(n+1)次元に拡張
    • 射影変換を線形変換として表現可能に
    • アフィン変換(平行移動を含む変換)を単一の行列乗算で表現
  • 射影幾何学的解釈

    • 同次座標(x,y,z,w)(x, y, z, w)(x/w,y/w,z/w)(x/w, y/w, z/w)という3次元空間の点を表す
    • w=0w = 0のケースは無限遠点(方向ベクトル)を表現可能
    • 実質的に射影空間P3\mathbb{P}^3を表現
  • 射影幾何学と複素変換の関係

    • 2次元の場合、射影変換はリーマン球面上の複素関数としても解釈可能
    • 複素平面上のメビウス変換(分数一次変換)f(z)=az+bcz+df(z) = \frac{az + b}{cz + d}は射影変換と同型
    • 3D空間では四元数(クォータニオン)がこの役割を拡張し、回転を表現
    • 共形写像の性質を持ち、角度を保存する変換として重要
  • 3Dグラフィックスへの応用

    • 異なる種類の変換(回転、拡大縮小、平行移動、射影)を統一的に扱える
    • GPU処理の最適化が可能
    • 透視投影の数学的表現が簡潔になる

右手座標系で議論をする

  • 右手系座標系
    • x軸: 右方向への単位ベクトル
    • y軸: 上方向への単位ベクトル
    • z軸: 奥行き逆方向への単位ベクトル
    • 3つの軸は互いに直交し、右手の親指(x)、人差し指(y)、中指(z)の方向と一致

3D空間の点を表現する際、(x,y,z)(x, y, z)の3成分に加えて第4成分wwを追加した(x,y,z,w)(x, y, z, w)という4次元ベクトルを用いる。これを同次座標系という。

  • 同次座標の特徴
    • w=1w = 1のとき: 空間上の点を表す(位置ベクトル)
    • w=0w = 0のとき: 方向のみを表す(方向ベクトル)
    • 一般に、3D空間の点(x,y,z)(x, y, z)は同次座標では(x,y,z,1)(x, y, z, 1)
    • スケーリングすると(kx,ky,kz,k)(kx, ky, kz, k)となり、これは(x,y,z,1)(x, y, z, 1)と同値

3D空間における変換(回転、拡大縮小、平行移動、せん断)は行列を用いて表現できるが、 その説明のために表記方法、計算方法の前提を明確にしておく

行列とベクトルの乗算には2つの規約が存在するが、OpenGLでは列規約を用いるためこちらで今後説明する

  • 列規約(Column-major)
    • ベクトルを列ベクトルとして扱う: v=Mvv' = M \cdot v
    • 変換行列を左から掛ける
    • 列方向に読む(各列が一つの変換を表す)
    • OpenGLで採用
  • 行規約(Row-major)
    • ベクトルを行ベクトルとして扱う: v=vMv' = v \cdot M
    • 変換行列を右から掛ける
    • 行方向に読む(各行が一つの変換を表す)
    • DirectXなどで採用

同時座標を用いた表現に限ってもいくつかの表現がある

  • X軸周りの回転行列(角度θ\theta
Rx(θ)=(10000cosθsinθ00sinθcosθ00001)R_x(\theta) = \begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & \cos\theta & -\sin\theta & 0 \\ 0 & \sin\theta & \cos\theta & 0 \\ 0 & 0 & 0 & 1 \end{pmatrix}
  • Y軸周りの回転行列(角度θ\theta
Ry(θ)=(cosθ0sinθ00100sinθ0cosθ00001)R_y(\theta) = \begin{pmatrix} \cos\theta & 0 & \sin\theta & 0 \\ 0 & 1 & 0 & 0 \\ -\sin\theta & 0 & \cos\theta & 0 \\ 0 & 0 & 0 & 1 \end{pmatrix}
  • Z軸周りの回転行列(角度θ\theta
Rz(θ)=(cosθsinθ00sinθcosθ0000100001)R_z(\theta) = \begin{pmatrix} \cos\theta & -\sin\theta & 0 & 0 \\ \sin\theta & \cos\theta & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{pmatrix}

任意の単位ベクトル(ux,uy,uz)(u_x, u_y, u_z)を軸とする角度θ\thetaの回転は次の行列で表される。

R(u,θ)=(c+ux2(1c)uxuy(1c)uzsuxuz(1c)+uys0uyux(1c)+uzsc+uy2(1c)uyuz(1c)uxs0uzux(1c)uysuzuy(1c)+uxsc+uz2(1c)00001)R(u, \theta) = \begin{pmatrix} c + u_x^2(1-c) & u_x u_y(1-c) - u_z s & u_x u_z(1-c) + u_y s & 0 \\ u_y u_x(1-c) + u_z s & c + u_y^2(1-c) & u_y u_z(1-c) - u_x s & 0 \\ u_z u_x(1-c) - u_y s & u_z u_y(1-c) + u_x s & c + u_z^2(1-c) & 0 \\ 0 & 0 & 0 & 1 \end{pmatrix}

ここで、c=cosθc = \cos\thetas=sinθs = \sin\thetaである。

3.回転後の軸ベクトルによる表現

Section titled “3.回転後の軸ベクトルによる表現”

世界座標系からビュー座標系の変換で使われる

V=[xxyxzx0xyyyzy0xzyzzz0pxpypz1]V = \begin{bmatrix} x_x & y_x & z_x & 0 \\ x_y & y_y & z_y & 0 \\ x_z & y_z & z_z & 0 \\ -\mathbf{p} \cdot \mathbf{x} & -\mathbf{p} \cdot \mathbf{y} & -\mathbf{p} \cdot \mathbf{z} & 1 \end{bmatrix}

ここで、x=(xx,yx,zx)\mathbf{x}=(x_x,y_x,z_x)y=(xy,yy,zy)\mathbf{y}=(x_y,y_y,z_y)z=(xz,yz,zz)\mathbf{z}=(x_z,y_z,z_z) はカメラ座標系の各軸ベクトル、p\mathbf{p}はカメラの位置ベクトルを表す。

3D空間における軸ベクトル(基底ベクトル)は、同次座標系では第4成分が0となる。

  • 標準基底ベクトル

    • x軸: (1,0,0,0)(1, 0, 0, 0)
    • y軸: (0,1,0,0)(0, 1, 0, 0)
    • z軸: (0,0,1,0)(0, 0, 1, 0)
  • 第4成分が0である理由

    • 方向のみを表し、位置情報を持たないため
    • 平行移動の影響を受けないようにするため
    • ベクトルの長さや方向のみが重要な場合に使用

回転変換は、軸ベクトルの方向を変えるが、その性質(方向ベクトルであること)は保持する。

  • 回転行列RRの性質
    • 直交行列: RTR=IR^T \cdot R = I(単位行列)
    • 行列式det(R)=1\det(R) = 1
    • 軸ベクトルの第4成分は回転後も0のまま

平行移動は点の位置を変えるが、方向ベクトルには影響しない。

  • 平行移動行列TT
T=(100tx010ty001tz0001)T = \begin{pmatrix} 1 & 0 & 0 & t_x \\ 0 & 1 & 0 & t_y \\ 0 & 0 & 1 & t_z \\ 0 & 0 & 0 & 1 \end{pmatrix}
  • 軸ベクトルv=(vx,vy,vz,0)v = (v_x, v_y, v_z, 0)に平行移動を適用
Tv=(100tx010ty001tz0001)(vxvyvz0)=(vxvyvz0)T \cdot v = \begin{pmatrix} 1 & 0 & 0 & t_x \\ 0 & 1 & 0 & t_y \\ 0 & 0 & 1 & t_z \\ 0 & 0 & 0 & 1 \end{pmatrix} \cdot \begin{pmatrix} v_x \\ v_y \\ v_z \\ 0 \end{pmatrix} = \begin{pmatrix} v_x \\ v_y \\ v_z \\ 0 \end{pmatrix}
  • 結果として、平行移動は方向ベクトルに影響しない
  • 第4成分が0であることで、平行移動の影響を受けない性質が保証される

複数の変換を組み合わせる場合、行列の乗算で表現される。

  • 変換AABBの合成

    • 列規約: (BA)v=B(Av)(B \cdot A) \cdot v = B \cdot (A \cdot v)
    • 最初にAAが適用され、次にBBが適用される
  • 典型的な変換パイプライン(モデル・ビュー・プロジェクション)

    • モデル変換: モデル座標系からワールド座標系への変換
    • ビュー変換: ワールド座標系からカメラ座標系への変換
    • プロジェクション変換: カメラ座標系からクリップ座標系への変換
    • 最終的な変換行列: Mfinal=MprojectionMviewMmodelM_{final} = M_{projection} \cdot M_{view} \cdot M_{model}

OpenGLでは列規約を採用している(ここではすべて列規約で議論する)

  • 4×44 \times 4行列の表現
M=(m00m01m02m03m10m11m12m13m20m21m22m23m30m31m32m33)M = \begin{pmatrix} m_{00} & m_{01} & m_{02} & m_{03} \\ m_{10} & m_{11} & m_{12} & m_{13} \\ m_{20} & m_{21} & m_{22} & m_{23} \\ m_{30} & m_{31} & m_{32} & m_{33} \end{pmatrix}
  • 各列の意味
    • 第1列 (m00,m10,m20,m30)(m_{00}, m_{10}, m_{20}, m_{30}): x軸の変換
    • 第2列 (m01,m11,m21,m31)(m_{01}, m_{11}, m_{21}, m_{31}): y軸の変換
    • 第3列 (m02,m12,m22,m32)(m_{02}, m_{12}, m_{22}, m_{32}): z軸の変換
    • 第4列 (m03,m13,m23,m33)(m_{03}, m_{13}, m_{23}, m_{33}): 平行移動成分

行列AAの転置行列ATA^Tは、AAの行と列を入れ替えた行列である。

  • 定義: AAm×nm \times n行列のとき、ATA^Tn×mn \times m行列となり、各要素は次のように対応する

    • AijT=AjiA^T_{ij} = A_{ji}iijj列の要素が、転置後はjjii列になる)
  • 転置の性質

    • (AT)T=A(A^T)^T = A(二重転置は元に戻る)
    • (A+B)T=AT+BT(A + B)^T = A^T + B^T(和の転置は転置の和)
    • (AB)T=BTAT(AB)^T = B^T A^T(積の転置は転置の積の逆順)
    • det(AT)=det(A)\det(A^T) = \det(A)(転置しても行列式は変わらない)

直交行列は、その転置行列が逆行列と等しい行列である。

  • 定義: 行列QQが直交行列であるとは、QT=Q1Q^T = Q^{-1}が成り立つこと

    • 同値な条件: QTQ=QQT=IQ^T Q = Q Q^T = IIIは単位行列)
  • 直交行列の性質

    • 行列式の値は±1\pm 1
    • 列ベクトル(または行ベクトル)は互いに直交する単位ベクトル
    • 長さと角度を保存する(等長変換)
    • 回転行列は常に直交行列である(ただしdet(Q)=1\det(Q) = 1の場合)
  • 3D空間での応用

    • 座標系の回転を表現
    • 基底ベクトルの変換
    • 剛体変換(長さと角度を保存する変換)
  • 行列式(Determinant)

    • n×nn \times n行列AAの行列式はdet(A)\det(A)またはA|A|と表記
    • 行列が可逆であるための必要十分条件はdet(A)0\det(A) \neq 0
    • 行列式の性質
      • det(AB)=det(A)det(B)\det(AB) = \det(A) \cdot \det(B)
      • det(AT)=det(A)\det(A^T) = \det(A)
      • det(A1)=1det(A)\det(A^{-1}) = \frac{1}{\det(A)}AAが可逆の場合)
  • 逆行列(Inverse matrix)

    • 行列AAの逆行列A1A^{-1}AA1=A1A=IA \cdot A^{-1} = A^{-1} \cdot A = Iを満たす
    • n×nn \times n行列の逆行列は次の式で計算できる
      • A1=1det(A)adj(A)A^{-1} = \frac{1}{\det(A)} \cdot \text{adj}(A)
      • ここでadj(A)\text{adj}(A)AAの余因子行列の転置

クォータニオンは3D回転を表現する別の方法で、オイラー角などに比べて特定の問題(ジンバルロック等)を回避できる。

  • クォータニオンの定義

    • q=w+xi+yj+zkq = w + xi + yj + zkwwはスカラー部、xi+yj+zkxi + yj + zkはベクトル部)
    • またはq=[w,v]q = [w, \vec{v}]v=[x,y,z]\vec{v} = [x, y, z]
  • 単位クォータニオン

    • q2=w2+x2+y2+z2=1|q|^2 = w^2 + x^2 + y^2 + z^2 = 1
    • 回転を表すには単位クォータニオンを使用
  • クォータニオンと回転行列の変換

    • クォータニオンq=[w,x,y,z]q = [w, x, y, z]から回転行列への変換

R=(12y22z22xy2wz2xz+2wy02xy+2wz12x22z22yz2wx02xz2wy2yz+2wx12x22y200001)R = \begin{pmatrix} 1 - 2y^2 - 2z^2 & 2xy - 2wz & 2xz + 2wy & 0 \\ 2xy + 2wz & 1 - 2x^2 - 2z^2 & 2yz - 2wx & 0 \\ 2xz - 2wy & 2yz + 2wx & 1 - 2x^2 - 2y^2 & 0 \\ 0 & 0 & 0 & 1 \end{pmatrix}

  • クォータニオンの補間
    • 球面線形補間(SLERP)を使うことで、二つの回転の間をスムーズに補間できる
    • Slerp(q1,q2,t)=q1(q11q2)t\text{Slerp}(q_1, q_2, t) = q_1(q_1^{-1}q_2)^t0t10 \leq t \leq 1

3Dから2Dへの投影に使われる射影変換行列。

  • 透視投影行列(Perspective projection)
    • 遠くのオブジェクトが小さく見える効果を生み出す
    • nn(近平面)、ff(遠平面)、rr(右)、ll(左)、tt(上)、bb(下)を用いて

Ppersp=(2nrl0r+lrl002ntbt+btb000f+nfn2fnfn0010)P_{persp} = \begin{pmatrix} \frac{2n}{r-l} & 0 & \frac{r+l}{r-l} & 0 \\ 0 & \frac{2n}{t-b} & \frac{t+b}{t-b} & 0 \\ 0 & 0 & -\frac{f+n}{f-n} & -\frac{2fn}{f-n} \\ 0 & 0 & -1 & 0 \end{pmatrix}

  • 正射影行列(Orthographic projection)
    • 距離に関係なく大きさが一定
    • CADや建築設計などで使用

Portho=(2rl00r+lrl02tb0t+btb002fnf+nfn0001)P_{ortho} = \begin{pmatrix} \frac{2}{r-l} & 0 & 0 & -\frac{r+l}{r-l} \\ 0 & \frac{2}{t-b} & 0 & -\frac{t+b}{t-b} \\ 0 & 0 & -\frac{2}{f-n} & -\frac{f+n}{f-n} \\ 0 & 0 & 0 & 1 \end{pmatrix}

  • 右手系と左手系
    • 右手系: OpenGL標準、z軸は画面奥向き
    • 左手系: DirectX標準、z軸は画面手前向き
  • メモリ上の格納順序

    • 行優先(Row-major order): C/C++の2次元配列の標準的な格納方式
    • 列優先(Column-major order): FORTRAN由来、OpenGLの内部表現
  • OpenGLにおける行列の指定

    • 列優先で要素を指定: {m00, m10, m20, m30, m01, m11, ...}
    • 転置した行列を行優先で指定: 実装上の便宜

同次座標系と射影幾何学は長い数学的発展の歴史を持つ。

  • 射影幾何学の誕生

    • 起源は15世紀のルネサンス期の芸術家による遠近法(パースペクティブ)の研究
    • ブルネレスキ(Filippo Brunelleschi, 1377-1446)が遠近法の基本原理を発見
    • アルベルティ(Leon Battista Alberti, 1404-1472)が「絵画論」で数学的基礎を提供
    • デザルグ(Girard Desargues, 1591-1661)が1639年に射影幾何学の基礎定理を確立
  • 同次座標系の発展

    • プリュッカー(Julius Plucker, 1801-1868)が1829年に同次座標を導入
    • メビウス(August Ferdinand Mobius, 1790-1868)が1827年に同次座標系の基礎を構築
    • ケイリー(Arthur Cayley, 1821-1895)とクライン(Felix Klein, 1849-1925)による射影幾何学の代数的定式化
    • フォン・シュタウト(Karl Georg Christian von Staudt, 1798-1867)が射影幾何学を純粋に形式的な体系として確立
  • 現代的応用への発展

    • 20世紀初頭、射影幾何学は代数幾何学と融合
    • 1960年代、コンピュータグラフィックスの発展とともに同次座標系が実用化
    • ロバーツ(Lawrence G. Roberts)が1965年に3D物体の射影のためにコンピュータグラフィックスに同次座標系を適用
    • サザランド(Ivan Sutherland)の「Sketchpad」システムが同次座標の実用的応用を示す
  • 同次座標系(Homogeneous coordinates)
    • 3次元座標に第4成分を追加した4次元座標系
  • 右手系(Right-handed coordinate system)
    • 親指、人差し指、中指の向きがx, y, z軸の方向を表す座標系
  • 行規約(Row-major convention)
    • ベクトルを行ベクトルとして扱う表記法
  • 列規約(Column-major convention)
    • ベクトルを列ベクトルとして扱う表記法
  • 基底ベクトル(Basis vector)
    • 座標系を定義する単位ベクトル
  • 直交行列(Orthogonal matrix)
    • 転置行列が逆行列と等しい行列
  • モデル・ビュー・プロジェクション(MVP)
    • 3Dグラフィックスにおける標準的な変換パイプライン
  • 転置行列(Transpose matrix)
    • 行と列を入れ替えた行列
  • 行列式(Determinant)
    • 正方行列から計算される値で、行列の可逆性や体積の拡大縮小率を表す
  • 逆行列(Inverse matrix)
    • 元の行列と掛け合わせると単位行列になる行列
  • クォータニオン(Quaternion)
    • 複素数を拡張した四元数で、3D回転を表現するのに適している
  • オイラー角(Euler angles)
    • 3つの角度(ヨー、ピッチ、ロール)による回転表現
  • 射影変換(Projection transformation)
    • 3D空間から2D平面への変換
  • クリッピング(Clipping)
    • 視界の範囲外のオブジェクトを切り取る処理
  • 正規化デバイス座標(Normalized Device Coordinates, NDC)
    • 射影変換後の標準化された座標系
  • ジンバルロック(Gimbal lock)
    • オイラー角で表現した際に自由度が失われる現象
  • アフィン変換(Affine transformation)
    • 平行線を保存する線形変換と平行移動の組み合わせ
  • 剛体変換(Rigid transformation)
    • 距離と角度を保存する変換(回転と平行移動の組み合わせ)
  • メビウス変換(Mobius transformation)
    • 複素平面上の分数一次変換で、射影変換と同型
  • リーマン球面(Riemann sphere)
    • 複素平面に無限遠点を加えた球面表現
  • 共形写像(Conformal mapping)
    • 角度を保存する変換
  • 射影幾何学(Projective geometry)
    • 射影変換を扱う幾何学の分野で、無限遠点を含む