Unity 검색

로보틱스 툴박스 확장: Unity 2022.1 물리 개선

2022년 5월 12일 엔진 & 플랫폼 | 6 분 소요
3D rendered wagon on Unity user interface
3D rendered wagon on Unity user interface
공유

Is this article helpful for you?

Thank you for your feedback!

3D rendered wagon on Unity user interface

로보틱스 툴박스 확장: Unity 2022.1 물리 개선

새로운 역동역학 힘 센서 툴을 활용하면 환경을 인식하는 정교한 로봇을 시뮬레이션할 수 있습니다. 새롭게 탈바꿈한 Physics Debugger와 동역학 시뮬레이션을 사용해보고 개선된 보간과 배치 쿼리 성능을 활용해 보세요.

Physics Debugger 개선 사항

Physics Debugger는 물리 엔진 내부의 작동 방식을 파악하고 프로젝트에서 관찰된 특정 동작을 이해하는 데 필수적인 툴입니다. 최신 기술을 적용하여 실제 세계와 비슷한 물리를 저작하려면 디버거의 성능이 좋아야 합니다. 이 점을 염두에 두고 사용자 인터페이스(UI)를 대대적으로 개편했으며 흥미로운 기능도 몇 가지 추가했습니다. 

동일한 공간에 더 많은 정보를 넣을 수 있도록 프로퍼티를 탭으로 그룹화했고, 일부 새로 추가된 프로퍼티도 있습니다.

Unity user interface menu

이전에는 Rigidbody와 ArticulationBody 컴포넌트의 인스펙터 창에 축소 가능한 'Info' 섹션이 있어 현재 선 속도(linear velocity)와 같은 추가 정보를 확인할 수 있었습니다. 그러나 이 섹션을 펼치면 에디터의 전체적인 성능이 크게 저하되는 문제가 발생했습니다. 또한 이전에는 서로 다른 바디의 파라미터를 비교하기 위해 두 개의 인스펙터 패널을 열어야 해서 다소 복잡했습니다. 이 문제를 해결하기 위해 모든 프로퍼티를 Physics Debugger 창의 'Info' 탭으로 옮겼으며, 선택한 각 오브젝트의 프로퍼티가 여기에 표시되므로 나란히 보면서 간편하게 비교할 수 있습니다. 

Unity user interface menu options

이제 컨택트 노멀, 이격 거리와 함께 컨택트 포인트를 시각화할 수 있습니다. 

Unity user interface with a red box and manipulation arrows pointing down

Physics.Raycast 또는 Physics.CastSphere 같은 물리 쿼리는 보통 커스텀 캐릭터 컨트롤러 또는 차량 컨트롤러와 같은 일부 커스텀 물리 동작에 포함됩니다. 그런데 이러한 쿼리는 시각화되지 않아 디버그하기 까다롭습니다. 이 문제를 해결하기 위해 이번 릴리스에서는 물리 쿼리의 시각화 옵션을 제공합니다.

Unity user interface with shapes being moved around

역동역학

지금까지 Unity에는 일련의 오브젝트와 오브젝트에 가해지는 힘이 주어지면 그 궤적을 계산하는 정동역학을 지원하는 툴만 있었습니다. 이는 정말 유용하지만 유니티는 로보틱스 툴박스를 한층 확장하고자 했습니다. 따라서 Unity 2022.1에 역동역학에 대한 지원을 추가했습니다. 오브젝트와 예상 궤적이 주어지면 시뮬레이션 시 해당 궤적이 도출되는 힘을 계산하는 것입니다. 

역동역학 지원은 반복적으로 개선하여 여러 릴리스에 반영될 예정입니다. Unity 2022.1에서는 ArticulationBody에 현재 가해지고 있는 총 힘의 컴포넌트를 계산하는 여러 함수를 공개하여 원하는 궤적을 그리기 위한 외부의 힘을 적용하기 전에 이를 상쇄할 수 있도록 했습니다. 솔버에 의해 적용된 충격을 상쇄하는 데 필요한 조인트 힘과 같이 더욱 흥미로운 기능이 향후 릴리스를 통해 공개될 예정입니다. 새로운 기능을 사용해 보고 포럼에서 의견을 공유해주세요. 

이 기능으로는 다음과 같은 작업을 할 수 있습니다.

  • 현재 바디에 가해지는 구동력에 의한 힘을 구합니다. 이를 통해 원하는 타겟에 얼마나 강하게 도달하려 하는지를 알 수 있습니다. 이 힘은 구동력의 강성과 제동뿐만 아니라 현재 델타 타겟 위치와 델타 타겟 속도에 따라 달라집니다.
  • 바디에 작용하는 중력, 코리올리 힘, 원심력을 상쇄하는 데 필요한 조인트 힘을 구합니다.
  • 원하는 가속에 도달하는 데 필요한 조인트 힘을 구합니다. 
