물론 내가 선형대수학을 공부할 때
회전변환을 공부하였다.
[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번만 계산하면 그 값을 이용하여 모든 이미지에 적용하면 된다는 것이다.
'Game Development, 게임개발 > 게임 수학,물리' 카테고리의 다른 글
Geometry Pipeline, 오브젝트부터 스크린까지의 변환 (0) | 2021.11.07 |
---|---|
게임수학 - 동차좌표계, Homogeneous coordinates ** (4) | 2021.09.05 |
게임물리 - 빛의 반사 (0) | 2021.09.03 |
게임 물리 - 안티앨리어싱, AA ( Anti-Aliasing) (0) | 2021.09.02 |
게임 물리 - 충돌 판정 (0) | 2021.08.27 |