第10回 グラフィックスのための幾何学

本日の講義概要

同次座標系による座標表現

2次元座標

2次元平面上の点を

の形で表現する形式を同次座標表現と呼ぶ.実際の座標値は,[x/m y/m]の値を持つ.

この座標表現の特徴は,m=0とすることが可能な点にある.この時,x,yの座標値は無限大となるが,方向ベクトルxyは取ることが可能なので,Computer Graphicsにおける光源座標などの特定方向の無限遠点を表現することが可能となる.

座標変換マトリックス

この表現に対して,次の変換行列Tを作って変換TUを行うと変換後の座標を得ることができる.

回転角Θの回転移動

x座標の拡大率をxt,y座標方向の拡大率をytとしたときの拡大・縮小

x軸方向の平行移動量をxm*m,y軸方向の平行移動量をym*mとした平行移動

同次座標系表現による座標変換のメリット

平行移動の表現

最後の平行移動を見ると分かるが,同次座標表現を使わないで座標変換マトリックスを2×2で用いた場合,平行移動を表現することができないが,同次座標表現を行っている場合は平行移動も含めて全ての座標変換操作を座標変換マトリックスの形で表現することができる.

座標変換の組み合わせ

さらに,この形式では,連続する座標変換操作の中の各操作を表現する行列を求め,それらの積を求めることで,任意の座標変換マトリックスを得ることができる.例えば

の順に座標変換を行うとすると

の形で表現することができる.上式ではTr・Tmの部分だけを先に計算しておくことが可能となり,多数の座標変換を同時に行う際に有効となる.また行列の定義式中の一部を変数のまま残して計算しておき,後からパラメータとして要素を確定させることも可能である.

※先に行う座標変換のマトリックスを先に(演算としては右側に)計算している点に注意

Computer Graphicsにおける有効性

コンピュータグラフィックス分野では,オブジェクトの形状は3頂点座標で定義されるポリゴンの集合として表現される.通常オブジェクトは独自の座標系でモデリングされてから,3次元空間中の舞台に配置される.この配置の際に同次座標系による座標変換が多用される.また,ワールド座標系に配置してから,最終的にスクリーン上の座標へと変換を行うが,この際の透視・平行投影でも座標変換マトリックスを作成した後に変換がおこなわれる.

このような処理を行うためにグラフィックスボードに実装されているGPUでのレジスタは32×4=128ビット構成となっており,頂点座標の表現値(x, y, z, w)を一つのレジスタに格納し座標変換を行うことが可能となっている.またGPUが処理するポリゴンは年々増加し,数百万のオーダーのポリゴンをグラフィックスボードのメモリ中に確保し,それらに対して1秒間で30回以上のレートで座標変換を行い,陰面の消去,シェーディング,シャドウイングなどを,高度な並列演算メカニズムで実行している.

MATLABによるプログラミング

3種類の座標変換を行う行列を生成するスクリプトを作成し,それらを組合せて描画を行う.


function z = rotate2d(q)
% rotate2d(x,y) Generation of coordinate transformation matrix for 2D
% Input: One scala value of angle
% Output: 2D coordinate transformation matrix
% By your_name, your class, build date
z=[cos(q) -sin(q) 0;
sin(q) cos(q) 0;
0 0 1]

function z = magnify2d(xt,yt)
% rotate2d(x,y) Generation of coordinate transformation matrix for 2D
% Input: Two scala value of magnification
% Output: 2D coordinate transformation matrix
% By your_name, your class, build date
z=[xt 0 0;
0 yt 0;
0 0 1]

function z = move2d(xm,ym)
% rotate2d(x,y) Generation of coordinate transformation matrix for 2D
% Input: Two scala value of coordinate value
% Output: 2D coordinate transformation matrix
% By your_name, your class, build date
z=[1 0 xm;
0 1 ym;
0 0 1]
 
rotate2d.m magnify2d.m move2d.m


例題プログラム(drawex2d.m)

%function z = drawex2d()
% drowex2d(x,y) Generation of coordinate transformation matrix for 2D
% Input: Two scala value of coordinate value
% Output: 2D coordinate transformation matrix
% By your_name, your class, build date
 
% clear graphic plane
clf
clear
rotatenum=5
 
%initialize of square
t=0:2*pi/4:2*pi;x=cos(t); y=sin(t);
v=ones(size(x));u=[x;y;v];
 
%plot the square
plot(x,y), axis equal, hold on
 
% rotate square and draw
for i=1:1:rotatenum
p=pi*(i-1)/rotatenum
T=rotate2d(p)
ut=T*u
plot(ut(1,:), ut(2,:),'r:'), axis equal, axis('square'), pause(0.125)
end

実行結果

練習問題

3次元版座標変換

3次元空間では,座標表現が次の形になる

また,平行移動量がx,y,zの3軸方向に,回転がx,y,zの3軸周りに,拡大もx,y,zの3軸方向に増え,その分座標変換マトリックスの定義が増える.

では,x軸回りの回転をΘx,y軸回りの回転をΘ,z軸回りの回転をΘ,とする.回転の向きは,無限遠から原点を見て,時計回りに回る方向を正の回転とする.

従って,x軸,y軸,z軸回りに順に回転を行う座標変換は次の式で表現される.変換の順番に注意すること.

また各軸方向の平行移動及び拡大は,次の式で表される.

最も特徴的な変換例は,ロボットの上腕などのリンクメカニズムで体の中心の座標から肩関節までの平衡移動として表現し,肩関節による回転,さらに上腕部による平行移動,と組み合わせていくことで最終的に手に持った道具などの座標が決められることになる.

MATLABによるプログラミング


function z = rotate3d(qx,qy,qz)
% rotate3d(x,y) Generation of coordinate transformation matrix for 3D
% Input: One scala value of angle
% Output: 3D coordinate transformation matrix
% By your_name, your class, build date
z1=[
1 0 0 0;
0 cos(qx) -sin(qx) 0;
0 sin(qx) cos(qx) 0;
0 0 0 1]
z2=[
cos(qy) 0 sin(qy) 0;
0 1 0 0;
-sin(qy) 0 cos(qy) 0;
0 0 0 1]
z3=[
cos(qz) -sin(qz) 0 0;
sin(qz) cos(qz) 0 0;
0 0 1 0
0 0 0 1]
z=z3*z2*z1

function z = magnify3d(xt,yt,zt)
% rotate3d(xt,yt, zt) Generation of coordinate transformation matrix for 3D
% Input: three scala value of magnification
% Output: 3D coordinate transformation matrix
% By your_name, your class, build date
z=[xt 0 0 0;
0 yt 0 0;
0 0 0 zt
0 0 1]

function z = move3d(xm,ym,zm)
% rotate3d(x,y,z) Generation of coordinate transformation matrix for 3d
% Input: three scala value of coordinate value
% Output: 3d coordinate transformation matrix
% By your_name, your class, build date
z=[1 0 0 xm;
0 1 0 ym
0 0 1 zm
0 0 0 1]
rotate3d.m magnify3d.m move3d.m


例題プログラム(drawew3d1.m

%function z = drawex3d1()
% drowex3d1(x,y) Generation of coordinate transformation matrix for 3D
% Input: Two scala value of coordinate value
% Output: 3D graphics out
% By your_name, your class, build date
 
% clear graphic plane
clf
 
%initialize of square
t=0:2*pi/4:2*pi; x=cos(t); y=sin(t);
v=ones(size(x)); z=zeros(size(x)); u=[x;y;z;v];
 
%plot the square
plot3(x,y,z), axis equal, hold on; grid on;
xlabel('X-Axis');ylabel('Y-Axis');zlabel('Z-Axis');
 
% rotate square and draw
for p=pi/16:pi/16:pi/2
T=rotate3d(0,p,0)
ut=T*u
plot3(ut(1,:),ut(2,:),ut(3,:),'r'), axis equal, axis('square'), pause(0.125) %表示の状況によっては axis equal を削除した方が良いかもしれません.
end

 

今後の予定


数値解析2のページへ

第11回目へ