Game Development, 게임개발/게임 수학,물리

게임물리 - 회전

게임이 더 좋아 2021. 9. 3. 12:40
반응형
728x170

 

물론 내가 선형대수학을 공부할 때

회전변환을 공부하였다.

 

[Game Developer, 게임개발자/게임 수학,물리] - 선형변환, Linear Transformation - 회전변환, 로드리게스 회전 공식 [게임수학]

[Game Developer, 게임개발자/게임 수학,물리] - 선형변환, Linear Transformation - 회전변환, 로드리게스 회전 공식 [게임수학]

 

하지만 렌더링에서 좌표자체를 회전변환시켜 구현한다는 것이 아니라 다른 방법을 알아보고자 한다.

알아보자

 


 

분명 회전변환 식이 이렇다.

 

세타만큼 회전하고 싶다면 해당 좌표를 넣어 값을 얻으면 될 것이다.

하지만 변환된 좌표를 얻으려면 2차원의 경우

곱셈 2번과 합연산 1번을 2번을 해야 각각 변환된 x' , y' 이 나올 것이다.

픽셀 하나당 그렇게 연산을 한다고 생각한다면

우리가 저해상도로 알고 있는 640 * 480의 해상도에서도 회전변환 시

1M 이상의 계산을 필요로 한다.

 

게임은 현실과 비슷해야하지만 항상 Trade-off 관계라는 것을 잊으면 안된다.

실제와 정말 같다면 실제와 같이 모든 것을 집어넣어 계산을 해야하고 고성능을 요한다.

하지만 실제와 같은 것이 필요하지는 않다.

정말 사용자에게 실제로 느끼게 하는 것이냐? 가 중요한 것이다.

즉, 사용자의 컴퓨터에서도 실제와 비슷하게 구현할 수 있느냐?가 문제다.

 

아무튼 간단한 이미지 회전조차 저렇게 계산이 많이 필요하다면 게임을 진행할 수 없다는 의미다.

 

하지만 공학자는 언제나 답을 찾는다.

일차 변환의 Linearity를 이용한다.

 

선형성을 이용하여 기저벡터 자체를 회전변환시키는 것을 생각했다.

 

그림을 보면 이해가 빠르다.

 


 

즉, 우선 기저벡터 i,j 가 각각 (1,0) (0,1) 이라고 한다면

변환된 기저벡터 2개는 아래와 같이 변할 것이다.

 

	vBase1_x = cosf(fAngle);						// 기저벡터1
	vBase1_y = sinf(fAngle);
	vBase2_x = cosf(fAngle + PI / 2.0f);			// 기저벡터2
	vBase2_y = sinf(fAngle + PI / 2.0f);

 

즉, 이 기저벡터 자체로 모든 좌표를 이전의 x,y를 넣어서 해결하면 된다는 뜻이다.

 

예를 들어서

 

(3,2) 의 좌표를 변환 이전에 가지고 있었다면

기저벡터로 나누면 3*i + 2*j 이므로

해당 기저벡터만 3*a + 2*b 로 바꿔주면 (a,b 회전변환된 기저벡터)

좌표에 대해서 회전변환을 계속구할필요 없이

이미 계산된 회전변환된 기저벡터만 이용하면 바로바로 회전이 가능하다는 말이다.

1번만 계산하면 그 값을 이용하여 모든 이미지에 적용하면 된다는 것이다.

 

 

 

728x90
반응형
그리드형