Unity user interface manipulating two characters

보간과 외삽

리지드바디는 부드럽게 움직이는 느낌을 내기 위해 비교적 낮은 빈도로 시뮬레이션하면서 보간과 외삽을 모두 사용합니다. 내부적으로는 업데이트마다 트랜스폼 포즈를 계산하여 이를 구현합니다. 보간의 경우 마지막 시뮬레이션 포즈 두 가지가 이 프레임의 새로운 트랜스폼 포즈를 계산하는 데 사용됩니다. 외삽의 경우에는 마지막 시뮬레이션 포즈와 속도가 사용됩니다. 하지만 경량으로 제작됐기 때문에 이 포즈를 다시 물리 엔진으로 전송하지는 않습니다. 포즈는 그래픽스나 애니메이션처럼 물리 외부의 시스템에만 표시됩니다. 이로 인해 보간된 포즈에서는 레이캐스트가 바디를 감지하지 않는 등의 현상이 일어납니다. 

따라서 물리에서 트랜스폼 변경이 감지되지 않게 하기 위해 포즈를 작성하기 직전에 업데이트마다 Physics.SyncTransforms()를 호출하도록 되어 있으며, 내부 메서드 호출이 이어져 물리에 대한 모든 트랜스폼 업데이트를 삭제합니다. 하지만 그러면 다음 두 가지 문제가 발생합니다.

  1. 씬에 최소 하나의 보간된 바디가 있는 경우 업데이트될 때마다 모든 물리 컴포넌트의 트랜스폼 변경사항이 물리 엔진과 동기화됩니다. 대개의 경우 이는 FixedUpdate당 한 번만 필요합니다.
  2. Rigidbody 컴포넌트에 보간이 적용된 트랜스폼이 변경될 경우 사용자가 적용한 트랜스폼 변경이 물리 엔진으로 전달되어 마지막에 시뮬레이션된 포즈가 변경되므로 오브젝트의 보간이 깨지게 됩니다. 시뮬레이션된 포즈는 물리 엔진에서 현재 사용 중인 포즈일 뿐, 별도로 저장되지 않습니다.

위 문제를 해결하기 위해 매 프레임에서 모든 트랜스폼을 동기화하지 않도록 보간 코드를 업데이트했습니다. 씬 복잡도에 따라 상이하지만 이 변경으로 성능이 대체적으로 향상되어 새로운 보간 코드가 이전보다 빠르게 실행됩니다.

포럼 내 피드백 수용

포럼의 한 섹션에서는 물리의 다양한 실험적 기능에 관한 논의가 이루어졌으며, 이를 반영하여 이번 릴리스에서 몇 가지 변경사항을 적용했습니다. 

  • 대규모 프로젝트를 비롯한 많은 프로젝트에서 게임 오브젝트 레이어를 많이 사용합니다. 이에 따라 레이어 조합을 설명하고 물리의 컨택트 페어를 만들어 내는 매트릭스 또한 크기가 상당히 커집니다. 이번 릴리스에서는 선택된 행과 열을 하이라이트하여 더 간편하게 사용할 수 있습니다.
image of grid being selected
  • 조인트는 두 Rigidbody를 연결하는 데 사용되며 상대적인 움직임의 제약을 정의합니다. Unity 2020.2부터 Rigidbody를 ArticulationBody에 연결하는 데도 조인트를 사용할 수 있습니다. 이를 위해 각 조인트 클래스는 인스펙터에 추가 프로퍼티가 표시됩니다. Rigidbody와 ArticulationBody를 모두 동시에 연결하는 것은 불가능하므로 하나가 이미 설정되어 있는데 두 옵션을 모두 표시하면 공연히 수직 공간을 차지하게 됩니다. 하지만 이제는 설정된 프로퍼티만 표시됩니다.
