OpenSource-Hub

JoltPhysics

라이브러리

jrouwe/JoltPhysics

게임과 VR을 위한 멀티코어 친화적인 강체 물리 및 충돌 감지 라이브러리.

개요

Jolt Physics는 C++로 작성된 고성능 멀티코어 친화적 강체 물리 및 충돌 감지 라이브러리입니다. 게임 및 VR 애플리케이션에 적합하며, Horizon Forbidden West와 Death Stranding 2 등의 대작 게임에 채택되었습니다. 이 라이브러리는 컨스트레인트, 소프트 바디, 차량 및 광범위한 충돌 쿼리 등의 기능을 지원합니다.

README 미리보기

[](https://cla-assistant.io/jrouwe/JoltPhysics)\n[](https://github.com/jrouwe/JoltPhysics/actions/)\n[](https://sonarcloud.io/dashboard?id=jrouwe_JoltPhysics)\n[](https://sonarcloud.io/dashboard?id=jrouwe_JoltPhysics)\n[](https://sonarcloud.io/dashboard?id=jrouwe_JoltPhysics)\n[](https://sonarcloud.io/dashboard?id=jrouwe_JoltPhysics)\n\n# Jolt Physics\n\nA multi core friendly rigid body physics and collision detection library. Suitable for games and VR applications. Used by Horizon Forbidden West and Death Stranding 2: On the Beach.\n\n[](https://www.playstation.com/en-us/games/horizon-forbidden-west/)\n[](https://www.playstation.com/en-us/games/death-stranding-2-on-the-beach/)\n\n|[](https://www.youtube.com/watch?v=pwyCW0yNKMA)|\n|:-|\n|*A YouTube video showing a ragdoll pile simulated with Jolt Physics.*|\n\nFor more demos and [videos](https://www.youtube.com/watch?v=pwyCW0yNKMA&list=PLYXVwtOr1CBxbA50jVg2dKUQvHW_5OOom) go to the [Samples](Docs/Samples.md) section.\n\n## Design considerations\n\nWhy create yet another physics engine? Firstly, it has been a personal learning project. Secondly, I wanted to address some issues that I had with existing physics engines:\n\n* Games do more than simulating physics. These things happen across multiple threads. We emphasize on concurrently accessing physics data outside of the main simulation update:\n	* Sections of the simulation can be loaded / unloaded in the background. We prepare a batch of physics bodies on a background thread without locking or affecting the simulation. We insert the batch into the simulation with a minimal impact on performance.\n	* Collision queries can run parallel to adding / removing or updating a body. If a change to a body happened on the same thread, the change will be immediately visible. If the change happened on another thread, the query will see a consistent before or after state. An alternative would be to have a read and write version of the world. This prevents changes from being visib

FAQ (5)

문제 해결
ARM/AArch64에서 Jolt Physics CountLeadingZeros의 __builtin_clz(0) 미정의 동작 오류를 수정하는 방법

Jolt/Math/Math.h의 ARM 분기를 패치하여 __builtin_clz를 호출하기 전에 0을 처리하도록 하세요:

return inValue ? __builtin_clz(inValue) : 32;

v5.6.0 코드에서 다음을:

#else
return __builtin_clz(inValue);
#endif

다음과 같이 교체하세요:

#else
return inValue ? __builtin_clz(inValue) : 32;
#endif

이는 0에 대해 32를 반환하는 다른 아키텍처 분기 및 ARM clz 명령어의 동작과 일치합니다. Clang에서는 해당 연산이 0일 때의 결과가 정의된 형태로 변환되므로 UBSan 보고가 사실상 오탐(false positive)이지만, GCC는 0을 정의되지 않은 동작으로 취급하고 결과 범위가 0–31이라는 가정에 기반해 최적화할 수 있습니다. 유지 관리자는 0 검사가 단일 명령어로 컴파일되기 때문에 이를 수락했습니다. 패치를 적용한 후 -fsanitize=undefined를 사용한 빌드를 포함하여 Jolt와 프로젝트를 다시 빌드하세요.

원본 Issue #2149
문제 해결
JoltPhysics 정적 라이브러리로 XCFramework를 생성할 때 'Unknown header: 0xb17c0de' 오류를 어떻게 해결하나요?

이 오류는 Release/Distribution 빌드에서 CMake의 INTERPROCEDURAL_OPTIMIZATION이 활성화되어 -flto=thin을 전달하고 .a 파일에 LLVM bitcode를 포함시키기 때문에 발생합니다. xcodebuild -create-xcframework는 이러한 오브젝트를 패키징할 수 없습니다. XCFramework 빌드를 위해 IPO를 비활성화하고 Jolt를 다시 빌드하십시오:

cmake -S Build -B build-apple -DCMAKE_BUILD_TYPE=Release -DINTERPROCEDURAL_OPTIMIZATION=OFF
cmake --build build-apple --config Release

그런 다음 새로 빌드된 .a 파일로 XCFramework를 생성하십시오. CMake를 통해 통합하는 경우 Jolt를 추가하기 전에 CMAKE_INTERPROCEDURAL_OPTIMIZATION을 OFF로 설정하거나 set_target_properties(Jolt PROPERTIES INTERPROCEDURAL_OPTIMIZATION OFF)를 적용할 수도 있습니다. 일반적인 직접 정적 링크의 경우 LTO를 활성화된 상태로 유지할 수 있으며, XCFramework로 번들링할 때만 비활성화하십시오.

원본 Issue #1261
문제 해결
Godot에서 Jolt Physics를 사용할 때 구형 행성의 곡면 위에서 평평한 RigidBody가 떨리는(jitter) 현상을 어떻게 해결하나요?

행성의 SphereShape3D 콜리전을 구 메시에서 생성된 ConcavePolygonShape3D trimesh로 교체하세요. 더 단순한 지오메트리의 경우 ConvexPolygonShape3D도 사용할 수 있습니다. Jolt는 현재 큰 구에 대해 접촉점을 하나만 보고하는데, 이는 평평한 강체와 안정적으로 접촉하기에 충분하지 않습니다. trimesh는 여러 개의 접촉점을 제공합니다. RigidBody에서 Continuous Collision Detection을 활성화하면 초기 침투를 줄일 수 있지만, 근본적인 단일 접촉 불안정성 문제는 해결되지 않습니다.

원본 Issue #2111
문제 해결
Jolt Physics 5.6에서 쌓인 오브젝트가 슬립 상태로 전환될 때 강체가 사라지거나 트랜스폼이 NaN이 되는 문제를 어떻게 해결하나요?

이것은 AngularFrictionConstraintPart에서 발생하는 Jolt 5.6 회귀입니다. 슬립 상태 근처에서 inv_effective_mass가 1.40129846e-45와 같은 서브노멀 값이 될 수 있으며, 1.0f / inv_effective_mass를 계산하면 INF로 오버플로되어 각속도와 바디 트랜스폼을 오염시킵니다. 이 수정은 issue #2092를 해결하는 "Avoiding overflow to INF if inverse effective mass is denormal"이라는 제목의 업스트림 변경 사항에 포함되어 있습니다. JoltPhysics를 최신 master 또는 해당 수정이 포함된 5.6.0 이후 첫 릴리스로 업데이트한 다음, UPBGE를 클린 리빌드하십시오. 임시 해결 방법으로는, AngularFrictionConstraintPart가 존재하지 않는 5.5.0 커밋 23dadd0e603f1b321142d4c74df07fce85064989로 JoltPhysics를 다운그레이드할 수 있습니다. 평면 서브디비전이나 비활성화 설정을 변경하는 것은 솔버 순서에만 영향을 미치며 근본적인 오버플로를 수정하지 않습니다.

원본 Issue #2092
문제 해결
트라이앵글 메시에서 Jolt CharacterVirtual이 캡슐 측면 또는 가장자리 접촉을 지면으로 잘못 분류하는 문제를 해결하는 방법은?

CharacterVirtualSettings::mSupportingVolume를 올바르게 설정하십시오. 이 설정이 없으면 캡슐 하단 반구의 윗부분 근처에 있는 접촉이 지지 접촉으로 처리되어 캐릭터가 떨어지지 않고 가장자리에 달라붙을 수 있습니다.

지지 볼륨 평면은 캡슐 바닥에서 캡슐 반지름 하나만큼 위에 있는 캡슐 하단 구의 중심에 설정하십시오. 캡슐 반지름이 0.3 m라면 0.3 m를 사용하십시오. 0.1 m나 0.2 m는 사용하지 마십시오. 구 중심보다 낮은 값은 계단 오르기가 실패하게 할 수 있기 때문입니다.

up 축이 Z인 경우 법선 (0, 0, 1)을 사용하고 로컬 점 (0, 0, 0.3)을 지나는 평면으로 정의하십시오. 기본 Y-up 설정의 경우 법선 (0, 1, 0)을 사용하고 (0, 0.3, 0)을 지나는 평면을 사용하십시오. 개념적으로는 다음과 같습니다:

settings.mSupportingVolume = Plane::sFromPointNormal(
    Vec3(0, 0, 1),   // up 축
    Vec3(0, 0, settings.mShape->GetInnerRadius()) // 하단 구 중심
);

shape에서 반지름이 노출되지 않는 경우 캡슐 반지름을 직접 사용하십시오. 이렇게 하면 하단 구 중심 위쪽의 측면 접촉이 지면 접촉으로 선택되는 것을 방지할 수 있습니다.

원본 Issue #2122