탄막 슈팅에서 탄막은 특정 객체에 종속되어 있다.
내가 쏘는 탄이라면 내가 조종하는 플레이어블 캐릭터 객체에, 적이 날린 탄막이라면 적 객체에 종속이 되어 위치가 정해진다.
이런 경우 객체가 회전을 하면 탄도 회전을 한다.
만약, 객체가 회전하지 않고 종속된 탄이 회전하여 모양을 만들어 내려면 어떻게 해야 할까.
객체의 위치는 행렬로 정해진다.
좌표를 나타내는 행렬에 S(Scale), R(Rotation), T(Transformation)이라는 행렬들이 곱해져 위치가 정해진다. 여기에 객체를 늘 따라가기 위해서 종속된 객체에는 부모(편의상 부모 자식 관계로 칭함) 객체의 R * T 행렬이 추가로 곱해진다.
이렇기 때문에 부모가 이동을 하면 자식도 이동을 하는 것이다. 그렇다면 부모는 회전하지 않고 자식만 부모 주위를 회전하게 하기 위해선 어떻게 해야 할까?
사실 해결 방법은 간단하다. 보이지 않는 객체를 만들어 이 객체를 자식 객체의 부모로 지정하고 회전을 하면 자식 객체만 회전하고 표면적으로 보이는 부모 객체는 회전하지 않는 것처럼 보인다.
하지만 이렇게 하게되면 추가로 객체를 생성해야 하는 비용이 생긴다. 펫처럼 객체가 하나 혹은 둘, 몇 안되는 경우에는 부담이 덜하지만, 만약 탄막처럼 수많은 객체를 생성해야 할 경우에는 비용 부담이 만만치 않다.
때문에 우리는 회전값을 가지고 있는 데이터인 rotation과 더불어 자식 객체만을 위한 회전값인 revolution을 추가로 생성할 필요가 있다.
revolution은 공전이다. 즉 가만히 있는 부모 주위로 자식 객체가 회전을 하기 위해 존재하는 데이터다.
초기에 객체가 생성이 되면 원점을 중심으로 좌표가 설정이 된다. 이때 객체에 SRT가 곱해졌고 부모의 RT가 추가로 곱해지는데, 부모의 RT가 곱해지기 전, R2라고 명명한 자식 객체의 회전행렬을 곱해주게 되면 자식 객체만 별도로 회전을 한다.
이 경우, 이미 원점을 기준으로 좌표가 잡혀 있는 자식 객체는 회전을 할 때 스스로 돌지 않고 원점을 기준으로 반경을 그리며 회전을 한다.
왜냐하면 원점을 기준으로 잡힌 position이 있기 때문에 이 좌표 값은 일정해야 한다.
원점을 기준으로 각 정점의 거리는 매번 일정해야 하기 때문에 회전을 하면 객체 자체가 원점을 중심으로 회전을 하는 것처럼 보인다.
그 다음 부모 객체의 RT가 곱해져 최종적으로 부모 객체 주변을 공전하는 자식 객체가 생성되는 것이다.
이를 순서로 나타내면 다음과 같다.
자식 객체 생성(원점) -> 자식 객체의 로컬좌표에 SRT가 곱해져 좌표계상에 객체 생성 -> R2라는 회전 행렬이 곱해져 자식 객체 회전 -> 각 정점은 원점으로부터 일정한 거리에 존재해야 하기 때문에 객체가 스스로 회전하는 것이 아닌 원점을 중심으로 회전 -> 부모 객체의 RT가 곱해지며 자식 객체의 원점이 부모 객체로 이동
이를 이용해서 간단한 그림을 그려보았다.
각각 회전값을 다르게 주면 저런 모양으로 회전을 하게 된다.
'프로그래밍 > 공부' 카테고리의 다른 글
[DirectX] 렌더링 파이프라인 - (1) (0) | 2023.01.04 |
---|---|
[Game] 각도와 방향 (0) | 2023.01.01 |
[Game] 객체의 회전 (0) | 2022.12.19 |
[Game] 변환행렬 (2) | 2022.12.15 |
[Programing] 정적 & 동적 라이브러리 (0) | 2022.12.15 |
댓글