3차원그래픽스의기하변환 - hallym.ac.krgraphics.hallym.ac.kr › teach › 2006 › cga...
Transcript of 3차원그래픽스의기하변환 - hallym.ac.krgraphics.hallym.ac.kr › teach › 2006 › cga...
Computer Graphics App.
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2006/cga
3차원 그래픽스의 기하변환
September 21, 2006
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2006/cga
가상 트랙볼 (Virtual Trackball) (1)
마우스의위치를이용하여회전변환을제어
객체의부드러운연속적인회전변환을제공
트랙볼구조
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2006/cga
가상 트랙볼 (2)
단계 1) 화면상의마우스위치를트랙볼상의위치로역투영
222
2222
zxry
rzyx
−−=
=++
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2006/cga
가상 트랙볼 (3)
단계 2) 두점사이의회전평면결정
법선벡터계산
단계 3) 회전각결정
단계 4) 사원수에
의한 3D 회전
21 ppn ×=
( )211cos pp ⋅= −θ θ
사원수사원수((QuaternionsQuaternions))
n
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2006/cga
사원수 (Quaternions) (1)
1개실수부 + 3개허수부
특성:
덧셈과스칼라곱
kcjbiasq +++=1222 −=== kji
jikki
ikjjk
kjiij
=−==−==−=
dkcdjbdiadsdq 11111 +++=
( ) ( ) ( ) ( )2121212121 cckbbjaaissqq +++++++=+
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2006/cga
사원수 (2)
순서쌍개념
스칼라 ‘s’ + 벡터 “v = (a, b, c)”
덧셈
곱셈
절대값
역수
( )v ,sq =
( )212121 , vv ++=+ ssqq
( )211221212121 , vvvvvv ×++⋅−= ssssqq
vv ⋅+= 22sq
( )v ,1
21 s
qq =− ( )0 ,111 == −− qqqq
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2006/cga
‘사원수’와 3D 회전
3D 점 (α, β, γ)에대하여단위사원수 와그켤레사원수
이용
Rq : 회전축 (ux, uy, uz)을중심으로 2θ만큼 3D 회전행렬
( )cbasq , , ,=( )cbasq −−−= , , ,
( ) ( )γβαγβα ′′′=⋅⋅ , , ,0 , , ,0 qq
( ) qpqpRq ⋅⋅=
( ) ( )( )zyx uuucbasq , ,sin ,cos , , , θθ==
회전축회전축 ((uuxx, , uuyy, , uuzz))을을중심으로중심으로 회전각회전각 22θθ 만만큼큼 점점 ((αα, , ββ, , γγ))을을 회전시킴회전시킴
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2006/cga
사원수에 의한 3D 회전 (1)
임의의축에대한회전단위사원수를구성 (u: 단위벡터)
임의의점 P를사원수표기법으로변환 (p = (x, y, z))
사원수에의한 3D 회전계산수행 (q-1=(s, –v))
새로운사원수결과
( )cbas , ,2
sin ,2
cos ===θθ
uv
( )pP ,0=
1−=′ qqPP
( )pP ′=′ ,0
( ) ( ) ( )pvvpvvpvpp ××+×+⋅+=′ ss 22
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2006/cga
사원수에 의한 3D 회전 (2)
사원수의계산을회전행렬로유도
이동변환을연결하여임의의점에대한회전
( )
( ) ( ) ( ) ( ) ( )xxyyzyyxx
R
basabcsbac
sabccascab
sbacscabcb
θθθθθ
θ
RRRRR
M
−−=
⎥⎥⎥
⎦
⎤
⎢⎢⎢
⎣
⎡
−−+−−−−++−−−
=22
22
22
2212222
2222122
2222221
( ) ( )TMTR θθ R1−=
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2006/cga
Header File for a Trackball
typedef double vec3d[3];
#ifndef M_PI#define M_PI 3.14159265#endif
class TrackBall {private:
int width, height;vec3d lastPos;
//quaternionsdouble s;vec3d v;
public:double rMat[16];
public:TrackBall();virtual ~TrackBall();
void initialize( void );void resize( const int &cx, const int &cy );void project( int &xi, int &yi, vec3d &v );void start( int xi, int yi );void end( int xi, int yi );
};
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2006/cga
Vector Operations
void normalize( vec3d &v ){
double d = 1.0 / sqrt( v[0]*v[0] + v[1]*v[1] + v[2]*v[2] );v[0] *= d;v[1] *= d;v[2] *= d;return;
}
double dot( vec3d &a, vec3d &b ){
return ( a[0]*b[0] + a[1]*b[1] + a[2]*b[2] );}
void cross( vec3d &a, vec3d &b, vec3d &c ){
c[0] = a[1]*b[2] - a[2]*b[1];c[1] = a[2]*b[0] - a[0]*b[2];c[2] = a[0]*b[1] - a[1]*b[0];return;
}
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2006/cga
Projection to a HemisphereTrackBall::TrackBall(){
initialize();}
TrackBall::~TrackBall(){
}
void TrackBall::initialize( void ){
s = 1.0;v[0] = v[1] = v[2] = 0.0;for( int i=0; i<16; i++ ) rMat[i] = 0.0;rMat[0] = rMat[5] = rMat[10] = rMat[15]= 1.0;return;
}
void TrackBall::resize( const int &cx, const int &cy ){
width = cx; height = cy;return;
}
void TrackBall::project( int &xi, int &yi, vec3d &v ){
v[0] = ( 2.0*xi – width ) / (double)width;v[1] = ( height - 2.0*yi ) / (double)height;double d = sqrt( v[0]*v[0] + v[1]*v[1] );v[2] = cos( M_PI * 0.5 * ( (d<1.0)? d : 1.0 ) );
normalize( v );return;
}
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2006/cga
Creation of Quaternionsvoid TrackBall::start( int xi, int yi ){
project( xi, yi, lastPos );return;
}
void TrackBall::end( int xi, int yi ){
vec3d currPos, t;
project( xi, yi, currPos );
t[0] = currPos[0] - lastPos[0];t[1] = currPos[1] - lastPos[1];t[2] = currPos[2] - lastPos[2];
if( t[0] || t[1] || t[2] ){
double angle = M_PI*0.5*sqrt( t[0]*t[0] + t[1]*t[1] + t[2]*t[2] );vec3d axis;cross( currPos, lastPos, axis );normalize( axis );
double s2 = sin( angle*0.5 );vec3d v2 = { s2*axis[0], s2*axis[1], s2*axis[2] };s2 = cos( angle*0.5 );
double s1 = s;vec3d v1 = { v[0], v[1], v[2] }, v3;cross( v1, v2, v3 );s = ( s1 * s2 ) - dot( v1, v2 );v[0] = s1*v2[0] + s2*v1[0] + v3[0];v[1] = s1*v2[1] + s2*v1[1] + v3[1];v[2] = s1*v2[2] + s2*v1[2] + v3[2];
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2006/cga
Creation of a Rotation Matrixdouble d = 1.0 / sqrt( s*s + v[0]*v[0] + v[1]*v[1] + v[2]*v[2] );s *= d;v[0] *= d;v[1] *= d;v[2] *= d;
// rotation with quaternions// P' = quat * P * quat^-1// M = { { 1-2b^2-2c^2, 2ab-2sc, 2ac+2sb }, // { 2ab+2sc, 1-2a^2-2c^2, 2bc-2sa },// { 2ac-2sb, 2bc+2sa, 1-2a^2-2b^2 } };rMat[0] = 1.0 - 2.0 * (v[1]*v[1] + v[2]*v[2]);rMat[1] = 2.0 * (v[0]*v[1] - s*v[2]);rMat[2] = 2.0 * (v[2]*v[0] + s*v[1]);//rMat[3] = 0.0;
rMat[4] = 2.0 * (v[0]*v[1] + s*v[2]);rMat[5] = 1.0 - 2.0 * (v[2]*v[2] + v[0]*v[0]);rMat[6] = 2.0 * (v[1]*v[2] - s*v[0]);//rMat[7] = 0.0;
rMat[8] = 2.0 * (v[2]*v[0] - s*v[1]);rMat[9] = 2.0 * (v[1]*v[2] + s*v[0]);rMat[10] = 1.0 - 2.0 * (v[0]*v[0] + v[1]*v[1]);//rMat[11] = 0.0;
//rMat[12] = rMat[13] = rMat[14] = 0.0;//rMat[15] = 1.0;
lastPos[0] = currPos[0];lastPos[1] = currPos[1];lastPos[2] = currPos[2];
}return;
}
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2006/cga
Global Variables
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2006/cga
Initialization & Resize
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2006/cga
Mouse Controls
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2006/cga
DrawScene ( )
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2006/cga
What’s Wrong?
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2006/cga
연습 문제 (1)
아래와같이그림자가바닥에위치하도록수정
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2006/cga
New Project (1)
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2006/cga
New Project (2)
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2006/cga
New Project (3)
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2006/cga
OpenGL에서 변환 행렬
행렬모드 (Matrix modes)‘model-view’와 ‘projection’행렬
3종류함수: 회전(rotation), 이동(translation), 신축(scaling)
glRotatef(angle, vx, vy, vz);
glTranslatef(dx, dy, dz);
glScalef(sx, sy, sz);
model-view projection꼭지점 꼭지점
CTM(Current Transformation Matrix)
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2006/cga
이동 (Translation)
물체의모든꼭지점에이동벡터를더함
void glTranslate{fd} (TYPE dx, TYPE dy, TYPE dz)void glTranslate{fd} (TYPE dx, TYPE dy, TYPE dz)
원점에중심이위치한물체 카메라로부터멀어진물체
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2006/cga
Before Translation
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2006/cga
GLUT Library (1)
glut.h (/VC98/include/gl), glut32.lib (/VC98/lib), glut32.dll (Windows/system32)
void glutWireCube(GLdouble size);void glutSoildCube(GLdouble size);
void glutWireCube(GLdouble size);void glutSoildCube(GLdouble size);
void glutWireSphere(GLdouble radius, GLint slices, Glint stacks);void glutSoildSphere(GLdouble radius, GLint slices, Glint stacks);
void glutWireSphere(GLdouble radius, GLint slices, Glint stacks);void glutSoildSphere(GLdouble radius, GLint slices, Glint stacks);
void glutWireCone(GLdouble base, GLdouble height, GLint slices, Glint stacks);void glutSoildCone(GLdouble base, GLdouble height, GLint slices, Glint stacks);
void glutWireCone(GLdouble base, GLdouble height, GLint slices, Glint stacks);void glutSoildCone(GLdouble base, GLdouble height, GLint slices, Glint stacks);
void glutWireTeapot(GLdouble size);void glutSoildTeapot(GLdouble size);
void glutWireTeapot(GLdouble size);void glutSoildTeapot(GLdouble size);
void glutWireTorus(GLdouble inner, GLdouble outer, GLint sides, Glint slices);void glutSoildTorus(GLdouble inner, GLdouble outer, GLint sides, Glint slices);
void glutWireTorus(GLdouble inner, GLdouble outer, GLint sides, Glint slices);void glutSoildTorus(GLdouble inner, GLdouble outer, GLint sides, Glint slices);
void glutWireTetrahedron();void glutSoildTetrahedron();void glutWireOctahedron();void glutWireOctahedron();void glutWireDodecahedron();void glutSoildDodecahedron();void glutWireIcosahedron();void glutWireIcosahedron();
void glutWireTetrahedron();void glutSoildTetrahedron();void glutWireOctahedron();void glutWireOctahedron();void glutWireDodecahedron();void glutSoildDodecahedron();void glutWireIcosahedron();void glutWireIcosahedron();
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2006/cga
GLUT Library (2)
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2006/cga
GLUT Library (3)
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2006/cga
실행 결과 – Before Translation
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2006/cga
After Translation (1)
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2006/cga
실행 결과 – After Translation (1)
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2006/cga
After Translation (2)
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2006/cga
Why?
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2006/cga
glPushMatrix( ), glPopMatrix( )
glPushMatrix( )와 glPopMatrix( )변환을수행한다음, 수행하기이전상태로되돌림
glPushMatrix();
glTranslatef(.....);glRotatef(.....);glScalef(.....);
/* draw object here */
glPopMatrix();
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2006/cga
After Translation (3)
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2006/cga
실행 결과 – After Translation (2)
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2006/cga
회전 (Rotation)
주어진회전축과기준점(고정점)에대해반시계방향으로회전
void glRotate{fd} (TYPE angle, TYPE ax, TYPE ay, TYPE az)void glRotate{fd} (TYPE angle, TYPE ax, TYPE ay, TYPE az)
일반적인회전
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(xf, yf, zf);
glRotatef(angle, ax, ay, az);
glTranslatef(-xf, -yf, -zf)
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2006/cga
신축 (Scaling)
원점을기준으로크기인자(scale factor)만큼물체의크기를늘이거나또는줄임
void glScale{fd} (TYPE sx, TYPE sy, TYPE sz)void glScale{fd} (TYPE sx, TYPE sy, TYPE sz)
nonuniform 크기인자에의한신축
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2006/cga
OpenGL에서 행렬 직접 설정 (1)
OpenGL의변환함수를이용하지않고직접행렬을만들어설정할수있음
행렬: 4행 4열 2차원배열이아닌열순서 (column order)의 16개원소를갖는 1차원배열
void glLoadMatrix{fd} (TYPE *m)
void glMultMatrix{fd} (TYPE *m)
void glLoadMatrix{fd} (TYPE *m)
void glMultMatrix{fd} (TYPE *m)
⎥⎥⎥⎥
⎦
⎤
⎢⎢⎢⎢
⎣
⎡
]15[]11[]7[]3[
]14[]10[]6[]2[
]13[]9[]5[]1[
]12[]8[]4[]0[
aaaa
aaaa
aaaa
aaaa
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2006/cga
OpenGL에서 행렬 직접 설정 (2)
예제) 밀림 (shearing)
⎥⎥⎥⎥
⎦
⎤
⎢⎢⎢⎢
⎣
⎡
=
1000
0100
0010
00cot1 θ
xH
정육면체의밀림
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2006/cga
Setting Matrices Directly (1)
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2006/cga
Setting Matrices Directly (2)
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2006/cga
실행 결과 – 신축
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2006/cga
계층적 모델 (Hierarchical Model) (1)
모델의일부가다른부분에종속적임만약일부분이움직이면, 다른부분도함께움직임
간단한로봇팔 (robot arm) 계층적표현
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2006/cga
계층적 모델 (2)
GLU 구(sphere)와원기둥(cylinder)를이용하여만든모습
계층적표현
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2006/cga
계층적 모델 만들기
예) 간단한로봇팔 (robot arm)
lower arm
base
upper arm
gluCylinder(GLUqadricObj *q,
GLdouble base_radius,
GLdouble top_radius,
GLdouble height,
GLint slices,
Glint stacks)
gluCylinder(GLUqadricObj *q,
GLdouble base_radius,
GLdouble top_radius,
GLdouble height,
GLint slices,
Glint stacks)
glutSolidCube(GLdouble size)
glutWireCube(GLdouble size)
glutSolidCube(GLdouble size)
glutWireCube(GLdouble size)
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2006/cga
Modeling of H.M. (1)
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2006/cga
Modeling of H.M. (2)
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2006/cga
Modeling of H.M. (3)
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2006/cga
Modeling of H.M. (4)
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2006/cga
Modeling of H.M. (5)
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2006/cga
Modeling of H.M. (6)
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2006/cga
Modeling of H.M. (7)
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2006/cga
실행 결과 – Modeling of H.M.
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2006/cga
연습 문제 (2)
아래그림과같이되도록이동변환을시키시오.
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2006/cga
계층적 모델의 회전 변환
예) 간단한로봇팔 (robot arm)
lower armbase upper arm
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2006/cga
연습 문제 (3)
아래의키가눌릴때, 로봇팔의각부분이회전되도록만드시오.왼쪽화살표 – base가시계방향으로회전
오른쪽화살표 – base가반시계방향으로회전
위쪽화살표 – lower arm이반시계방향으로회전
아래화살표 – lower arm이시계방향으로회전
Home 키 – upper arm이반시계방향으로회전
End 키 – upper arm이시계방향으로회전
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2006/cga
연습 문제 (3) – Robot Arm