Download presentation
Presentation is loading. Please wait.
1
Geometric Transformations
2
Rigid Transformations
A rigid transformation T is a mapping between affine spaces T maps vectors to vectors, and points to points T preserves distances between all points T preserves cross product for all vectors (to avoid reflection) In 3-spaces, T can be represented as
3
Rigid Body Rotation Rigid body transformations allow only rotation and translation Rotation matrices form SO(3) Special orthogonal group (Distance preserving) (No reflection)
4
Rigid Body Rotation R is normalized R is orthogonal
The squares of the elements in any row or column sum to 1 R is orthogonal The dot product of any pair of rows or any pair columns is 0 The rows (columns) of R correspond to the vectors of the principle axes of the rotated coordinate frame
5
3D Rotation About Arbitrary Axis
6
3D Rotation About Arbitrary Axis
Rotate u onto the z-axis
7
Taxonomy of Transformations
Rigid Affine Projective
8
Vector, Matrix Coding
9
Class 3차원 Vector와 4x4 Matrix Class를 만들어 본다 class Vector3 { public:
float p[3]; }; class Mat4x4 { public: float p[4][4]; };
10
더 확장된 편리한 class 설계? 연산자 오버로딩!!!
11
complex 클래스 연산자 오버로딩을 위한 예제 클래스 // 복소수 클래스 class Complex { public:
// 생성자 Complex(int realPart, int imaginaryPart); // 접근자들 int SetReal(int realPart); int SetImaginary(int ImaginaryPart); int GetReal() const {return real;} int GetImaginary() const {return imaginary;} private: int real; // 실수부 int imaginary; // 허수부 };
12
복소수간 더하기? 복소수 간 더하기는 실수부 따로, 허수부 따로! a = 1+3i b = 4+5i 더하기의 의미가 다르다!
자신이 만든 객체 간의 연산을 정의할 수 있을까? a = 1+3i b = 4+5i a+b = (1+4) + (3+5)i 연산자 오버로딩
13
연산자 오버로딩 객체 안에 연산자에 따른 함수를 정의하는 것 기본형: 용법: 반환값 = 자신(this) + right
class Test { Test operator+ (Test& right); }; Test operator+ (Test& right) … }
14
피연산자가 두 개인 연산자(1) 피연산자가 두 개인 + 연산자를 오버로딩 하는 예 class Complex { // 중간 생략
Complex operator+(const Complex& right) // 실수부와 허수부를 각각 더한다. int real = this->real + right.real; int imag = this->imaginary right.imaginary; // 결과를 보관한 복소수 객체를 반환한다. return Complex(real, imag); }
15
피연산자가 두 개인 연산자(2) 피연산자가 두 개인 + 연산자를 오버로딩 하는 예 Complex c1(1, 1);
// + 연산자를 사용한 덧셈 c3 = c1 + c2; // c3 = (3, 3) c3 = c1.operator +(c2);
16
피연산자가 두 개인 연산자(3) 피연산자와 인자의 매칭 [27-1]
17
연습 Vector의 빼기 연산을 오버로딩 해보자 Vector의 Dot Product 연산을 오버로딩 해보자
18
일반함수를 사용한 오버로딩 연산자는 꼭 맴버 함수여야 하는가? 일반 함수를 사용할 수 있다.
19
일반 함수를 사용한 연산자 오버로딩(1) 멤버 함수가 아닌 일반 함수를 사용해서 + 연산자를 오버로딩 하는 예
Complex operator+(const Complex& left, const Complex& right) { // 실수부와 허수부를 각각 더한다. int real = left.real + right.real; int imag = left.imaginary + right.imaginary; // 결과를 보관한 복소수 객체를 반환한다. return Complex(real, imag); }
20
일반 함수를 사용한 연산자 오버로딩(2) 피연산자와 인자의 매칭 [27-2]
21
일반 함수를 사용한 연산자 오버로딩(3) 멤버 함수가 아닌 일반 함수를 사용해서 + 연산자를 오버로딩 하는 예
!!! .real과 .imaginary는 private!!! Complex operator+(const Complex& left, const Complex& right) { // 실수부와 허수부를 각각 더한다. int real = left.real + right.real; int imag = left.imaginary + right.imaginary; // 결과를 보관한 복소수 객체를 반환한다. return Complex(real, imag); }
22
friend 함수의 등록 친구 함수: 친구 함수 선언법: friend 사용 하여 함수등록
일반 함수 이지만 객체의 private 맴버 함수, 변수를 접근할 수 있는 함수 친구 함수 선언법: friend 사용 하여 함수등록 class Complex { // 중간 생략 friend Complex operator+(const Complex& left, const Complex& right); };
23
일반 함수를 사용한 연산자 오버로딩(4) 멤버 함수가 아닌 일반 함수를 사용해서 + 연산자를 오버로딩 하는 예
int main() { Complex c1(1, 1); Complex c2(2, 2); Complex c3(0, 0); // + 연산자를 사용한 덧셈 c3 = c1 + c2; // c3 = (3, 3) c3 = operator +(c1, c2); return 0; }
24
연산자 오버로딩의 규칙 오버로딩이 가능한 연산자가 제한되어 있다. 기본 타입의 연산 방법은 바꿀 수 없다.
피연산자가 모두 기본 타입인 연산자 함수는 만들 수 없다. 기존 연산자의 의미를 헤치지 않는 것이 좋다. 예) + 연산자를 뺄셈의 용도로 오버로딩 하는 것은 좋지 않다.
25
OpenGL Geometric Transformations
glMatrixMode(GL_MODELVIEW);
26
OpenGL Geometric Transformations
Basic Transpormation: glLoadIdentity(); glTranslatef(tx, ty, tz); glRotatef(theta, vx, vy, vz); angle-axis (vx, vy, vz) is automatically normalized glScalef(sx, sy, sz); glLoadMatrixf(Glfloat elems[16]); Multiplication glMultMatrixf(Glfloat elems[16]); The current matrix is postmultiplied by the matrix Column major
27
OpenGL Geometric Transformations
Getting the current matrix value: glGetFloatv (GL_MODELVIEW_MATRIX, GLfloat elems[16]); Column major 4 8 12 1 5 9 13 2 6 10 14 3 7 11 15 GLfloat mat [16]; glGetFloatv (GL_MODELVIEW_MATRIX, mat);
28
OpenGL Geometric Transformations
Matrix Direct Manipulation: glLoadMatrixf(GLfloat elems[16]); Column major glMultMatrixf(GLfloat elems[16]); The current matrix is postmultiplied by the matrix 4 8 12 1 5 9 13 2 6 10 14 3 7 11 15 glLoadIdentity(); glMultMatrixf (M1); glMultMatrixf (M2); M = M1∙M2
29
OpenGL GLUT Animation Function
GLUT Idle Callback fuction: Idling: when there is nothing to do. Redraw the scene: void MyIdle() { … // things to do … // when Idling } glutIdelFunc ( MyIdle ); glutPostRedisplay ( );
30
바람개비(풍차)만들기
31
Hierarchical Modeling
A hierarchical model is created by nesting the descriptions of subparts into one another to form a tree organization
32
OpenGL Matrix Stacks Stack processing
The top of the stack is the “current” matrix glPushMatrix(); // Duplicate the current matrix at the top glPopMatrix(); // Remove the matrix at the top
33
Homework #2 다각형을 이용하여 움직이는 2차원 아름다운 애니메이션 만들기
Push/Pop Matrix를 사용하여 2단계 이상의 계층적인 움직임 디자인을 할 것 Ex): 태양계 시스템 (태양지구달) 숙제제출: 이메일 제출 (Screenshot, code, report) 숙제마감: 4월 15일 목요일 23시59분까지
Similar presentations