본문 바로가기

Coding Note

UE4, problem of the hierarchical scale transformation

대부분의 게임엔진과 동일하게 Unreal Engine 4는 오브젝트의 계층구조를 지원한다.

그런데 계층구조를 이루는 오브젝트의 scale transform에서 조금 이상한 결과를 보이기도한다.


문제는 부모와 자식 오브젝트의 rotation transformation이 서로 다른 경우에 부모의 non-uniform scale transform으로 발생한다. 아래 그림을 보면 부모(아래 박스)의 축과 자식(위 박스)의 축이 서로 다른데, 부모를 빨간 축으로 scale up한 결과이다. 이상하게 자식 박스도 빨간축으로 늘어났다.


  

P(아래 큐브)의 축과 C(위 큐브)의 축. 그리고 P의 non-uniform scale transformation.


Unreal Engine의 나름 라이벌 엔진인 Unity에선 이런 현상이 발생하지 않는다. 아무리 부모축과 자식축이 달라도 일반적으로 예상하듯 부모의 scale이 변한다면 자식도 부모의 축에 맞춰 scaling된다.


  


.. 그래서 Unreal Engine은 잘못만들어진거냐 하면 그렇지 않다.

위의 Unity 예제는 자식 큐브가 완전히 90도 회전했지만 그렇지 않은 상황이라면 자식의 초록색 경계박스가 잘못된 방향으로 늘어나게된다. 이는 경계박스의 제한조건, 즉 경계박스의 모서리는 모두 직각이다를 만족해야만 하기 때문에 어쩔 수 없이 발생하는 현상이다. 물론 어쩔 수 없다는 변명이 언제나 통용되는것은 아니겠지만 말이다..



Unreal Engine의 이러한 문제는 UE4 ANSWERHUB에도 제기되었고 개발자들에게 요청하겠다고 했지만 빠르게 해결될 이슈는 아니라는 답변이 있었다. (https://answers.unrealengine.com/questions/96764/parent-scale-does-not-account-for-child-rotation.html)


UE4는 '게임'이라는 특수한 어플리케이션을 만들기 위한 툴이라는점과 '보편적 행동'이 이런 문제를 해결해주길 원하느냐를 모두 고려해야 할 것이므로 효과적인 해결법을 제시하는 일이 그리 쉽지만은 않을것이라 생각한다.


음.. 완벽한 해결법은 아니지만, UE4에선 relative와 world 두 가지의 scale type을 두어서, 상대적으로 scaling 할지 혹은 자기 자신의 scale만 적용할지를 선택할 수 있게하였다.


특수한 경우가 아니라면 uniform scaling을 하고, non-uniform scaling이 불가피하다면 자식 오브젝트는 world scaling 하는 방식으로 위의 문제를 피해갈 수 있을것이다.