SimpleCube3D
lecture10-orientation
R = Rz * Rx * Ry vs. YawPitchRoll
과목코드 : 514780
강사 : 박경신
날짜 : 2016년 10월 21 일
실습 : HW2 (Hierarchical 3D Objects) Due by 11/11
(e-learning 강의실에 실행파일과 소스코드와 리포트를 전부 “학번이름_숙제2.zip”으로 묶어서 제출하도록 합니다. 또한, 소스코트 폴더에 *.cpp만 담지 말고 비주얼 스튜디오에서 만든 프로젝트 폴더를 담기 바랍니다.) HW1의 기능을 활용해서 계층적 구조의 3차원 객체로 만든다.
– 실습문제
-Geometry 예제 (circle, cube, cylinder, sphere, square)와 Transformation 예제 (car, orbit, planet, robot, simple solar system)를 참고하여 본인만의 ‘꽃/나무 (내부 구성은 창의적으로)’를 구성하여 만든다.
-‘꽃/나무’에 사과, 배, 복숭아, 감 등등이 달려있다. (보고서에 스케치 첨부할 것 – 좀 더 구체적으로 형체를 알아볼 수 있도록)
-‘꽃/나무’ 물체는 적어도 3 단계 이상의 계층적 구조를 가진다. (움직임에 적용)
-‘space bar’-key는 ‘꽃/나무’을 피어/자라나게 하는 button이다. 이 키를 다시 누르면 처음부터 다시 자라난다.
-움직이는 모드에서는 ‘꽃/나무’가 바람에 흔들리듯이 천천히 좌우로 움직이거나 회전을 한다. – 힌트: update() 함수를 사용할 것.
-가능하다면, 2단계 이상의 계층적 구조의 (즉, 부분적으로 다른) 움직임을 ‘꽃/나무’ 물체에 적용하도록 한다.
cos60=0.500000 sin60=0.866025
cos30=0.866025 sin30=0.500000
cos45=0.707107 sin45=0.707107
// glm::rotate(glm::mat4(1.0f), 30.0f, glm::vec3(1.0f, 0.0f, 0.0f));
Rx=
1.000000 0.000000 0.000000 0.000000
0.000000 0.866025 -0.500000 0.000000
0.000000 0.500000 0.866025 0.000000
0.000000 0.000000 0.000000 1.000000
// glm::rotate(glm::mat4(1.0f), 60.0f, glm::vec3(0.0f, 1.0f, 0.0f));
Ry=
0.500000 0.000000 0.866025 0.000000
0.000000 1.000000 0.000000 0.000000
-0.866025 0.000000 0.500000 0.000000
0.000000 0.000000 0.000000 1.000000
// glm::rotate(glm::mat4(1.0f), 45.0f, glm::vec3(0.0f, 0.0f, 1.0f));
Rz=
0.707107 -0.707107 0.000000 0.000000
0.707107 0.707107 0.000000 0.000000
0.000000 0.000000 1.000000 0.000000
0.000000 0.000000 0.000000 1.000000
// R = Rz * Rx * Ry (1. Ry 2. Rx 3. Rz) == XNA CreateRotationY(60) * CreateRotationX(30) * CreateRotationZ(45)
R =
0.047367 -0.612372 0.789149 0.000000
0.659740 0.612372 0.435596 0.000000
-0.750000 0.500000 0.433013 0.000000
0.000000 0.000000 0.000000 1.000000
// glm::eulerAngleYXZ(60, 30, 45) == XNA CreateFromYawPitchRoll(60, 30, 45)
Euler=
0.659740 -0.047367 0.750000 0.000000
0.612372 0.612372 -0.500000 0.000000
-0.435596 0.789149 0.433013 0.000000
0.000000 0.000000 0.000000 1.000000
// glm::yawPitchRoll(60, 30, 45) == XNA CreateFromYawPitchRoll(60, 30, 45)
YPR=
0.659740 -0.047367 0.750000 0.000000
0.612372 0.612372 -0.500000 0.000000
-0.435596 0.789149 0.433013 0.000000
0.000000 0.000000 0.000000 1.000000
glm::mat4 Tx = glm::translate(glm::mat4(1.0f), glm::vec3(3.0f, 0.0f, 0.0f));
glm::mat4 Rz = glm::rotate(glm::mat4(1.0f), 45.0f, glm::vec3(0.0f, 0.0f, 1.0f));
glm::mat4 S = glm::scale(glm::mat4(1.0f), glm::vec3(0.5f, 0.7f, 1.0f));
glm::mat4 TRS = Tx * Rz * S; // Scale XY, and then Rotate Z, and then Translate X
위의 코드는 아래의 코드와 동일한 행렬의 곱 연산을 수행한다.
glm::mat4 T = glm::translate(glm::mat4(1.0f), glm::vec3(3.0f, 0.0f, 0.0f)); // T
glm::mat4 TR = glm::rotate(T, 45.0f, glm::vec3(0.0f, 0.0f, 1.0f)); // T * R
glm::mat4 TRS = glm::scale(TR, glm::vec3(0.5f, 0.7f, 1.0f)); // T * R * S
lecture9
lecture8