HW2

단국대학교 응용컴퓨터공학 컴퓨터그래픽스 (2016년 봄학기) 실습

 

과목코드 : 514780

강사 : 박경신

날짜 : 2016년 10월 21 일

실습 : HW2 (Hierarchical 3D Objects) Due by 11/11

 

(e-learning 강의실에 실행파일과 소스코드와 리포트를 전부 학번이름_숙제2.zip으로 묶어서 제출하도록 합니다. 또한, 소스코트 폴더에 *.cpp만 담지 말고 비주얼 스튜디오에서 만든 프로젝트 폴더를 담기 바랍니다.) HW1의 기능을 활용해서 계층적 구조의 3차원 객체로 만든다.

 

– 실습문제

  1. HW1 가을 풍경 ‘꽃/나무/캐릭터’ 등 본인이 원하는 계층적 변환 구조(Hierarchical transformation)를 가진 3차원 객체를 3개 이상을 만든다 (e.g., SimpleCar, SimpleMobile, SimpleSolar).

-Geometry 예제 (circle, cube, cylinder, sphere, square)와 Transformation 예제 (car, orbit, planet, robot, simple solar system)를 참고하여 본인만의 ‘꽃/나무 (내부 구성은 창의적으로)’를 구성하여 만든다.

-‘꽃/나무’에 사과, 배, 복숭아, 감 등등이 달려있다. (보고서에 스케치 첨부할 것 – 좀 더 구체적으로 형체를 알아볼 수 있도록)

-‘꽃/나무’ 물체는 적어도 3 단계 이상의 계층적 구조를 가진다. (움직임에 적용)

 

  1. a-key가 눌려지면 animation play/pause 모드로 바꿔줄 수 있도록 한다.

-‘space bar’-key는 ‘꽃/나무’을 피어/자라나게 하는 button이다. 이 키를 다시 누르면 처음부터 다시 자라난다.

-움직이는 모드에서는 ‘꽃/나무’가 바람에 흔들리듯이 천천히 좌우로 움직이거나 회전을 한다. – 힌트: update() 함수를 사용할 것.

-가능하다면, 2단계 이상의 계층적 구조의 (즉, 부분적으로 다른) 움직임을 ‘꽃/나무’ 물체에 적용하도록 한다.

 

  1. 또한 w-key가 눌려지면 wireframe/solid모드로 바꿔줄 수 있도록 한다. 위의 코드로 하나의 완성된 장면을 구성하는 프로그램을 작성하고, 실행 화면과 코드를 첨부하시오.

YawPitchRoll

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::transform

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