티스토리 뷰

누군가 이 글을 읽으시다 틀린부분을 발견하시고 피드백을 주신다면 언제나 환영입니다.

1장은 점과 직선이 게임이 아니어도 컴퓨터 환경에서 어떤 역할을 할 수 있는지에 대해 학습한다.

 

챕터 미리보기

  • 점을 정의하는 법
  • 직선의 모든(기울기를 포함) 특성

  • 게임 환경에서 직선과 직선간 충돌 검사의 설명

 


 

함수

 함수는 어떤 정보를 입력받고 정보를 토대로 새 정보를 출력하는 규칙을 가진다. 프로그래밍에서도 각종 자료형을 입력 받고 다른 형태로 반환하거나 결과를 출력하는 역할을 한다.

 수학에서의 함수는 일반적으로 수를 다룬다. 함수는 수 하나를 받고 규칙을 적용한 후, 새로운 수를 반환한다. 수학에서 함수는 두가지 방법으로 정의된다.

 

  1. 입력값과 그에 따르는 출력값이 있는 순서쌍의 집합 테이블 생성하는 방법
  2. 방정식을 사용하는 방법

 1번 방식은 (0, 0), (1, 2), (2, 4)와 같은 순서쌍에 대한 데이터 참조 테이블을 만들어야하며 테이블에 없는 수가 입력되면 오류가 발생한다. 즉, 데이터가 많을 수록 유리하지만 메모리 점유율이 매우큰 테이블이 필요하다.

 2번 방식은 두 수의 연관짓는 방정식을 생성하는 것으로 (0, 0), (1, 2), (2, 4)와 같은 순서쌍은 y = 2x라는 함수를 작성이 가능하다. 이러한 형태는 테이블 정의보다 메모리 소모가 훨씬 적다.

 


 

점과 직선

"은 2D와 3D환경에서 위치를 지정해주고  운동경로나 물체의 경계를 결정할 수 있다."

 

점을 정의하는 법

 일반적으로 게임 프로그램을 짤 때, 컴퓨터는 어떤 물체를 화면에 배치하기 위해 데카르트 좌표계(Cartesian Coordinate System) or 직교 좌표계를 사용한다.

 데카르트 좌표계는 수평으로 x축, 수직으로 y축을 구성하며 두 축의 교차 지점인 원점(0, 0)을 기준으로 오른쪽은 양의 x좌표, 왼쪽은 음의 x좌표, 위는 y의 양의 좌표, 아래는 y의 음의 좌표이다.

데카르트 좌표계
화면 좌표계

 

데카르트 좌표계외에 화면 좌표계가 존재한다. 화면좌표계는 단말기의 화면의 왼쪽 위를 원점으로 하는 평면 절대 좌표계이다. 마우스나 터치를 처리하는 좌표계이기도 하며 카메라의 위치나 각도에 상관없이 동작한다. 
* 전체 렌더링 과정에서는 마지막 단계가 데카르트 좌표계를 화면 좌표계로 변환하는 것이다.
[데카르트 (x, y) -> 화면 (x, -y) 방정식 성립]

 

 데카르트 좌표계는 3차원에서 z축하나를 추가하여 (x, y, z)좌표가 사용된다.

이때 오른손/왼손 좌표계라는 개념이 나오는데 이는 z축이 바라보는 방향에 따라 선택되는 사항이다.

참고로 오른손은 z축이 화면의 를 가르키며 왼손정면으로 나아가게 된다. OpenGL은 오른손 좌표계를 사용하며 DirectX는 왼손 좌표계를 사용한다.

오른손과 왼손 좌표계는 자주 비교된다고 들었는데, 결과적으로는 사용하기 편한걸 사용하는게 더 좋다고 한다.

참고로 이 부분은 엔진이나 각종 프로젝트에 따라 오른손/왼손 좌표계, z축과 y축 반전 등 기준점이 다르기때문에 주의해야한다.

 


 

직선을 정의하는 법

"A와 B가 동시에 0이 아닐 때, Ax + By = C 꼴을 갖는 방정식의 그래프가 직선이다." 

 직선은 방적식으로 나타낸 각 점(개별해)를 모든 전채 해집합이다.

즉, y = 2x라는 방정식에 성립되는 개별해 <(1, 2), (2, 4), (3, 6)>는 통틀어 방정식을 만족하는 점들로 전채 해집합으로 보면 다음과 같다.

1차 방정식 그래프를 그리는 것은 y에 대해 정리하는 방법이 가장 쉽다.


예제 1.3 : 직선 그리기
방정식 3x - 2y = 8의 그래프 그려보기
1. -2y = -3x + 8
2. y = -(3/2)x + 4
3. y = (3/2)x - 4

* 이 후 가장 쉽게 x = 0부터 시작한다.
f(0) = -4 = (0, -4)
f(1) = (3/2) - 4 = 1.5 - 4 || (3/2) - (8/2) = (1, -2.5)
f(2) = (3/2)2 - 4 = 3 - 4 = (2, -1)
f(3) = (3/2)3 - 4 =  1.5 * 3 - 4 = 4.5 - 4 = (3, 0.5)
f(4) = (3/2)4 - 4 = 1.5 * 4 - 4 = 6 - 4 = (4, 2)
예제 1.4 : 수평선 그리기
방정식 y = 3의 그래프 그려보기

* 이 문제는 언뜻 방정식이 없어 보이지만 0x + 1y = 3처럼 방정식을 생각해 볼 수 있다. 결국 Ax + By = C 방정식이 성립된다.

 


 

