UDN
Search public documentation:

PhysXReferenceKR
English Translation
日本語訳
中国翻译

Interested in the Unreal Engine?
Visit the Unreal Technology site.

Looking for jobs and company info?
Check out the Epic games site.

Questions about support via UDN?
Contact the UDN Staff

UE3 홈 > 피직스 > PhysX 참고서

PhysX 참고서


문서 변경내역: Bryan Galdrikian 작성. 홍성진 번역.

포스 필드


모든 포스 필드에 공통인 파라미터

  • bForceActive - 이 포스가 지금 활성화되어 있는지 아닌지를 가리킵니다.
  • ForceFieldChannel - 이 포스 필드에 어떤 포스 필드 제외 볼륨 (RB_ForceFieldExcludeVolumes) 을 적용할 것인지 나타냅니다.
  • bForceApplyToCloth - 클로쓰에 대한 영향력을 켜고/끕니다.
  • bForceApplyToFluid - 플루이드 파티클에 대한 영향력을 켜고/끕니다.
  • bForceApplyToRigidBodies - 리짓 바디에 대한 영향력을 켜고/끕니다.
  • bForceApplyToProjectiles - 로켓 같은 프로젝타일에 대한 영향력을 켜고/끕니다.
  • CollideWithChannels - 이 포스 필드가 어느 타입의 오브젝트에 영향력을 주는지 입니다.

RB_RadialForceActor

이 포스 필드 는 구체로 표시됩니다. 구체의 내부에 있는 오브젝트들에는 방사상의 포스가 적용됩니다.

  • ForceStrength - 이 액터가 가하는 포스의 세기. 양성인 포스는 바깥쪽을 향하여 가해집니다.
  • ForceRadius - 포스의 영향 반경.
  • SwirlStrength - 이 필드는 사용되지 않습니다. (오브젝트가 액터의 Z 축 중심으로 선회하는 세기를 말합니다.)
  • SpinTorque - 이 필드는 사용되지 않습니다. (오브젝트를 로컬 Z 축 중심으로 선회하는 세기를 말합니다.)
  • ForceFalloff - 오브젝트가 그 위치에서 점점 멀어짐에 따라 어떻게 포스가 줄어드는지 나타냅니다. 적용된 포스는 위치와 상관없이 지속되거나, 아니면 포스는 중심에서 ForceStrength 였다가 ForceRadius 반경에서 0 이 되도록 선형 보간됩니다.
  • RadialForceMode - 사용된 포스 모드의 타입을 나타냅니다.

RB_CylindricalForceActor

이 포스 필드는 원통형으로 표시됩니다. 정의된 파라미터에 따라 레디얼(방사형) / 리프트(들어올리기) / 로테이션(회전) 포스가 원통 내부의 오브젝트에 가해집니다. 레디얼 포스는 오브젝트의 속도가 탈출 속도보다 작고 오브젝트가 중심으로부터 멀리 이동하는 경우에만 적용됩니다. 이는 오브젝트가 포스 필드로부터 너무 빠르게 이탈되지 않게 하기 위함입니다.

  • RadialStrength - 원통 축에서 바깥쪽으로 가해지는 포스의 세기.
  • RotationalStrength - 원통 축 중심으로 가해지는 회전력의 세기.
  • LiftStrength - 원통 축을 따라 가해지는 포스의 세기.
  • LiftFalloffHeight - 리프트 감쇠 고도, 0-1, 이 높이 이상에서는 리프트 포스가 선형 감쇠 시작됩니다.
  • EscapeVelocity - 이 이상의 속도에서는 레디얼 포스가 무시됩니다.
  • ForceRadius - 원통 맨밑서부터 포스의 영향 반경.
  • ForceTopRadius - 맨위서부터 포스 필드 반경.
  • ForceHeight - 포스 원통 높이.
  • HeightOffset - 액터 베이스에서 포스 필드 중심까지의 오프셋.

자세한 내용은 다음 문서를 참고하십시오:

씬 컴파트먼트


오브젝트를 여러 개의 컴파트먼트(compartment, 구획)로 나눌 수 있습니다. 각 씬은 상호작용할 수도, 않을 수도 있습니다. 컴파트먼트를 통해 게임 엔진이 다른 일을 수행하고 있는 동안에도 시뮬레이트할 수 있도록 씬의 병렬 처리가 가능해 집니다. 그밖에도 컴파트먼트를 여러가지 서브스텝으로 실행 가능하도록 개별 환경설정해 주거나 인터리브 시뮬레이션으로 돌려 이펙트 기반 씬의 퍼포먼스를 향상시킬 수도 있습니다.

