onlybooks / gamemath

<이득우의 게임 수학> 공식 깃허브 페이지
MIT License
178 stars 75 forks source link

코드에 오류가 있는것 같습니다. #30

Open powercrabman opened 2 months ago

powercrabman commented 2 months ago
  1. 절두체 코드 image

현재 로직에서는 바운드 볼륨이 하나의 절단 평면과만 겹쳐도 렌더링을 수행합니다. 즉, 오브젝트가 어떤 절단 평면에 대해서는 절두체의 외부에 있더라도, 다른 평면과 교차하면 렌더링이 진행됩니다. 하지만 이 경우 실제로는 렌더링할 필요가 없는데도 불구하고, 잘못된 교차 판단으로 인해 렌더링이 이루어지는 문제가 있습니다.

image

원평면과 근평면을 매우 가깝게 설정하고 절두체 컬링을 수행해보겠습니다.

https://github.com/user-attachments/assets/360f1295-3842-48c4-b91a-8257349b0c9d

아무것도 안그려져야 정상이지만 상하좌우 평면에 겹침판정(Intersect) 이 발생할 시 렌더링이 수행됩니다.

image

코드를 이렇게 고치면 컬링이 잘 수행됨을 확인할 수 있습니다.

image

더하여 사원수 회전 코드도 조금 이상하다고 생각합니다. 이런식으로 회전을 수행하게 되면

https://github.com/user-attachments/assets/ac96fba0-7d98-4d2e-b227-5cba441bf81e

피치를 90도 혹은 270도 정도로 설정할 시 회전이 잘 안되는 현상이 발생합니다. (왜 그런지는 잘모르겠습니다. 오일러각과 사원수 사이는 일대일 대응되지 않아서 발생하는 문제라고 생각합니다.)

image

이런 식으로 그냥 사원수 곱으로 회전덧셈을 정의하면 버그가 사라지게 됩니다.

https://github.com/user-attachments/assets/2f9245ed-9b0d-4d3b-8581-3b517cce0d8c

ideugu commented 2 months ago

안녕하세요. 제보해주셔서 감사합니다. 사실 굉장히 오래전에 인지하고 있었던 문제이기도 했는데, 그동안 이렇게까지 깊게 보신분이 없어서 덮어놓고 있긴 했었습니다.
버그 수정 감사드립니다.
Yaw/Roll/Pitch는 오일러각 형태로 API를 만들다보니, 외적으로 세 로컬 축을 구하는 부분에서 예외처리로 빠져버린 것 같네요. 말씀하신대로 오일러각 요소 분해가 아닌 사원수 곱으로 구현하는게 가장 안전합니다만, 보통 에디터 UI에서 트랜스폼을 설정할 때 요/롤/피치를 직접 지정하도록 고안되어 있다보니 이를 감안한 API를 추가했습니다. 해당 API는 정적인 설정에만 사용하시면 될 것 같습니다.