Open powercrabman opened 2 months ago
안녕하세요. 제보해주셔서 감사합니다.
사실 굉장히 오래전에 인지하고 있었던 문제이기도 했는데, 그동안 이렇게까지 깊게 보신분이 없어서 덮어놓고 있긴 했었습니다.
버그 수정 감사드립니다.
Yaw/Roll/Pitch는 오일러각 형태로 API를 만들다보니, 외적으로 세 로컬 축을 구하는 부분에서 예외처리로 빠져버린 것 같네요.
말씀하신대로 오일러각 요소 분해가 아닌 사원수 곱으로 구현하는게 가장 안전합니다만, 보통 에디터 UI에서 트랜스폼을 설정할 때 요/롤/피치를 직접 지정하도록 고안되어 있다보니 이를 감안한 API를 추가했습니다. 해당 API는 정적인 설정에만 사용하시면 될 것 같습니다.
현재 로직에서는 바운드 볼륨이 하나의 절단 평면과만 겹쳐도 렌더링을 수행합니다. 즉, 오브젝트가 어떤 절단 평면에 대해서는 절두체의 외부에 있더라도, 다른 평면과 교차하면 렌더링이 진행됩니다. 하지만 이 경우 실제로는 렌더링할 필요가 없는데도 불구하고, 잘못된 교차 판단으로 인해 렌더링이 이루어지는 문제가 있습니다.
원평면과 근평면을 매우 가깝게 설정하고 절두체 컬링을 수행해보겠습니다.
https://github.com/user-attachments/assets/360f1295-3842-48c4-b91a-8257349b0c9d
아무것도 안그려져야 정상이지만 상하좌우 평면에 겹침판정(Intersect) 이 발생할 시 렌더링이 수행됩니다.
코드를 이렇게 고치면 컬링이 잘 수행됨을 확인할 수 있습니다.
더하여 사원수 회전 코드도 조금 이상하다고 생각합니다. 이런식으로 회전을 수행하게 되면
https://github.com/user-attachments/assets/ac96fba0-7d98-4d2e-b227-5cba441bf81e
피치를 90도 혹은 270도 정도로 설정할 시 회전이 잘 안되는 현상이 발생합니다. (왜 그런지는 잘모르겠습니다. 오일러각과 사원수 사이는 일대일 대응되지 않아서 발생하는 문제라고 생각합니다.)
이런 식으로 그냥 사원수 곱으로 회전덧셈을 정의하면 버그가 사라지게 됩니다.
https://github.com/user-attachments/assets/2f9245ed-9b0d-4d3b-8581-3b517cce0d8c