컴파트먼트는 하드웨어 플루이드, 하드웨어 리짓 바디, 소프트웨어 리짓 바디 등 한 물리 시뮬레이션의 하위 인스턴스를 나타냅니다. 한 씬에 (같은 종류의 컴파트먼트를 여럿 포함해서) 여러 개의 컴파트먼트가 있을 수 있으며, 그와 적절한 씬의 상호작용은 자동으로 처리됩니다. 로우-레벨의 기초적인 작업을 신경쓰지 않고도 조작, 시뮬레이션, 상호작용의 투명성이 확보되는 것입니다.

컴파트먼트 사이의 링크는 SDK 가 모두 처리합니다. 예를 들어, 한 머티리얼이 생성되면, 이는 모든 리짓 바디 컴파트먼트에 대해 생성됩니다. 또 레이 캐스트 실행시, 퀴리는 모든 컴파트먼트 안에서 만나는 하드웨어와 소프트웨어 오브젝트 전부를 반환합니다.

하드웨어든 소프트웨어든, 새로 만들어진 씬에는 컴파트먼트가 포함되어 있지 않습니다. 컴파트먼트가 디스크립터에 지정되어 있거나, 그 오브젝트 유형이 씬에 바로 존재할 수 없거나 하는 경우만 아니라면, 씬에 추가된 오브젝트는 적절한 씬에 삽입됩니다.

후자는 소프트웨어 씬의 예제 플루이드에 적용됩니다. 그러한 경우, 컴파트먼트가 존재하지 않는다면 새 오브젝트에 대해 적합한 디폴트 컴파트먼트가 생성됩니다.

여기에는 컴파트먼트 포함 오브젝트를 생성하는 여러가지 가능성과, 그것이 지원하는 상호작용에 대한 포괄적인 목록이 따릅니다. 상호작용에는 물리적 개체 사이의 콜리전과 트리거 테스팅 둘 다 포함됩니다.

PhysX 하드웨어가 없을 때

컴파트먼트가 지정되지 않은 경우:

아이템 상주하는 곳 영향을 주는 대상 *영향을 받는 대상:
리짓 바디 고유 씬 모두 서로. 양방향 상호작용이 설정된 클로쓰 (컴파트먼트 내에 있는 것 포함), 양방향 상호작용이 설정된 플루이드 (컴파트먼트 내에 있는 것만)
플루이드 소프트웨어에서는 사용할 수 없음    
클로쓰 마스터 씬 양방향 상호작용이 설정된 경우, 마스터 씬의 리짓 바디에만 마스터 씬의 리짓 바디에만.

-- 컴파트먼트 지정된 경우:

아이템 상주하는 곳 영향을 주는 대상 *영향을 받는 대상:
리짓 바디 지정된 컴파트먼트 서로에게만 서로, 마스터 씬의 리짓 바디
플루이드 소프트웨어에서는 사용할 수 없음    
클로쓰 지정된 컴파트먼트 양방향 상호작용이 설정된 경우, 마스터 씬의 리짓 바디에만 마스터 씬의 리짓 바디에만.

PhysX 하드웨어가 있을 때

컴파트먼트가 지정되지 않은 경우:

아이템 상주하는 곳 영향을 주는 대상 *영향을 받는 대상:
리짓 바디 고유 씬 씬의 타입에 의거함 모두 서로, 양방향 상호작용이 설정된 클로쓰 (컴파트먼트 내에 있는 것 포함), 양방향 상호작용이 설정된 플루이드 (컴파트먼트 내에 있는 것만)
플루이드 기본 플루이드 컴파트먼트 (존재하지 않는 경우 새로 만듦) 하드웨어 양방향 상호작용이 설정된 경우, 마스터 씬의 리짓 바디에만 마스터 씬의 리짓 바디에만.
HW 클로쓰1 기본 플루이드 컴파트먼트 (존재하지 않는 경우 새로 만듦) 하드웨어 양방향 상호작용이 설정된 경우, 마스터 씬의 리짓 바디에만 마스터 씬의 리짓 바디에만.
SW 클로쓰1 고유 씬 소프트웨어 양방향 상호작용이 설정된 경우, 마스터 씬의 리짓 바디에만 마스터 씬의 리짓 바디에만.