직선의 성질

 직선의 가장 중요한 성질 중 하나는 <기울기  & 경사도> 이다.

먼저 기울기는 <(y2 - y1) / (x2 - x1)>의 공식을 가진다.

중요
표준형 Ax + By = C 방정식으로 표현된 직선의 기울기는 m = -(A/B)로 정의할 수 있다.
또다른 방식으로는
y = mx - b은 기울기 - 절편 공식
(y - y1) = m(x - x1), (x1, y1)은 점 - 기울기 공식이 있다.

 이 중에서는 기울기 - 절편 공식이 가장 많이 보이는 형태가 된다. 이는 y축과 만나는 점과 기울기를 한눈에 보기 쉽고 그래프를 그리기 쉽기 때문이다. (만들어진 방정식을 사용하기 편하다)
 하지만, 점 - 기울기 공식이 다른 두 공식보다 이점이 많다. 두 점만 가지고 방정식을 만들때, 하나의 점과 기울기만 알면 방정식을 만들 수 있기 때문이다. (직선의 방정식 유도가 간편)

출처. 위키하우

예로 수평 100m를 이동하면 수직 50m씩 상승하는 경사면이 존재한다면, 이는 이동량에 비례한 비율 계산으로 기울기는 <1/2x - y = c>(수직 / 수평)가 성립된다.

 또한 기울기음수일때 왼쪽에서 오른쪽으로 내려가고, 양수이면 왼쪽에서 오른쪽으로 올라가며, 기울기가 0이면 수평선을 유지한다. 마지막으로 기울기 공식에서 제수가 0이면 기울기를 정의할 수 없으며 수직선이 된.

 이를 두 점으로 연산을 바꾸어 작성하면 다음과 같은 결과가 나온다.

예시 1.5 : 두 점 사이 기울기
두 점 (1, 5)와 (-2, 0) 사이 기울기 구하기

* (y2 - y1) / (x2 - x1) = c
* (-5 / -3) = 1.66...
float 기울기 함수 (float[] 포인트1, float[] 포인트2)
	return (포인트2.y - 포인트1.y) / (포인트2.x - 포인트1.x)

 


 

직교

 두 선이 교차하는 기울기가 직각인 직교 상태일때 두 직선기울기를 곱하면 항상 -1이 나온다. 이는 두 직선 기울기 사이에 음의 역수를 취하는 관계가 성립되기 떄문이다.

 이는 게임에서 직각으로 충돌하는지 검사하기 유용한 계산법이다.

// 한 직선의 직각이 되는 다른 기울기는 해당 기울기의 -1을 나눈 값이다.
float 직교가 되는 기울기 구하기 (float 기울기)
	return -1 / 기울기
더보기

직교의 여부는 m1m2 = -1, m1 = -1/m2, m2 = -1/m1 중 하나라도 만족하면 직교 상태이다.

float 직교여부 확인 함수 (float 기울기1, float 기울기2)
	if 기울기1 * 기울기2 == -1
    else if -1 / 기울기1 == 기울기2
    else if -1 / 기울기2 == 기울기1
    	return true;    
        
	return false;
예시 : 두 선은 직교인가?
A : (-3, 0), (0, 1) 두 점을 지나는 직선
B : (0, 3), (1, 0) 두 점을 지나는 직선

A 기울기 = (1 - 0) / (0 - (-3)) = 0.33...
B 기울기 = (0 - 3) / (1 - 0) = -3

A와 직교가되는 기울기 = -1 / 0.33... = 0.33√-1 = -3
B와 직교가되는 기울기 = -1 / -3 = -3√-1 = 0.33...

A와 B는 직교이다.

 


 

요약

  1. 직선의 기울기 방정식
    1. (y2 - y1) / (x2 - x1)
    2. y = mx + b
    3. (y1 - y2) = m(x1 - x2)
  2. 표준형 Ax - By = C 직선의 기울기는 m = -(A/B)가 된다.
  3. 그래프에서 기울기가 음수면 왼쪽에서 오른쪽으로 내려간다
  4. 그래프에서 기울기가 양수면 왼쪽에서 오른쪽으로 올라간다
  5. 그래프에서 기울기가 0이면 수평이다
  6. 기울기 공식에서 제수가 0이면 기울기 정의가 불가능 하다
  7. 수직으로 만나는 두 직선 기울기의 곱은 항상 -1이다

더보기

해보기
예제 1.8 : 직선의 방정식 구하기
 게임에서 캐릭터가 화면상에서 (50, 200)에 위치해 있습니다. 플레이어가 (150, 400)을 클릭하여 가고자 하는 방향을 지정했습니다. 원하는 위치까지 가는 직선경로의 방정식을 구하십시오.

예제 1.9 : 수직선의 방정식 구하기
 게임에서 한 물체가 직선 y = 2/3x + 20을 따라서 움직이고 있습니다. 이 물체가 (30, 40)에 도착했을 때, 플레이어가 방향키를 눌러서 왼쪽으로 90도 꺾어서 직선으로 가도록 하려고 합니다. 새로 이동하는 경로의 방정식을 구하십시오.

예제 1.10 : 3차원에서 직선 정의하기
 게임 캐릭터가 3차원 세계에서 현재 (50, 200, 75)에 위치해 있습니다. 여러분은 캐릭터를 (100, 50, 225)로 옮기고자 합니다. 캐릭터가 목적지까지 이동하는 직선 경로를 구하십시오.

 

....

 

이후 글은 모드 스스로 평가하는 문제이므로 책을 보고 풀이하도록 하며 따로 표기하지 않는다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함