情報工学
2023年度後期 第3回 [11月1日]

静岡大学
工学研究科機械工学専攻
ロボット・計測情報講座
創造科学技術大学院
情報科学専攻三浦 憲二郎講義アウトライン [11月1日]•平行移動, 回転移動, 拡大･縮小•同次座標系 ( homogeneous coordinate system)•ローカル座標系

頂点変換の手順

3D図形の移動と拡大･縮小
1. 平行に移動させる: 平行移動 (translation)
2. 回転させる: 回転移動 (rotation)
3. 大きさを変える: 拡大･縮小 (scaling)平行移動 (translation)
P(x, y, z) を T(xt, yt, zt)だけ平行移動させる.
x’ = x + xt
y’ = y + yt
z’ = z + zt

回転移動 (rotation)
例えば, P(x, y, z) を z軸回りにθ 度回転移動させる.
x’ = x cosθ - y sinθy’ = x sinθ + y cosθz’ = z拡大･縮小(scaling)
原点を中心としたスケーリング.
x’ = sx x
y’ = sy yz’ = sz z

OpenGLのコマンド:平行移動
void glTranslate{fd}(TYPE x, TYPE y, TYPE z)
オブジェクトを(x, y, z)だけ平行移動させる.
TYPE f … GLfloatd … GLdouble

OpenGLのコマンド:回転移動
void glRotate{fd}(TYPE angle, TYPE x, TYPE y, TYPE z)
オブジェクトを軸(x, y, z)回りに angle 度回転移動させる.
TYPE f … GLfloatd … GLdouble
右図では(x,y,z)=(0,0,1)

OpenGLのコマンド:拡大･縮小
void glScale{fd}(TYPE x, TYPE y, TYPE z)
オブジェクトを軸に沿って拡大･縮小する.
TYPE f … GLfloatd … GLdouble平行移動 (translation):同次座標同次座標系 (homogeneous coordinate)
3次元 (x, y, z) -> ４次元 (xh, yh, zh, w) として表す.

xh y h z h( x, y , z ) = ( , , )w w w

平行移動を表す行列Ｔ1
0T =
000
1000010xt yt zt 1平行移動 (translation)：行列表現
xt   x   x + xt y + y 
yt   y  t=zt   z   z + zt   1  1  1
P ' = ( x + xt , y + yt , z + zt ,1)

1
0
P ' = TP = 
0

00
1
000010回転移動 (rotation):同次座標
Ｚ軸回りの回転移動を表す行列Ｒ

cosθ
 sin θT = 0 0− sin θcosθ
00

00
100

0
0

1

回転移動 (rotation):行列表現

cosθ − sin θ 0 0  x   x cosθ − y sin θ  sin θ cosθ 0 0  y   x sin θ + y cosθ   = P' = RP = 
 0
01 0  z   z  00 1 1  1
 0
P' = ( x cosθ − y sin θ , x sin θ + y cosθ , z ,1)拡大･縮小 (scaling):同次座標
拡大･縮小を表す行列S

sx
0
S=
0

00
sy
0
000
sz
00
0
0
1

拡大･縮小 (scaling):行列表現
sx
0P' = SP = 0

00
sy00

P' = ( s x x, s y y, s z z ,1)00
sz00  x   s x x s y 0  y   y =0  z   s z z    1 1  1 

同次座標系のメリット
平行移動, 回転移動, 拡大･縮小の複数の幾何変換が4行4列の１つの行列で表現できる.

M total = M 0 M・・・
Mn1

ローカル座標系
オブジェクトとともに座標系にも変換を施す.

ローカル座標系による行列の定義
各行列Miはローカル座標系で定義される.

P' = M total P = M 0 M・・・
M
P1n

課題3 回転，平行移動，拡大縮小
グラフィック•OpenGLの利用•線の描画( GL_LINES )•ウィンドウ座標•色の指定( glClearColor(), glColor() )•太さの指定( glLineWidth() )•四則演算•和, 差, 積, 商, 余りの計算•浮動小数型変数 (double 型)

課題３サンプルプログラム(実行結果)

exer3.c(main())
int main(int argc, char **argv){
glutInit(&argc, argv); /* GLUTの初期化 */glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);/* 表示モードの指定 */glutInitWindowSize(400, 400);/* ウインドウサイズの指定
glutInitWindowPosition(100, 100);/* ウインドウの位置の指定
glutCreateWindow("OpenGL Sample 2");/* ウインドウのオープンinit();/* 初期化処理 */glutDisplayFunc(display);/* 表示の関数の指定 */glutMainLoop();/* GLUTのメインループ
return 0;}

*/
*/
*/

*/

exer3.c(init())
void init(void){
glClearColor ( 0.0, 0.0, 0.0, 0.0 ); /*背景色の指定*/
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0);/*描画のための投影法の指定*//*正射影投影法*/}*初期状態ではカメラ位置は (0,0,0),z軸の負の向きを向く. y軸が上方向.

exer3.c(drawTriangle(),display())
void drawTriangle(){glBegin(GL_LINE_LOOP);
glVertex2f(0.0, 0.0);
glVertex2f(0.5, 0.0);
glVertex2f(0.25, 0.25);
glEnd();}/* 三角形の描画/* 線分を描画する/* 第1点の指定/* 第2点の指定/* 第3点の指定

void display(void){
glClear(GL_COLOR_BUFFER_BIT);/* 背景のクリア
drawTriangle();glRotatef(90.0, 0.0, 0.0, 1.0);
drawTriangle();glFlush();/* 画面を再描画する */}三角形の描画

*/
*/
*/
*/
*/

*/

課題
課題Ａ
for文を用いて１個の三角形を90度回転させ、４個の三角形を描画する。
Hint. display()関数の中で、z軸を回転軸とし、回転角度を90度にしてglRotatef()を呼び出しては，drawTriangle()を呼ぶことを繰り返す。
課題B
for文を用いて１個の三角形をｘ軸方向に0.1ずつ平行移動して４個の三角形を描画する．
課題C
for文を用いて１個の三角形をｘ軸, ｙ軸方向ともに1.2倍ずつ拡大して４個の三角形を描画する．２つ目の三角形は1.2倍，３つ目の三角形は1.2×1.2＝(1.2)2倍となればよい。
課題D（時間に余裕のある人のために）三角形に対して，回転，平行移動，およびスケーリングを組み合わせて意味のある形状や模様を作成せよ。

まとめ•平行移動, 回転移動, 拡大･縮小•同次座標系 ( homogeneous coordinate system)•ローカル座標系