컴파트먼트가 지정된 경우:

아이템 상주하는 곳 영향을 주는 대상 *영향을 받는 대상:
리짓 바디 지정된 컴파트먼트 컴파트먼트로서 서로에게만 서로, 마스터 씬에서의 리짓 바디2
플루이드 지정된 컴파트먼트 하드웨어 양방향 상호작용이 설정된 경우, 마스터 씬의 리짓 바디에만 마스터 씬의 리짓 바디에만.
클로쓰 지정된 컴파트먼트 컴파트먼트로서 양방향 상호작용이 설정된 경우, 마스터 씬의 리짓 바디에만 마스터 씬의 리짓 바디에만.
2 컴파트먼트의 트리거는 마스터 씬의 바디에 반응하지 않음

기본 구현

현재 UE3는 NxScene 에 4개의 컴파트먼트를 만듭니다. 이들 컴파트먼트를 가리키는 포인터는 NxScene 과 함께 레벨의 FRBPhysScene 에 보존됩니다. 컴파트먼트의 타입은:
  • 리짓 바디
  • 플루이드
  • 클로쓰
  • 소프트 바디
    ALERT! : 이건 지금 사용되진 않지만, 장래의 함수성을 위해 마련해 두었습니다.

컴파트먼트 내에서 PhysX 오브젝트를 만들려면, 오브젝트의 디스크립터 내에 있는 적절한 컴파트먼트에 포인터를 전달하면 됩니다. 예를 들면, NxActorDesc 에는 'compartment' 필드가 있습니다. 만일 이 필드가 NULL 이라면, 그 오브젝트는 초기의 (노멀) PhysX 씬에 놓입니다.

그러면 UE3 클래스인 UPrimitiveComponent 는 boolean 변수인 bUseCompartment 를 가지게 됩니다. 그리고 이 클래스에서 파생된 여러 종류의 오브젝트들에 알맞게 해석됩니다. UPrimitiveComponent 가 BodyInstance 를 가지고 있을 경우, 그 BodyInstance 용으로 만들어진 NxActors는, bUseCompartment 가 설정되어 있다면, 리짓 바디 컴파트먼트 안에 들어갑니다.

USkeletalMeshComponents 에 대해서는, 클로쓰 시뮬레이션이 지정되어 있는 경우, bUseCompartment 플랙이 그 클로쓰를 클로쓰 컴파트먼트안에 넣을지 여부를 결정 짓습니다.

플루이드는 다르게 취급됩니다; UE3 에서는 항상 NxFluid 를 플루이드 컴파트먼트에 넣습니다.

일방적 상호작용 ("Dominance Groups")


도미넌스(우세) 그룹을 사용하면, 액터들 사이에 있는 컨스트레인트(컨택트와 조인트)는 한 방향으로만 작용합니다. 이것은 차량에 타고 있는 사람 또는 캐릭터의 뒤로 묶은 머리가 움직일 때, 붙어있는 오브젝트에 영향을 주지 않으면서도 자연스러워 보이게 하고자 할 때 좋습니다.

도미넌스 그룹은 NxActor 의 한 프로퍼티입니다. 이것은 단순히 5-비트 (0-31 범위) 식별자입니다. 두 액터들간에 컨스트레인트(조인트든 컨택트든)가 작용할 때는, 어떤 것이 영향을 받는지 그 도미넌스 그룹이 결정합니다. 그 영향은 사용자가 정의한, 한 쌍의 실수로 이루어진 행렬로 정해집니다. 두 개의 NxActors 가 상호 작용할 때는, 그들의 도미넌스 그룹 수가 매트릭스 내에서 정확한 실수의 쌍을 찾아내는 데 사용됩니다. 각각의 실수는 [0.0,1.0] 의 범위 안에 있으며, 그 값이 각각의 NxActor 가 상호 작용으로부터 얼마나 많은 영향을 받는지를 결정합니다. 현재는 0.0 와 1.0 만 지원됩니다. 나머지 중간값은 향후 "부분적" 상호 작용에 사용될 것입니다.

