Chapter 2 「座標変換」 1 CGでは、ものの形・位置・光の方向などを、座標系を使って 定義する。基本物体を定義する座標系から実際の表示に 使われる座標系まで、処理の内容に応じて複数の座標系 を使い分け、何段階もの座標変換を経ることが多い。 ここでは、座標系と座標変換、CGにおけるそれらの典型的 な扱い方を学習する。 2 (参考)座標とベクトル コンピュータによる図形の描画は、2次元/3次元座標系に点を 描画することである。点の位置を指定する(x,y)、(x,y,z)などの数 値の組を座標とよぶ。 座標などから導くベクトルに線形代数演算を施すことが、コン ピュータグラフィックス技術の基本的な手法の一つである。 ベクトルは、座標と同様に数値の組であるが、加算・定数倍・大 きさ・内積などの演算が定義されている。数値を横に並べた横ベ クトル、縦に並べた縦ベクトルのいずれかで記述する。横ベクト ルは1×nの行列、縦ベクトルはn×1の行列と同じである。 コメント: 横ベクトルと縦ベクトルの使い分けは、行列との積の 形で現れる場合には、行列の積が定義されるように記述する (下の例)。文章中に現れる場合には、スペースの節約や読み やすさの観点から横ベクトルで書くか1×n行列の形で書いて、 転置記号をつける((x,y,z)tのように)。 ! 1 2 3 $ ! 1 2 3 $! x $ # & # &# & x y z # 4 5 6 & # 4 5 6 &# y & # 7 8 9 & # 7 8 9 &# z & " % " %" % ( ) 3 (参考)ベクトルの基本演算 ベクトルとベクトルの和、ベクトルの定数倍。 ベクトルの大きさ(ノルム、長さ)。 ( xa ya za )= xa2 + ya2 + za2 ベクトルa=(xa,ya,za)とb=(xb,yb,zb)の内積(・)と外積(×) a・b=xaxb+yayb+zazb aとbが成す角θとして、a・b=ǁ‖aǁ‖ǁ‖bǁ‖cosθでもある。 a×b=(yazb-zayb, zaxb-xazb, xayb-yaxb) a×bはaとbの両方に垂直で、大きさがǁ‖aǁ‖ǁ‖bǁ‖sinθのベクトル 大きさ1のベクトルを単位ベクトルとよぶ。ǁ‖aǁ‖が0で無ければ、 a/ǁ‖aǁ‖は単位ベクトル。 4 (参考)行列とベクトルの演算 行列・ベクトルは、線形代数の規則にしたがう数値・変数の 集まりを、代数処理(+、ー、×、/など)することで、複雑・ 高度な計算を簡単に行うことができるツール。 n行・m列の行列をn×m行列とよぶ。 n1×m1行列とn2×m2行列の積は m1=m2の場合に定義される。 ! a # 11 A = # a21 ## " a31 a12 a13 a22 a23 a32 a33 列 行 a14 $ & a24 & & a24 &% ベクトルは1×mあるいは、n×1の行列である。 行列A,B,Cの積について(A・B)・C=A・(B・C)。 行列A,Bの積について、一般にはA・B≠B・A。 単位行列、逆行列、行列式、行列の転置 5 2次元座標変換 6 2次元座標系 2次元図形は、一般に2次元直交座標系の上で定義される。 2次元直交座標系は、平面上の1点(原点)O、および原点と直交する2 つの数直線であるx軸、y軸を用いて定義される。(x,yに代わって、h,vや u,v、s,tという記号を用いることもある) x軸を右向きに、y軸を上向きにとるのが一般的であるが、用途に応じて 異なる方向で軸を定義する場合もある。(ディスプレイの座標ではy軸が 下向きになることが多い) 平面上の任意の位置は、x軸、y軸に対する位置を表す 極座標系 数値の組で表現できる。この数値の組を座標とよぶ。 原点からの距離rと基準方向からの角度θとの組(r, θ) によって位置を指定することもでき、このような座標系を 極座標系とよぶ。 x P = rP cos" P y P = rP sin " P 7 2次元図形の幾何学的変換 2次元の線分やポリゴンは点の座標とその順序で表される。 図2.2 CGでは、すでに定義されている図形に対して平行移動、拡 大・縮小、回転などの変形操作を施すことが多い。これを幾 何学的変換とよぶ。 図2.3、図2.4、図2.5 2次元座標を列ベクトル(x,y)tで表すと、平行移動、拡大・縮 小、回転は下式になるが、通常の座標では、これらの合成 や逆変換を計算する式がやや複雑になる。 # x"& # x & # t x & # x"& # sx 0 &# x & # x"& #cos ) *sin ) &# x & (% (, % ( = % % ( = % ( + % (, % ( = % (% ( t 0 s y y y y y sin ) cos ) $ "' $ ' $ y ' $ "' $ $ '$ y ' y '$ ' $ "' 8 9 同次座標 これを解決するために、2次元座標を3つの数値(wx,wy,w) で表す同次座標を用いる。普通w=1とし、(x,y)を(x,y,1)と書く。 同次座標では、平行移動、拡大・縮小、回転が次式になる。 # x"& #1 0 t x &# x & # x& % ( % (% ( % ( y % y"( = %0 1 t y (% ( = T(t x ,t y )% y ( % ( % (% ( % ( $1 ' $0 0 1 '$1 ' $ 1' ! ! # x"& # sx % ( % % y"( = % 0 % ( % $1 ' $ 0 0 sy 0 # x"& #cos ) % ( % % y"( = % sin ) % ( % $1 ' $ 0 # x& 0&# x & (% ( % ( 0(% y ( = S(sx ,sy )% y ( (% ( % ( 1'$1 ' $ 1' *sin ) cos ) 0 # x& 0&# x & (% ( % ( 0(% y ( = R() )% y ( (% ( % ( 1'$1 ' $ 1' コメント:同次座標でw=0の場合は、無限遠点を表す。 コメント: 2次元座標を3つの数値の組で表現すること は、簡単なことを複雑にしているだけのように見える。し かし、同次行列は変換の合成や逆変換の計算を行列 の積と逆行列で求めることができ、大変便利である。後 で述べるように、3次元座標における同次座標は4つの 数値の組で表現する。CGの座標変換では、同次座標 を用いることが常識である。 以降、2次元座標の 平行移動を表す行列をT(tx,ty) 拡大・縮小を表す行列をS(sx,sy) 回転を表す行列をR(θ)と書く (参考)回転行列 " % cos! !sin ! 2次元の回転行列が であることは次のように理解する。 $ ' # sin ! cos! & x軸方向の単位ベクトル(1,0)はθ 回転することによって(cosθ,sinθ)に移 動し、y軸方向の単位ベクトル(0,1)は(-sinθ,cosθ)に移動する。 " % " % " % x x! 一般に、 の形の線形変換では、 $$ '' = $ a c '$$ '' # y! & # b d &# y & x軸方向の単位ベクトル(1,0)は(a,b)に移動し、 y軸方向の単位ベクトル(0,1)は(c,d)に移動する。 " cos! !sin ! % $ ' したがって回転行列は となる。 # sin ! cos! & ! 0 $ # & " !sin ! % " 1 % $ ' # cos! & 1 θ ! cos! $ # & " sin ! % 1 θ ! 1 $ # & " 0 % 11 鏡映とスキュー 鏡映は直線に関して対称な位置に移動する変換である。 図2.7、図2.8 スキューはせん断ともよび、長方形を平行四辺形の形に歪 ませる変換である。 図2.9、図2.10 鏡映、スキューによる変換も、同次座標を使うことで3×3の 行列で表すことができる。 表2.1、表2.2 12 13 14 2次元座標系における合成変換 これらの基本変換を単独で用いるだけでなく、複数の変換 を順に施すことが多い。これを変換の合成という。 同次座標を用いると、合成変換を一つの行列で表すことが でき、基本変換を表す行列の積になる。 例えば、任意の点(x0,y0)を中心とする角度θの回転変換は ① 点(x0,y0)が原点になるように平行移動し、 ② 原点中心にθ回転し、 ③ 原点の位置を(x0,y0)に戻すので、次式になる。 " x % " 1 0 " x !% $ ' $ $ ' ! y = T(x , y )R( ! )T((x , (y ) y '=$ 0 1 0 0 0 0 $ $ ' $1 ' $ 1 ' $$ 0 0 # & # & # " cos! (sin ! (x cos! + y sin ! + x 0 0 0 $ = $ sin ! cos! (x0 sin ! ( y0 cos! + y0 $$ 0 1 # 0 x0 %" cos! '$ y0 '$ sin ! ' 1 '&$# 0 %" % '$ x ' '$ y ' ''$ 1 '& &# (sin ! cos! 0 0 0 1 %" 1 0 (x0 %" x % '$ '$ ' $ ' 0 1 (y y ' $ ' 0 '$$ 0 0 1 ''$ 1 ' &# & &# 15 2次元アフィン変換 幾何学的変換には、解釈1:図形が動く、解釈2:座標系が 動く、の2通りの解釈がある。CGでは解釈2の考え方をす る場合が多い。 図2.13、図2.14 ここまでで学習した幾何学的変換の一般的な行列表現は # x"& # a b % ( % % y"( = % d e % ( % $1 ' $ 0 0 ! c &# x & (% ( f (% y ( (% ( 1 '$ 1 ' となる。この座標変換を2次元アフィン変換とよぶ。 2次元アフィン変換の逆変換も2次元アフィン変換である。 直線を直線に変換し、距離の比率が保存される。 平行移動と回転、その合成は、もとの図形の形状・角度・長 さを変えない。この変換を剛体変換とよぶ。 16 17 3次元変換 18 3次元座標系 3次元CGでは、3次元空間内での位置を表すために3次元 座標系が必要である。 3次元直交座標系はx軸、y軸、z軸の向きによって右手系と 左手系がある。教科書は原則として右手系を用いる。右手 系と左手系ではz軸の方向が逆になる。 19 極座標と円柱座標 2次元と同様に角度を併用した座標を考えることができ、極 座標系と円柱座標系がある。 x P = rP sin " P cos # P y P = rP sin " P sin # P zP = rP cos" P x P = " P cos # P y P = " P sin # P zP = zP 20 3次元モデリングの基本 3次元図形の形状を数値的に記述することをモデリングと よぶ。記述される形状のデータを形状モデルとよぶ。 ポリゴン(多角形)の集合で図形を表現することは、最も基 本的なモデリング手法である。 ポリゴンは頂点座標とその順序で表現する。頂点が4個以 上の場合、そのポリゴンが平面になるとは限らない。平面 でないポリゴンは描画に曖昧性が生じ、好ましくない。必ず 平面になる三角ポリゴンがよく用いられる。 図2.18、図2.19 21 22 (参考)三角形分割 CGでは幾何情報の処理アルゴリズムが重要な役割を果た す。空間を三角形分割するドロネー図もその一つである。 ドロネー図は、 与えられた点集合の凸包を三角形分割する。 全ての点を三角形分割に用いる。 各三角形の外接円に他の点を含まない。 全ての三角形の内角の最小値が最大 であるという意味で最適な三角形分割。 ボロノイ図の双対図形。 http://ja.wikipedia.org/wiki/ドロネー図 23 同次座標と3次元の基本変換 3次元空間の平行移動、拡大・縮小、回転、鏡映、スキューなど の基本変換、およびそれらの合成変換は、同次座標を用いるこ とで、一つの4×4行列で表現できる。 図2.20、図2.21、図2.22、図2.23、図2.24 本文では平行移動、拡大・縮小、回転の各行列をT(tx,ty,tz), S(sx,sy,sz),Rx(θ), Ry(θ), Rz(θ)で表す。 これらの変換は3次元アフィン変換でもあり、次のようになる。 # x"& # a % ( % % y"( = % e % z" ( % i % ( % $1 ' $ 0 b f j 0 c d &# x & (% ( g h (% y ( k l (% z ( (% ( 0 1 '$ 1 ' 合成変換を表す行列は、基本変換を表す行列の積である。 ! 24 25 平行移動、拡大縮小 平行移動、拡大縮小は次式で表される。 ! # x"& #1 % ( % % y"( = %0 % z"( %0 % ( % $ 1 ' $0 0 1 0 0 # x"& # sx % ( % % y"( = % 0 % z"( % 0 % ( % $1' $ 0 0 sy 0 0 # x& 0 t x &# x & (% ( % ( 0 t y (% y ( y( % = T(t x ,t y ,t x ) % z( 1 t z (% z ( (% ( % ( 0 1 '$ 1 ' $ 1' 0 0 sz 0 # x& 0&# x & (% ( % ( 0(% y ( y( % = S(sx ,sy ,sx ) % z( 0(% z ( (% ( % ( 1'$ 1 ' $ 1' 26 回転 3次元の回転は回転軸によって変換が異なり、次式になる x軸まわりの回転 y軸まわりの回転 ! z軸まわりの回転 ! # x"& #1 0 % ( % % y"( = %0 cos ) % z"( %0 sin ) % ( % 0 $ 1 ' $0 # x"& # cos) % ( % % y"( = % 0 % z"( % *sin ) % ( % $1' $ 0 # x"& #cos ) % ( % % y"( = % sin ) % z"( % 0 % ( % $1' $ 0 0 *sin ) cos ) 0 0 sin ) 1 0 0 cos) 0 *sin ) cos ) 0 0 0 0 0 1 0 # x& 0&# x & (% ( % ( 0(% y ( y = Rx () )% ( % z( 0(% z ( (% ( % ( 1'$ 1 ' $ 1' # x& 0&# x & (% ( % ( 0(% y ( y( % = Ry () ) % z( 0(% z ( (% ( % ( 1'$ 1 ' $ 1' # x& 0&# x & (% ( % ( 0(% y ( y( % = Rz () ) % z( 0(% z ( (% ( % ( 1'$ 1 ' $ 1' 27 (参考)3次元空間における回転 3次元空間の回転を表すにはいくつかの方法がある。 xyz軸まわりの3つの角度(オイラー角とよぶ)に対する3つの回転 行列の積によって定義する方法(すでに説明した方法)。 回転の主軸とそのまわりの回転角によって定義する方法。 四元数とよぶ複素数を拡張した数体系を用いる方法。 いずれの方法であっても3次元座標(x,y,z)tを(x’,y’,z’)tに変換する 3×3の行列Rによって、(x’,y’,z’)t=R(x,y,z)tと関係ずけられる。こ こで行列Rは正規直交行列になる。 正規直交行列とは、 全ての列ベクトル、行ベクトルの大きさ(ノルム)が1(正規性) 列ベクトル間の内積、行ベクトルの内積は0(直交性) 28 投影 29 コメント:人間の眼の見え方やカメラによ る写真の撮影は透視投影である。実際 のカメラ的な撮影装置は全て透視投影 である。したがって、近くのものが大きく 見え、遠くのものが小さく見える。写実的 である。 コメント:平行投影は、実際に生じる物理 現象のモデルではない。機械図面のよ うに人工的な作図において、遠近で大き さが変化しないことにメリットがある場合 に利用される。写実性には欠けるが、大 きさ・寸法の把握が容易である。 投影の原理 3次元図形を2次元図形に変換する処理を投影といい、透 視投影と平行投影がある。 図2.26 投影では左手系(右手系ではなく)の原点に視点をおき、x 軸を水平方向、y軸を垂直方法、z軸を奥行き方向とする。 透視投影は、視点(投影中心)と投影面をおき、3次元図形 の各点から視点に投射線(視線)を引く。投影面との交点の 集まりとして、投影図を描く。 x y x" = , y" = 図2.27、図2.28 z z 平行投影は、3次元図形の各点から投影線を平行に投影 面におろすことで投影図を描く。 図2.29 ! x" = x, y" = y 30 31 ビューボリューム(視体積) 投影面上の、実際に図形が描画される長方形領域をウィン ドウという。透視投影で、視点とウィンドウのなす角度を画 角(視野角)とよぶ。 奥行き(z軸)方向に関して、前後に有限の範囲を考え、そ の範囲内の図形のみを投影する。その範囲は2つの面で 定義され、視点に近い側を前方クリッピング面、遠い側を後 方クリッピング面とよぶ。 図形が描かれる範囲は、透視投影では四角錐台に、平行 投影では直方体になる。この六面体をビューボリューム(視 体積)とよぶ。3次元CGでは、このビューボリュームを投影 する。 図2.30、図2.31 32 33 34 透視投影のビューボリューム 透視投影のビューボリュームは下図の赤で囲んだ四角錐 台になる。 Zmin : Zmax : d : 2a : 2b : 前方クリッピング面までの距離 後方クリッピング面までの距離 投影面までの距離 投影面の幅 投影面の高さ コメント:投影面が2つのクリッピング面に挟まれる形に なっているが、これは、作図の都合上でこのように書い たのであろう。投影面は前方クリッピング面よりもカメラ 側にあるのが普通であると思われる。 35 ビューボリュームの投影 ビューボリュームは3つの手順で投影される 1. もとの右手座標系を左手系に直す。 2. ビューボリュームを後方クリッピング面がz=1、かつz=1におけ るx,yの範囲が-1≦x,y≦1になるように拡大縮小し正規化す る。これを正規化ビューボリュームとよぶ。 3. 正規化ビューボリュームを、-1≦x,y≦1、0≦z≦1となる直方 体の投影後のビューボリュームに透視投影する。投影後の3 次元座標系を投影座標系とよぶ。(このように、3次元CGに おける透視投影の計算は、実際には3次元座標から3次元 座標への変換である。) 図2.33 ビューボリュームを透視投影する式は、3次元射影変換に なる。 36 37 コメント:式の導出で現れるS(,,)は3次元の拡大・縮小を表す変換である。zmax,zmin,d,a,b,dは 「図2.32 ー 透視投影のビューボリュームの位置」に現れる定数である。 透視投影の計算式 右手座標系を左手系に直す変換はS(1,1,-1)。 正規化ビューボリュームは、もとのビューボリュームのzmaxを1に、そこ での四隅のx,y座標が-1 1になるように拡大縮小するので、その変換 はS(d/(azmax),d/(bzmax),1/zmax)となる。 正規化ビューボリュームは奥行き範囲がzmin/zmax 1となる。奥行き範 z = ( z 。 " z˜min ) /(1 " z˜min ) z˜min = zmin /zmax 囲を0 1に変換する式は、 と置くと、 これから正規化ビューボリュームを透視投影する式は下になる。 # X " & #1 % ( %0 % Y" ( = % % Z" ( %0 % ( %% $W "' $0 0 1 0 0 1 ! 0 1 ) z˜min 0 1 &# x & 0 # x& (% ( % ( 0 y( ( % % y( ! z˜min ˜ = P z ( ) min (% z ( ) % z( 1 ) z˜min (% ( % ( ($ 1 ' $ 1' 0 ' したがって、透視投影の計算全体はつぎとおりにになる。 ! # X"& # x& % ( % ( # & % Y " ( = P ( z˜ ) S% d , d , 1 (S(1,1,)1)% y ( min % Z" ( % z( $ azmax bzmax zmax ' % ( % ( $W "' $ 1' 38 39 3次元射影変換 透視投影の変換は3次元射影変換になる。3次元射影変 # X " & # a b c d &# X & 換の一般形は である。 % ( % %Y " ( ) % e % Z" ( % i % ( % $W "' $ m f j n (% ( g h (% Y ( k l (% Z ( (% ( o p'$W ' 上式の等号は、同次座標での等号を意味することに注意。 ! 40 投影の性質 透視投影は遠近法ともよばれ、3次元空間における平行直 線群が投影図上では1点に集中する。この収束点を消点 (消失点)とよぶ。 投影面とxyz軸の位置関係により、3点透視図、2点透視図、 1点透視図のいずれかになる。 図2.37、図2.38、図2.39 平行投影のなかで、投影線が投影面に垂直な場合を直投 影とよぶ。それ以外を斜投影とよぶ。 図2.40、図2.41、図2.42 41 42 ビューイングパイプライン 43 図2.43 ビューイングパイプライン デバイス座標系 44 ビューイングパイプライン1 図形が定義され、変換を受け、表示されるまでの一連の座標変 換をビューイングパイプラインとよぶ。 CGが描く仮想世界では、全体を記述する1つの座標系を設定す る。これをワールド座標系とよぶ。 個々の物体の形状は、直接ワールド座標系で与えるのではなく、 物体ごとに形状を与える座標系を設定する。これをモデリング座 標系とよぶ。 ワールド座標系に物体を配置することは、モデリング座標系から ワールド座標系への幾何学的変換を設定することである。これを モデリング変換(M)とよぶ。 図2.43 複雑な物体を定義する場合、そのモデリング座標系は階層的に なる。 45 ビューイングパイプライン2 投影を行うカメラ中心の3次元座標系をカメラ座標系とよび、ワールド 座標系からカメラ座標系への幾何学的変換を視野変換(V)とよぶ。 カメラ座標系を投影座標系に変換する透視投影や平行投影を投影変 換(P)とよぶ。投影変換を行った後の表示範囲がウィンドウである。投 影とは呼ぶが、これも3次元空間から3次元空間への変換である。 ディスプレイへの表示に関する変換 投影座標系で-1≦x,y≦1の範囲がウィンドウに対応し、これが表示され る範囲である。 ディスプレイ上に、画素を単位とするデバイス座標系を定義する。 デバイス座標系で表示に用いる長方形領域をビューポートとよぶ。 ウィンドウの範囲をビューポートに収める変換をビューポート変換(U)と よぶ。ビューポート変換も形式的には3次元から3次元への変換である。 結局、モデリング座標系の点vはv’=UPVMvによって、デバイス座標系 の点v’に変換される。ディスプレイに表示するとき、同次座標を通常の 座標にもどし、そのxy座標に描画する。 図2.44 46 47 クリッピング 図形をビューポート内だけに表示させるためには、表示領 域外の図形またはその一部を除外する操作が必要である。 これを2次元クリッピングとよぶ。 クリッピングの方法は図形ごとにアルゴリズムが知られて いる。線分に対して2次元クリッピングするアルゴリズムが、 教科書に示されている。 3次元CGでは、前方・後方クリッピング面についても除外判 定を行う操作が必要であり、これを3次元クリッピングとよ ぶ。 48 階層モデリング 複数の部分から構成される物体を表現する場合、モデリング座 標系間のモデリング変換をいくつか経由して、ワールド座標系に 変換する。これを階層モデリングとよぶ。 図2.48 階層モデリングされた物体を操作する場合、行列スタックとよぶ データ構造を次のように用いる。 現在のモデリング変換(行列)がスタックのトップにあるとする。 モデリングの階層を一段進める場合、まず、スタックトップをコピーし てプッシュする。次に、モデリング階層を移るための変換をスタック トップに演算し、これを新たな階層におけるモデリング変換とする。 モデリングの階層を戻る場合、スタックをポップし、元のモデリング 変換に戻す。 図2.49 49 50
© Copyright 2025