Items in menu bar being selected
  • 키네마틱 리지드바디는 다른 요인의 영향 없이 다른 바디에 영향을 미칠 수 있는 특수한 유형의 바디입니다. 이러한 면에서는 정적 콜라이더와 비슷하지만 자주 이동하도록 만들어졌다는 점이 다릅니다. 일반적인 사용 사례로는 캐릭터 컨트롤러, 애니메이션 기반 물리, 가상 현실(VR) 손목 시뮬레이션 등이 있습니다. 이는 단 하나의 시뮬레이션 프레임 내에 바디가 도달할 키네마틱 타겟을 설정하여 제어합니다. 여기에서 정적 콜라이더와의 주된 차이점은 포즈 변경과 같은 즉각적인 텔레포트가 아니라 한 프레임 안에 목표에 도달하는 데 필요한 선과 각의 속도를 계산하고 이를 솔버로 전달해 키네마틱 타겟에 도달한다는 점입니다. 이렇게 하면 움직임이 제약 야코비 행렬과 맞아 연결된 조인트 체인이 결함 없이 제대로 반응하게 됩니다. 이번 Unity 릴리스에서는 한 클래스 안에 키네마틱 타겟의 위치와 회전을 모두 설정하는 새로운 방식을 공개합니다.
  • Unity 2021.2에 도입된 컨택트 수정을 이용하면 지역 탐지(narrow phase)에서 생성된 컨택트 포인트 세부사항이 솔버에 컨택트 제약을 만드는 데 사용되기 직전에 변경할 수 있습니다. 이번 릴리스에서는 커스텀 이방성 마찰의 예와 같은 고급 사용 사례에 맞춰 컨택트 페어의 바디 속도에 새로운 게터를 추가할 예정입니다. 
  • PhysX 버전은 4.1.2로 업데이트되었으며 이는 현재 4.x 라인의 최신 버전입니다. 소규모 릴리스이므로 심각한 버그와 크래시만 수정하였습니다. 릴리스 노트는 여기에서 확인할 수 있습니다.
  • 동적 바디가 콜라이더와 겹칠 경우 솔버는 모든 제약 사항을 충족하면서 둘을 분리할 수 있는 적절한 임펄스를 찾는 것을 목표로 합니다. 내부적으로 이 임펄스는 페어에서 컨택트 포인트마다 연산되지만, 모든 포인트의 총 합인 집계 값만이 반환됩니다. 이 릴리스에서는 각 컨택트 포인트의 임펄스를 찾아 가져올 수 있도록 ContactPoint 구조에 새로운 프로퍼티를 공개할 예정입니다. 
  • 유니티는 ArticulationBody 컴포넌트에 대한 로보틱스 커뮤니티의 피드백에 항상 큰 관심을 두고 있습니다. 더 작은 로봇 부품의 동작을 더 쉽게 만들고 수정할 수 있도록 스크린 공간에 조인트 한계 핸들을 고정해 두어 더 이상 씬에서 콜라이더가 가려지지 않습니다.
zooming in on Unity object
  • 물리 배치 쿼리는 유니티 핵 위크의 결과물로, 특정 사용 사례를 지원하도록 바로 제공되었지만 최소한의 기능만 갖추고 있었습니다. 발전을 거듭하며 더 정교한 스레딩 패턴과 같이 더 많은 사용 사례를 지원하는 새로운 기능이 추가되었으며, 쿼리 유형도 더욱 다양해졌습니다. 이번 릴리스에서는 어떤 물리 씬에서도 배치 쿼리를 실행할 수 있도록 지원할 예정이며 새로운 배치 쿼리 유형(Physics.ClosestPointCommand)도 하나 추가됩니다. 
  • MeshCollider와 사용하려는 메시는 먼저 베이크를 해야 합니다. 베이크는 충돌 검사에 필요한 공간 검색 구조를 만드는 과정으로, 여기에는 많은 비용이 소요됩니다. 보통 MeshCollider의 메시 프로퍼티가 변경될 때마다 암묵적으로 발생하며, 메인 스레드에서 실행되어 완료될 때까지 추가 작업을 모두 차단합니다. Unity 2019.3에서는 메인 스레드 밖에서 온디맨드로 베이크하는 스레드 세이프(thread-safe) 방식을 공개했습니다. 이제 잡 시스템을 활용하여 콘텐츠를 생성하고 메시를 베이크하는 등 스레드 활용도를 크게 높일 수 있으므로 절차적으로 생성된 정교한 메시를 만들 수 있게 됩니다. 그러나 이 기능은 기본 쿠킹 옵션으로만 베이크를 지원한다는 단점이 있었습니다. 이번 릴리스에서는 모든 쿠킹 옵션에 베이크를 지원하는 Physics.BakeMesh의 새로운 배리언트를 공개하여 이 부분을 보완했습니다.

새로운 Inverse Dynamics API와 업데이트된 Physics Debugger로 어떤 작품이 탄생할지 벌써 기대됩니다! 지금 바로 최신 Unity 2022.1을 다운로드하고 로보틱스 포럼물리 프리뷰 포럼에서 대화에 참여해 보세요. 

2022년 5월 12일 엔진 & 플랫폼 | 6 분 소요

Is this article helpful for you?

Thank you for your feedback!