디폴트로 상호 작용 행렬은 액터의 도미넌스 그룹이 똑같을 경우 (1.0,1.0) 을 돌려주도록 설정되어 있습니다. 이것은 "정상적인" 상호 작용의 행태로서, 두 액터가 모두 컨스트레인트에 의해 영향을 받습니다. 액터들의 도미넌스 그룹이 똑같지 않은 경우에는, 디폴트 행렬은 어느 그룹의 ID 가 더 큰가에 따라 (0.0,1.0) 또는 (1.0,0.0) 을 돌려줍니다. 도미넌스 그룹 ID 가 낮은 것이 1.0 의 웨이트를, 더 높은 그룹 ID 를 가진 것이 0.0 의 웨이트(가중치)를 받도록 설정되어 있습니다. 이는 그룹 ID 가 더 낮은 것이 우세하다는 것을 의미합니다. PhysX 는 디폴트 도미넌스 그룹 ID 를 0으로 설정하여, 디폴트 상호 작용 행렬에 대해 항상 우세 (또는 동등)하도록 하고 있습니다.

UE3 는 NxActors 의 도미넌스 그룹을 (디폴트) 15 로 리셋하지만, 상호 작용 행렬은 변경하지 않습니다. 이렇게 하여 더 우세하고 덜 우세한 ID 를 지정하는 것이 더 쉬워집니다. UE3 에서 도미넌스 그룹은 UPrimitiveComponent 의 RBDominanceGroup 필드에 의해 정해집니다.

PhysX 의 시각화 플랙


명령줄 NXVIS 에 이어붙일 수 있는 PhysX 시각화 플랙(옵션)이 많으며, 다음과 같습니다:

  • Axes
    • WORLDAXES - 월드 축을 시각화 합니다.
    • BODYAXES - 바디 축을 시각화 합니다.
    • MASSAXES - 바디 질량 축을 시각화 합니다.
  • Contacts
    • CONTACTPOINT - 컨택트 지점을 시각화 합니다.
    • CONTACTS - 컨택트 노멀을 시각화 합니다.
    • CONTACTERROR - 컨택트 오차를 시각화 합니다.
    • CONTACTFORCE - 컨택트 포스를 시각화 합니다.
  • Joints
    • JOINTLIMITS - 조인트의 한계를 시각화 합니다.
    • JOINTLOCALAXES - 로컬 조인트 축을 시각화 합니다.
    • JOINTWORLDAXES - 월드 조인트 축을 시각화 합니다.
  • Collision
    • CCD - CCD 스켈레톤을 시각화 합니다.
    • CCDTESTS - CCD 테스트를 시각화 합니다.
    • COLLISIONAABBS - 바운드(월드 스페이스의 AABB)를 시각화 합니다.
    • COLLISION - 셰이프를 시각화 합니다.
      • 빨강 - BSP/트라이메시/하이트필드
      • 주황 - 컨벡스(볼록)
      • 하양 - 구체/박스 프리미티브
    • COLLISIONAXES - 셰이프 축을 시각화 합니다.
  • Cloth
    • CLOTH_MESH - 클로쓰 메시를 시각화 합니다.
    • CLOTH_COLLISIONS - 클로쓰 리짓 바디의 콜리전을 시각화 합니다.
    • CLOTH_ATTACHMENT - 클로쓰 어태치먼트를 시각화 합니다.
    • CLOTH_SLEEP_VERTEX - 전체 버텍스별 정보를 가지고 잠들어 있는 클로쓰를 시각화 합니다.
    • CLOTH_SLEEP - 클로쓰 수면 상태를 시각화 합니다.
      • 빨강 - Sleeping
      • 흰색 - Awake
      • 파랑 - Static
    • CLOTH_VALIDBOUNDS - 클로쓰의 적합 바운드를 시각화 합니다.
    • CLOTH_TEARABLE_VERTICES - 찢어지는 클로쓰 버텍스를 시각화 합니다.
  • Fluid
    • FLUID_PACKETS - 플루이드 패킷을 시각화 합니다.
    • FLUID_POSITION - 파티클의 위치를 시각화 합니다.
    • FLUID_MESH_PACKETS - 사용가능한 플루이드 메시 패킷을 시각화 합니다.
    • FLUID_PACKET_DATA - 플루이드 데이터 패킷을 시각화 합니다.
    • FLUID_BOUNDS - 플루이드 AABB 를 시각화 합니다.
    • FLUID_VELOCITY - 파티클의 속도를 시각화 합니다.
    • FLUID_KERNEL_RADIUS - 파티클 커널의 반경을 시각화 합니다.
    • FLUID_DRAINS - 플루이드 드레인 형태를 시각화 합니다.
    • FLUID_EMITTERS - 이미터를 시각화 합니다.
  • Force Fields
    • FORCEFIELDS - 포스 필드 형태를 시각화 합니다.
  • Softbody
    • SOFTBODY_MESH - 소프트 바디 메시를 시각화 합니다.
    • SOFTBODY_ATTACHMENT - 소프트 바디 어태치먼트를 시각화 합니다.
    • SOFTBODY_COLLISIONS - 리짓 바디와의 소프트 바디 콜리전을 시각화 합니다.
    • SOFTBODY_SLEEP_VERTEX - 전체 버텍스별 정보를 가지고 잠들어 있는 소프트 바디를 시각화 합니다.
    • SOFTBODY_SLEEP - 소프트 바디의 휴면을 시각화 합니다.
    • SOFTBODY_VALIDBOUNDS - 소프트 바디의 적합 바운드를 시각화 합니다.

