Physics Scene 설정
FPhysScene_Chaos의 전역 물리 파라미터와 프로젝트 설정
프로젝트 물리 설정
Project Settings > Engine > Physics
Project Settings > Engine > Physics에서 프로젝트 전체에 영향을 미치는 물리 파라미터를 설정합니다.
| 설정 | 위치 | 기본값 | 설명 |
|---|---|---|---|
Default Gravity Z | General | -980 | 전역 중력 (cm/s^2) |
Default Terminal Velocity | General | 4000 | 최대 낙하 속도 |
Max Physics Delta Time | Framerate | 1/30 | 물리 최대 DeltaTime |
Max Substep DeltaTime | Framerate | 1/60 | 서브스텝 최대 DeltaTime |
Max Substeps | Framerate | 6 | 최대 서브스텝 횟수 |
Solver Iteration Count | Chaos | 8 | PBD 솔버 반복 횟수 |
Push Out Iteration Count | Chaos | 3 | 관통 해소 반복 횟수 |
솔버 반복 횟수가 높을수록 시뮬레이션 정확도가 향상되지만 CPU 비용도 증가합니다. 8~12회가 대부분의 게임에 적합합니다. 복잡한 Constraint 체인이나 스태킹이 필요하면 16~20회로 늘릴 수 있습니다.
중력과 물리 환경
중력 커스터마이징과 물리 볼륨
// 전역 중력 변경
void AMyGameMode::SetLowGravity()
{
// 월드 설정에서 중력 변경
AWorldSettings* WorldSettings = GetWorld()->GetWorldSettings();
WorldSettings->bGlobalGravitySet = true;
WorldSettings->GlobalGravityZ = -196.0f; // 달 중력 (1/5)
}
// 개별 컴포넌트 중력 스케일
void AFloatingObject::SetupZeroGravity()
{
MeshComp->SetEnableGravity(false);
// 또는 중력 스케일 조정
MeshComp->GetBodyInstance()->bEnableGravity = true;
MeshComp->SetGravityScale(0.1f); // 10% 중력
}
// Physics Volume으로 영역별 중력 설정
// 에디터에서 APhysicsVolume을 배치하고
// CharacterGravityScale 또는 bPhysicsOnContact 설정
APhysicsVolume을 레벨에 배치하면 영역 내 오브젝트에 다른 중력, 마찰, 터미널 벨로시티를 적용할 수 있습니다. 수중 영역, 우주 공간, 저중력 방 등에 유용합니다.
콜리전 필터링 최적화
불필요한 충돌 검사 제거
- Collision Channel 분리 — 서로 상호작용하지 않는 오브젝트는 별도 채널을 사용하고 Ignore로 설정합니다.
- Simple vs Complex Collision — 물리 시뮬레이션에는 Simple Collision만 사용. Complex(Per-Poly)는 Trace에만 사용합니다.
- Collision Enabled 최소화 — QueryOnly로 충분한 오브젝트에 QueryAndPhysics를 사용하지 않습니다.
- Generate Overlap Events 비활성화 — Overlap이 불필요한 오브젝트는 명시적으로 비활성화합니다.
| 최적화 항목 | 설정 | 절감 효과 |
|---|---|---|
| 불필요한 Overlap 비활성화 | GenerateOverlapEvents = false | Broadphase 비용 감소 |
| 채널 Ignore | 불필요한 채널 간 Ignore | Narrowphase 비용 감소 |
| Simple Collision 사용 | bTraceComplex = false | Trace 비용 대폭 감소 |
| CCD 선택적 활성화 | 필요한 오브젝트만 CCD | CCD 오버헤드 감소 |
Continuous Collision Detection (CCD)
고속 물체의 터널링 방지
빠르게 움직이는 물체(총알, 화살 등)는 한 프레임에 다른 물체를 완전히 통과할 수 있습니다(터널링). CCD를 활성화하면 프레임 간 스윕 테스트로 이를 방지합니다.
// CCD 활성화
FBodyInstance* Body = MeshComp->GetBodyInstance();
Body->bUseCCD = true;
// 블루프린트에서: Body Instance > Use CCD 체크
// CCD는 성능 비용이 있으므로
// 고속 물체(총알, 화살)에만 선택적으로 활성화
CCD는 성능 비용이 높으므로 모든 오브젝트에 활성화하지 마세요. 일반적인 물리 오브젝트는 CCD 없이도 충분합니다. 고속 이동 오브젝트(발사체 등)에만 선택적으로 적용하세요.
핵심 요약
- Project Settings > Physics에서 중력, 솔버 반복, 서브스텝 등 전역 물리 파라미터를 설정합니다.
- Solver Iteration Count 8~12회가 일반적이며, 복잡한 시뮬레이션에서 16~20회로 증가시킵니다.
- Physics Volume으로 영역별 중력/마찰을 다르게 설정할 수 있습니다.
- 콜리전 최적화: 채널 Ignore, Simple Collision 사용, Overlap 비활성화 등으로 성능을 확보합니다.
- CCD는 고속 물체의 터널링을 방지하지만, 성능 비용이 있으므로 선택적으로 사용합니다.
도전 과제
배운 내용을 직접 실습해보세요
Project Settings > Physics에서 Solver Iteration Count, Position/Velocity Iteration을 변경하며 시뮬레이션 정확도와 성능의 트레이드오프를 측정하세요. stat physics로 성능 영향을 기록하세요.
복잡한 메시에 대해 Use Simple Collision, Use Complex as Simple, Default 3가지 콜리전 설정의 성능 차이를 측정하세요. 100개의 물리 객체로 FPS 영향을 비교하세요.
대규모 오픈 월드에서 물리 오브젝트의 Sleep/Wake를 거리 기반으로 관리하는 시스템을 C++로 구현하세요. 플레이어 근접 시 Wake, 원거리 시 Force Sleep하는 전략을 적용하세요.