특정 축을 기준으로 회전하는 알고리즘 아이디어
그냥 선형대수학 공부하고있는데 뜬금없이 생각나서 적어본다.
나중에 까먹을 가능성이 높아서 여기다 적어놓는다.
틀릴수도있는데 일단 되게 간단하고 직접 손으로 값대입해보면서 넣어봤는데 얼추 들어맞는다.
일단 아이디어의 큰틀은 이렇다.
회전시킬 벡터를 z축으로 가지는 정규직교기저를 만든다음에z축회전시키고다시 처음 구한 직교기저의 전치행렬을 곱하면 된다. 이 아이디어는 기저변환행렬에서 아이디어를 따왔다.
그럼 먼저 주어지는 값은 회전시킬 축(벡터)과 몇도만큼 회전시킬지에 대한 세타값, 그리고 그 축을 기준으로 회전시킬 위치벡터
이렇게 해서 3개가 주어지면,
우선 R3에서 동작시킨다는 가정하에(3d게임에 적용)
1. 회전시킬 축을 z축으로 가지는 정규 직교 기저를 만들어낸다.
사진에서 우선 p벡터를 정규화하고 열벡터로 만들어서 3번째 열에 넣고 표준기저의 x성분인(1, 0, 0)과 외적해서 2번째 열성분에 집어넣고 다시 그 벡터를 p와 외적해서 1번째 열에 집어넣는다. 당연히 이 기저의 모든 열벡터는 normalize를 해야한다.
2.이제 z축회전젼환행렬을 곱한다.
3.거기에 우리가 처음 구한 기저변환행렬의 전치행렬을 곱한다.
원래 역행렬을 곱해서 이 행렬의 기저를 표준기저로 바꿔야하는데 어짜피 우리가 구한 기저변환행렬은 직교행렬이기때문에 전치행렬을 곱하는게 성능상 도움된다.
그렇게 구한 행렬과 우리가 특정축을 기준으로 회전시킬 위치벡터를 넣으면 회전된다!
그냥 지금 졸려서 대충 말했는데 그냥 노트하는느낌으로 쓴거라.. 내년에 시간남을때 테스트해봐야겠다…
그리고 첫번째에서 기저변환행렬만들때 만약
회전시킬 특정축이 1,0,0나 0,1,0이면 문제가 생기기에
회전시킬축을 xy평면에 정사영해서 어느방향으로 더 발달됬는지 판단한다음 기저변환행렬의 x축기저먼저 만들지 y축기저먼저 만들지 정하면 될듯하다..
뭔가 머리속으로는 정리가 되어있는데, 졸려서 좀 설명하기 버겁다… 일단 자자 오늘은
'🖥️ DirectX 개인 강좌&방법론 > DirectX12 방법론' 카테고리의 다른 글
DirectX12에서 텍스트를 렌더링하는 2가지 방법 소개 (1) | 2022.08.08 |
---|
댓글