리짓 바디에 대한 피직스 콜리전


PhysX 리짓-바디 피직스 엔진은, 사물이 접하는 곳에 대해 매 프레임마다 컨택트 포인트 (접점)을 만드는 식으로 작동합니다. 선 검사보다 더욱 복잡한 과정이기에, (래그돌같은) 실제 피직스 오브젝트가 충돌하는 지오메트리를 가급적 단순하게 유지하는 것이, 속도와 작동방식 둘 다를 위해 중요합니다. 예를 들어 작은 트라이앵글이 많으면 피직스 오브젝트가 걸리적거리게 되어, 처리에 오랜 시간이 걸립니다.

먼저 피직스 액터를 막는 액터의 경우, bBlockRigidBody (리짓 바디 블록) 옵션을 참으로 설정해야 합니다. 스태틱 메시와 블로킹 볼륨에 대해서는 디폴트로 설정되어 있습니다.

UseSimpleRigidBodyCollision (심플 리짓 바디 콜리전)이 이면 (자세한 것은 위의 콜리전 모델 부분 참고), 엔진은 콜리전 모델을 잡아다가 접점 생성용 컨벡스 헐 프리미티브 세트로 변환합니다. 스태틱 메시 에디터보기 메뉴에서 콜리전 을 선택하면, 프리미티브 총 갯수가 나옵니다. 10 미만이 이상적이며, 아무리 많아도 100 을 넘는 것은 좋지 않습니다.

리짓 바디 액터는 BSP 와 터레인에 대해서는 트라이앵글 별로 충돌합니다. 이때문에 BSP 와 터레인에는 아주 작은 트라이앵글이 없도록 해야 합니다. 자그마한 디테일에는 블로킹 볼륨/콜리전 모델을 사용하시기 바랍니다.

리짓 바디 콜리전 필터링

Component 안의 RBChannelRBCollidesWithChannel 옵션을 사용하여 충돌할 리짓 바디 오브젝트를 조정할 수 있습니다.

  • RBChannel - 콜리전 용으로 어떤 종류의 오브젝트로 간주시킬 것인지 나타냅니다.
  • RBCollidesWithChannel - 이것을 가지고 콜리전을 만들 오브젝트 종류를 나타냅니다.

BSP, 터레인, 스태틱 메시같은 것들은 기본적으로 Default 채널에 들어가 있습니다. 그래서 이런 것들과 충돌시키려는 피직스 오브젝트가 있다면, RBCollidesWithChannel 에서 Default 를 체크해 줘야 합니다. 레벨에 있는 스태틱 오브젝트에는 보통, RBCollidesWithChannel 에 아무 플랙도 설정되어 있지 않은데, 다이내믹 오브젝트가 충돌 대상을 '선택'할 수 있도록 하기 위해서입니다.

RBCC_Nothing 이라는 특수 채널도 있는데, 이 오브젝트와는 디폴트로 아무것도 충돌하지 않음을 나타냅니다. 그러나 여전히 RBCollidesWithChannel 에 항목을 설정할 수는 있습니다. 예를 들어 레벨에 있는 오브젝트가 비히클하고만 충돌하게 만들려면, RBCC_Nothing 채널에 속하도록 설정한 다음, RBCollidesWithChannelVehicles 플랙을 켜 주면 됩니다.