Skip to content

OoO256/OpenGL-3D

Repository files navigation

기초 컴퓨터 그래픽스 HW3 보고서

20171667 이용욱

빌드 시 주의사항

visual Studio 에서 windows SDK를 찾지 못해 <stdio.h> 등의 라이브러리가 불러와지지 않는 현상이 있습니다.

이는 제 프로젝트의 잘못이 아니라, 제 컴퓨터의 windows SDK의 위치와 사용자의 위치가 달라서 발생하는 것 입니다.

해결 방법은 Visual Studio 상에서

  1. 프로젝트를 우클릭
  2. 프로젝트 대상 변경
  3. 적절한 버전 선택 후 "확인" 클릭

의 절차를 통해 해결할 수 있습니다.

모든 입력은 소문자를 기준으로 하였습니다.

구현이 복잡하여 예시 비디오를 첨부하였습니다.

이름은 HW3_171667.mp4입니다

구현 사항

모든 요구사항을 가산점을 받을 수 있을 정도로 복잡하게 구현하였습니다.

물체의 배치 및 움직임

2.a.i. 복잡한 경로를 따라 움직이는 호랑이 - 구현함

호랑이는 아래와 같은 베트맨 모양을 한 경로를 따라 움직인다

$$ x = \frac{|t|}{t}(\frac{1}{2}|t| - \frac{1}{4}||t|-1| + \frac{1}{2}||t|-3| - \frac{3}{4}||t|-5| - \frac{3}{2}||t|-13| + \frac{1}{4}||t|-17| + \frac{5}{4}||t|-21| + 7sin(\frac{\pi}{12} (||t|-5| - ||t|-8| + 3) + \frac{1}{100} ((||t|-8| - ||t|-13| - 5)^3 + 1.5) $$

$$ y = \frac{3}{4}||t|-1| - \frac{3}{4}||t|-3| -\frac{7}{5}||t|-8| + \frac{7}{5}||t|-13| + \frac{7}{16}(||t|-3| - ||t|-5| -3)^2 + + 4sin(\pi / 12 * (||t|-5| - ||t|-8| - 3))

  • 5/16 * (||t|-13| - ||t|-17|)^2 - 1 / 4 * (||t|-17| - ||t|-21| + 2)^2 + 11.5 $$

다음과 같이 구현하였다

#define ABS(x) abs(abs(t) + x)
#define PI 3.141592

float betman_x(float t) {
	return abs(t) / t * (
		1.0 / 2 * abs(t)
		- 1.0 / 4 * ABS(-1)
		+ 1.0 / 2 * ABS(-3)
		- 3.0 / 4 * ABS(-5)
		- 3.0 / 2 * ABS(-13)
		+ 1.0 / 4 * ABS(-17)
		+ 5.0 / 4 * ABS(-21)
		+ 7 * sin(PI / 12 * (ABS(-5) - ABS(-8) + 3))
		+ 1.0 / 100 * (pow(ABS(-8) - ABS(-13) - 5, 3) + 1.5)
		);
}
float betman_y(float t) {
	return 3.0 / 4 * ABS(-1)
		- 3.0 / 4 * ABS(-3)
		- 7.0 / 5 * ABS(-8)
		+ 7.0 / 5 * ABS(-13)
		+ 7.0 / 16 * pow(ABS(-3) - ABS(-5) - 2, 2)
		+ 4.0 * sin(PI / 12 * (ABS(-5) - ABS(-8) - 3))
		- 5.0 / 16 * pow(ABS(-13) - ABS(-17), 2)
		- 1.0 / 4 * pow(ABS(-17) - ABS(-21) + 2, 2)
		+ 11.5
		;
}

또한 호랑이가 처다보는 방향도 구하여 호랑이를 회전시켰다. 이 때에는 다음 시점의 위치 (x, y)를 구하여 두 점을 잇는 직선으로 구하였다.

또한 호랑이가 걸을 때 위 아래로 움직이게도 하였다. 호랑이가 걷는 모습에 맞추어 z 위치가 변한다. 다음 함수를 사용하였다. $$ z = sin(t % 11) $$

2.a.ii. 계층적 모델링을 방식의 자동차의 복잡한 경로를 따른 움직임 - 구현함

본 프로젝트에서 모든 물체는 class object의 객체인데, parent라는 포인터를 갖는다. object가 모델 메트릭스를 만들 때, parent의 모델 메트릭스를 가져와서 곱한다. 따라서 이는 제귀적으로 계층적 모델링을 구현한 것 이다. 자동차의 각 오브젝트들이 트리 구조를 이루어 모델 메트릭스가 계층적으로 곱해지기 떄문이다.

glm::mat4 object::getModelMatrix()
{
	glm::mat4 ModelMatrix(1.0f);
	if (parent != nullptr) {
		ModelMatrix = ModelMatrix * parent->getModelMatrix();
        
        ...
	return ModelMatrix;
}

또한 자동차의 아래와 같은 하트 경로를 따라 움직이도록 하였다. $$ x = 16sin(\theta)^3 * radius \ y = (13cos(\theta) - 5cos(2\theta) - 2cos(3\theta) - cos(4\theta)) * radius $$

이 때 그레프의 미분을 통해 자동차를 회전시켰으며,

현재 지점의 미분계수와 다음 지점의 미분계수 벡터 사이의 사이각을 구하여 추가적으로 바퀴를 회전시켰다.

그 후 바퀴를 굴러가도록 회전시켰다.

따라서 바퀴도 자연스럽게 더 회전한다.

2.a.iii 서로 다른 5가지 물체의 배치 - 구현함

  1. 원점에 아이언맨을 배치함
  2. 원점에 바이크를 배치함
  3. (-300, -300, 0) 에 ben을 배치함
  4. (-300, 0, 0)에 거미를 배치함
  5. (0, -300, 0)에 늑대를 배치함

2.a.iv 3개의 물체의 키보드 조작, 복잡한 움직임 - 구현함

  1. 아이언 맨

    1.1. 아이언맨의 두 손에서 각각 빨간색, 파란색 불빛이 나오도록 구현하였다.

    1.2 아이언맨이 'u'키를 입력하면 위로 상승하도록 구현하였다.

    1.3 이후 중력에 의해서 추락하고, 땅과 부딪치면 다시 튀어오르도록 구현하였다.

    1.3 각속도를 구현하였다. 'i'를 입력하면 각속도가 증가하여 아이언맨이 회전하고 불빛도 회전한다.

    1.4 'p'키를 누르면 각속도를 0으로 설정하여 회전이 멈춘다.

  2. ben

    2.1 1번 토글을 끄고, 'w', 'a', 's', 'd'를 통해 전진, 우회전, 좌회전, 후진이 가능하다

    2.2 거미와 부딪친 경우, 반발계수가 0.9인 충돌을 한다. 운동량 보존 법칙과, 반발계수의 정의를 사용하였으며, 거미의 질량이 사람보다 10배 큰 것으로 가정하였다.

    2.3 튕겨나갈 때, 중력이 작용하는 뉴턴 법칙을 만족하는 운동을 한다.

  3. 거미

    1. 't'키를 누르면 ben을 향해 가속도가 생겨서 ben을 향해 운동한다.

    2. 등가속도 운동법칙을 적용하였다. 아래와 같다. $$ v' = v + at \ s = v_0t + \frac{1}{2} a t^2 $$

    3. ben과 부딪친 경우, 반발계수가 0.9인 충돌을 한다. 운동량 보존 법칙과, 반발계수의 정의를 사용하였으며, 거미의 질량이 사람보다 10배 큰 것으로 가정하였다.

카메라

2.b.i.A 주 카메라 배치 - 구현함

2.b.i.B 주 카메라 줌 - 구현함

SHIFT 키를 누르고 왼쪽 마우스 버튼을 누른 상태에서 마우스를 좌-우로 움직이면 프로젝션 시, 시아각을 조정하여 줌인/줌아웃 구현

2.b.i.C 주 카메라 이동 - 구현함

왼쪽, 오른쪽, 아래쪽, 그리고 위쪽 화살표 키를 누를 때마다 주 카메라가 세상 좌표계를 구면 좌표계로 생각하여 좌/우/하/상 으로 적절하게 운동하도록 하였다.

2.b.ii.A 부 카메라1 토글 - 구현함

숫자키 '1'을 누르면 상단 첫번째에 부 카메라의 영상이 토글된다.

2.b.ii.B 부 카메라 1 움직임 - 구현함

구현하였다. 키는 다음과 같다. 토글이 안되어있을때는 아래 키 중 일부는 다른 용도를 가지기로 한다.

앞 : w

뒤 : s

좌 : a

우 : d

위 : q

아래 : e

2.b.ii.C 부 카메라 1 회전 - 구현함

구현하였다. 키는 다음과 같다.

우회전 : c

우회전 : z

2.b.ii.D 부 카메라 1 줌 - 구현함

구현하였다. 주 카메라와 같은데, 시프트 대신 알트(ALT)키를 사용한다.

줌인 : ALT + 마우스 오른쪽 이동

줌아웃 : ALT + 마우스 왼쪽 이동

2.b.iii 부 카메라 2 - 구현함

숫자키 2를 누르면 상단의 두번째에 자동차에서 본 세상이 나온다.

2.b.iv 부 카메라 3 - 구현함

숫자키 3를 누르면 상단의 두번째에 자동차에서 본 세상이 나온다.

About

Computer Graphics Course Project @sogang Univ

Resources

Stars

3 stars

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors