버그 해결을 위한 모든 질문을 던져
0 votes
76 views
별도의 3d 그래픽스 api 없이 렌더러를 작성해 보고 있는데요, 카메라 회전 구현 중 계속 막히고 있어 막막함을 해소하고자 질문글 올립니다.

마우스 이동에 따라 카메라가 회전하도록 하는 회전 기능을 구현중입니다. 우선 카메라가 가지는 값들로는

* 카메라의 월드 좌표(EYE)

* 카메라가 바라보는 지점(AT)

* 카메라의 기저(u, v, n) - 정규직교기저입니다.

이며, 우선 렌더 루프마다 이전 루프 시점의 마우스 커서의 x, y좌표의 현재 시점의 x, y좌표 차이를 이용해 y축, x축 회전각을 정한 후 다음과 같은 절차로 회전을 시키도록 구현했습니다.

1. 카메라의 시점을 원점으로 이동

이를 위해 AT을 -EYE만큼 이동 변환합니다.

2. 카메라 기저가 표준기저가 되도록 AT을 회전

카메라의 기저가 정규직교기저임을 보장할 수 있으므로 회전행렬의 각 행을 카메라의 기저벡터로 구성하여 회전행렬을 구성하였습니다.

3. 앞서 처음 구한 회전각만큼 회전 변환

4. 이전의 월드 좌표계 기저가 다시 표준기저가 되도록 AT을 역회전
2.에서 사용한 회전행렬의 전치행렬을 이용합니다.

5. AT을 -EYE만큼 이동

6 AT과 EYE를 이용해 카메라의 새 기저를 구함
외적을 이용합니다

...인데, 이대로 구현하면 원하는 대로 회전이 이루어지지 않고 시점이 튀거나 AT의 좌표가 이상해지는 문제가 있습니다.. 혹시 이 방식에 논리적 문제가 있는지 아니면 다른 방법이 있는지 조언을 부탁드립니다.
asked (24 point) , 76 views

1 답변

+1 vote
자답입니다.

기저 좌표 로그를 찍어가면서 관찰하다 보니 연산이 중첩됨에 따라 부동소수 연산의 오차 누적에 의해 기저의 정규성이 깨지는 현상-drift라고 부르는 것 같은데, 맞는지는 잘 모르겠습니다-이 발생하는 바람에 문제가 있었던 것 같습니다. 실시간으로 카메라를 회전시키지 않고 카메라 회전각을 저장해 놓은 후 매 정점변환마다 한번에 적용하는 방식으로 구현하였습니다.
answered (24 point)
수정됨

버그 해결을 위해 도움을 구하고, 도움을 주세요. 우리는 그렇게 발전합니다.

throw bug 는 프로그래밍에 대한 전분야를 다룹니다. 질문,논의거리,팁,정보공유 모든 것이 가능합니다. 프로그래밍과 관련이 없는 내용은 환영받지 못합니다.

597 질문
758 answers
727 댓글
118,330 users