UDN
Search public documentation:

PhysXDestructibleReferenceKR
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 Destructible 참고서

PhysX Destructible 참고서


문서 요약: PhysXDestructible 클래스 설명서입니다.

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

개요


PhysXDestructible 은 UE3의 FracturedStaticMesh (프랙처 스태틱 메시, FSM)에 더하여 구축된 기능입니다. 우선 이 문서는 FSM을 잘 알고 있다는 독자를 대상으로 합니다. FSM 에 대해서는 Fracture Tool KR 페이지를 참고하십시요.

FracturedStaticMesh 대신 PhysXDestructible을 사용하는 경우


FracturedStaticMeshActor는 UE3 레벨 내에서 작은 정도의 프랙처를 생성하는 능률적인 방법입니다. 그러나 파괴의 규모를 늘리고자 할 경우, FracturedStaticMeshActor 는 곧 몇 가지 한계에 부딪치게 됩니다. 그 한 예로, 쏟아져 나오는 모든 조각 (또는 덩어리)들은 AActor에 의해 표시됩니다. 만일 수백개의 조각들이 쏟아져 나온다면 AActor의 부담이 상당히 커집니다.

PhysXDestructibleActor는 수백개, 심지어는 수천개의 리짓 바디의 조각 체제 내에서 작용하도록 설계되어 있습니다. 이를 처리하는 방법에는 두 가지가 있습니다. 첫째, 이 액터는 그 조각들을 SkeletalMesh에 있는 본으로 표시합니다. 이 방법은 AActor의 부담을 크게 줄여줍니다. 두번째는 계층적으로 프랙처하는 것입니다. 따라서 프랙처되지 않은 큰 조각들은 계속 하나의 리짓 바디와 하나의 SkeletalMesh 본으로 표시됩니다.

그밖에도, PhysXDestructible에는 파괴의 효과를 높이는 몇 가지 기능이 더 있습니다. PhysXParticleSystem (PhysXParticleSystemReference 참고)이 되도록 하는 "crumble particle system (파티클 시스템 부스러뜨리기)"을 지정할 수 있습니다. 이는 가장 고운 정도의 프랙처를 나타냅니다. 이는 매우 작은 조각들이 파괴되면, 그 부피가 PhysX 유동체 파티클의 세트로 대치된다는 것을 뜻합니다. 메시 데이터 타입을 사용할 경우에는, 확실한 부서짐 효과를 얻을 수 있습니다. 또한 부서지는 음향을 비롯해서 많은 전통적 파티클 효과도 (예: 연기, 먼지) 지정할 수 있습니다.

PhysXDestructibleActor는 정적일수도 있고 동적일 수도 있습니다. 정적일 경우, Actor의 몇 부분이 "support(지지자)"가 되도록 배정하는 두 가지 방법이 있습니다. 덩어리와 지지 덩어리간의 인접 경로(덩어리 조각을 통한)를 잃어버리면, 그 덩어리가 떨어지게 됩니다. 이 기능은 FracturedStaticMeshActor를 통해서도 가능하지만, PhysXDestructibleActor에는 서로 닿는 액터들 사이에 지지 구조를 만들 수 있도록 하는 추가 기능이 있습니다. 이는 서로 닿는 PhysXDestructibleActor의 무리가 하나의 지지 구조를 형성한다는 뜻입니다. 예를 들어, 이 기능을 여러 개의 PhysXDestructibleActor로부터 큰 기둥을 만들어 내는데 사용할 수 있습니다. 기둥의 가운데를 사격하면, 위에 있는 액터들은 자동적으로 떨어져 나갑니다.

마지막으로, PhysXDestructibleActor는 Impact damage(충격 손상)을 지원합니다. 충격으로 손상 입히기 장치를 공급하면, PhysXDestructibleActor 가 세게 가격되는(또는 가격하는) 경우 프랙처가 일어납니다.

주: 현재 충격 손상에는 이 기능이 모든 경우에 작용하는 것을 방해하는 버그가 있습니다. 이는 될 수 있는 대로 빨리 처리될 것입니다.

PhysXDestructible은 FracturedStaticMesh(깨지지 않은 온전한 상태로)로서 그 수명을 시작함으로써 부숴질 때까지는 더 능률적인, 정적 렌더링의 잇점을 누릴 수 있습니다.

적당한 FracturedStaticMesh를 만들기 위한 지침


요약: FractureTool을 사용해서 부수는 스태틱 메시 조각의 수를 적게 (대강 5개에서 20개) 택하십시요.

좀 더 자세히 설명하자면... FractureTool은 StaticMesh를 다소 많은 수의 조각으로 프랙처합니다. 현재 이 도구는 150 조각까지 허용하고 있습니다. 그러나 저희는 이 수를 적게 유지할 것을 권합니다 (12개 정도로, 작은 객체에 대해서는 더 적게). 그 이유는 FracturedStaticMesh의 각 조각이 하나의 AActor가 되기 때문입니다. 그렇지만 그 이후에는 AActor가 더 이상 만들어지지 않습니다. 이 AActor들 (PhysXDestructibleParts)은 각각 하나 또는 그 이상의 SkeletalMesh로 표시됩니다.

StaticMesh를 한 개의 조각으로 "부수는" 것도 할 수 있습니다! 이렇게 할 경우, 손상이 가해졌을 때 FracturedStaticMesh는 전부 다 SkeletalMesh(들)로 대체됩니다. 하지만, FracturedStaticMesh로 시작하는 것에 대한 이면의 착상은 되도록이면 많은 손상되지 않은 메시를 되도록이면 오래 static으로 유지하자는 데 있습니다. 이는 static이 제공하는 보다 능률적인 렌더링의 잇점을 취하기 위해서입니다. 따라서 너무 적은 수의 조각 (예를들면 1)으로 부수는 것은 바람직하지 않습니다.

주: 현재 이에 대한 최적화는 되어 있지 않습니다. PhysXDestructible이 프랙처 되자 마자 조각들이 전부 별도의 SkeletalMesh가 되어 버립니다. 저희는 곧 정적 최적화를 구현할 계획입니다. 그러나 저희는 여러분이 위의 지침을 따를 것을 권합니다. 그리고 이 최적화를 구현하는, 나중의 코드 드롭은 레벨에 더 나은 프랙처 성능을 제공하게 될 것입니다.

PhysXDestructible 만드는 법


머티리얼

시작은 StaticMesh로 했지만, 마감은 SkeletalMesh로 하게 됩니다. 그러므로 Material Editor에서 PhysXDestructible에 사용된 모든 머티리얼에 대해 bUsedWithSkeletalMesh를 선택하는 것이 매우 중요합니다.

MaterialEditor.png

레벨을 Play-In-Editor에서 실행할 경우에는 큰 차이가 없지만, 게임에서 실행할 때 이 체크박스가 선택되어 있지 않으면 머티리얼이 적용되지 않습니다.

스태틱 메시를 조각낼 때는 반드시 새로 만들어진 내부의 표면에 적용될 머티리얼을 선택해야 합니다. 이 머티리얼이 PhysXDestructible을 생성하는데 사용된 계층적 분할에 의해 만들어진 모든 내부의 표면에 적용되게 됩니다. 여기서는 프랙처된 통 메시를 선택했습니다(아래 그림). 내부의 머티리얼은 항상 FracturedStaticMesh의 마지막 요소 내에 있습니다.

Generic Browser에서 FracturedStaticMesh를 더블클릭하여 이 메시를 엽니다. 그 다음 Generic Browser에서 내부 머티리얼을 선택합니다 (아래 그림에서는 'PinMat'이 선택되어 있습니다). StaticMesh Editor로 되돌아가서 LODInfo[0]->Elements[마지막 인덱스] 를 연 다음 'Material' 필드 옆에 있는 초록색 화살표를 클릭하여 이 필드를 선택한 머티리얼로 채웁니다.

InteriorMaterial.png

메시 자르기

Generic Browser에서 FracturedStaticMesh를 오른 클릭하여 'Create New PhysX Destructible'을 선택합니다.

SelectFSM.png

새 자산이 넣어질 패키지와 그 이름을 선택하면, PhysXFractureOption을 보여주는 대화상자가 나타납니다. 이것은 "SlicingLevels"의 배열입니다. 기본으로 설정되어 있 레벨을 한 개이지만, SlicingLevels 옆에 있는 초록색 ‘+’ 버튼을 클릭하면 레벨을 더 추가할 수 있습니다. 레벨이 새로 추가됨에 따라 생성되는 조각의 수가 기하급수적으로 증가합니다. 조심하십시요 원한다면 ‘{}’버튼을 클릭하여 배열을 삭제하고 다시 시작할 수 있습니다.

각 레벨에 대해 X, Y 및 Z 에서의 조각 수, 그리고 직선 및 각도 노이즈를 선택할 수 있습니다. 각 축을 따라 잘려지는 평면의 수는 마이너스 숫자가 아니면 됩니다. 0을 선택하면 그 계층에서의 해당 레벨의 해당 축에서는 잘라짐이 없게 됩니다. 노이즈가 없을 경우 잘리는 평면들은 정확히 그 평면들의 축을 향하는 노멀을 가지게 되며, 메시의 경계 박스를 고르게 분할하게 됩니다. AngularNoise는 평면의 노멀이 자르는 축으로부터 벗어나는 거리를 나타냅니다 (그 범위 내에서 임의로 노멀이 선택됩니다). LinearNoise는 해당 평면이 잘리는 축에서 임의로 이동되는 거리를 나타냅니다. 크기조정은 각각의 잘리는 평면이 경계 박스의 1/N을 그 ‘영역’으로서 가지도록 설정됩니다 ( N = 해당 축을 따라 잘라지는 면의 수). 직선으로 1을 이동하면 그 평면은 다음 평면의 영역 바로 위로 밀어올려집니다.

기본 설정은 각 축을 따라 한 번 자르기로 되어 있습니다. 이는 원래의 조각으로부터 2x2x2 = 8 개 까지의 새 조각을 생성시킵니다. "까지"라고 한 것은 결과로서 나타나는 조각이 메시의 도형을 가로지르지 않을 경우 조각이 생성되지 않을 수도 있기 때문입니다. 또 생성되는 조각의 부피가 상대적으로 아주 작을 경우에도 그 조각은 생성되지 않습니다.

그러므로 처음의 FracturedStaticMesh 조각 수로 출발하여, 이들을 기본 자르기 횟수로 자르면, 분할 계층의 다음 레벨에서는 8배까지의 조각(덩어리)들이 생성됩니다. 분할할 레벨을 하나 더 추가하면 또 다시 그만큼의 수가 곱해집니다. 이롷게 해서 수백개, 수천개, 심지어 더 많은 덩어리가 쉽게 생성됩니다. 그 수가 1,000을 넘으면 생성이 예측되는 조각의 수와 함께 경고가 나타납니다.

자르기 횟수 (X, Y 와 Z 축에서의 자르기) 와 자르기 레벨의 수에 대해 유의할 점 한가지: 일반적으로, 더 많은 조각들을 생성하기 위해서 각 축을 따라 자르는 횟수를 늘리는 것보다는 또 하나의 자르기 레벨을 사용하는 것이 바람직합니다. 이렇게 하면 프랙처가 최대한 계층적으로 되며, 생성되는 리짓 바디의 수를 감소시킬 수 있습니다. 자르기 횟수를 사용하는 좋은 예는 이상한 모양의 메시를 이런 식으로 분할하여 조각들이 보다 더 규칙적인 크기(입방체에 가깝게)가 되도록 하는 것입니다. 이는 분할의 첫 레벨에서 분할한 다음, 그 다음 단계(들)에서 1x1x1 분할을 이용하면 됩니다. 극단적인 보기는 빗자루의 손잡이처럼 길고 가느다란 물체입니다. X 와 Y 축을 따른 평면의 자르기 횟수를 0으로 하고, (손잡이가 Z축에 로컬로 정렬되어 있다는 가정 아래) Z축을 따라 자르는 횟수를 크게 (아마 12 정도로) 하면 됩니다.

SlicingOptions.png

자르는 평면들을 선택하고 나서 "OK"를 클릭하면 자르기가 시작됩니다. 여기서 시간이 좀 걸립니다 각 FracturedStaticMesh의 조각마다 적어도 한 개의 SkeletalMesh가 생성됩니다 (각각의 SkeletalMesh는 250개까지의 덩어리를 보유하는데 사용됩니다. 자르기가 이보다 많은 수의 덩어리를 만들어내면 더 많은 SkeletalMesh가 사용됩니다). 자르기가 끝나면 Generic Browser에서 수많은 새 PhysicsAsset과 SkeletalMesh들을 확인할 수 있습니다. 이것들은 무시해도 됩니다. 레벨에서 액터를 만드는데 사용하는 것은 새로 만들어진 PhysXDestructible 입니다.

Destructible 파라미터들

PhysXDestructible과 함께 보관되는 "destructible parameter (파괴할 수 있는 파라미터)"들이 다수 있습니다. PhysXDestructible로부터 액터를 인스턴스화 하면 이 파라미터들이 액터(PhysXDestructibleActor)에 복사되며, 그 액터 내에서 이 파라미터들을 인스턴스 단위로 변경할 수 있습니다. 이들을 PhysXDestructible의 "보기판"에서 변경하려면, Generic Browser에서 PhysXDestructible을 더블 클릭합니다. 최상위 레벨에 두 개의 아이템 CookingScales와 DestructibleParameters를 가지고 있는 윈도우가 나타납니다. CookingScales에 대해서는 나중에 살펴보기로 하고, 지금은 DestructibleParameters에 집중하겠습니다.

Generic Browser 에서 PhysXDestructible을 선택한 다음, 레벨 편집 윈도우에서 새 PhysXDestructibleActor를 만들고자 하는 위치를 더블 클릭합니다.

PhysXDestructibleProperties.png

DamageThreshold - 덩어리가 떨어져 나오기 위해 필요로 하는 손상의 양을 가리킵니다.
bAccumulateDamage - 이것이 체크되면 덩어리에 가해진 손상의 양이 누적됩니다. 누적된 손상이 DamageThreshold를 초과하면 그 덩어리가 떨어져 나갑니다. 체크되지 않은 경우에는 손상이 누적되지 않으므로, 덩어리가 떨어져 나오려면 한번에 가해지는 손상의 양이 DamageThreshold를 초과해야 합니다.
DamageCap - 가해지는 손상의 양을 이 분량으로 제한합니다. 이 값이 0 (기본값)으로 설정되면 손상의 양을 제한 없이 적용할 수 있습니다.
DamageToRadius - 손상을 destructible 내의 거리로 전환합니다. 손상의 종류가 'bFullDamage'를 적용할 경우에는 이 반경 내의 모든 덩어리에 이 양이 적용됩니다. 그렇지 않으면, 손상은 완전 손상으로부터(손상의 시작점으로부터) 0까지 (손상의 반경) 직선으로 감퇴합니다. 다음은 손상에 대해 유의할 점 몇가지입니다:

  • 덩어리가 손상을 받은 후에는 DamageThreshold가 손상으로부터 감해지고, 그 나머지가 덩어리 프랙처 계층의 모든 "자식"에 적용됩니다. 계층의 각 레벨에서, DamageThreshold는 덩어리가 떨어져 나가는데 필요한 양입니다. 손상 타입에 linear falloff(직선 감퇴)이 사용될 경우, 메시는 손상의 시작점 가까이에서 고운 조각들로 부서지고, 더 멀리 떨어진 곳에서 더 큰 조각으로 부서지는 경향을 보입니다.
  • 실제로 손상이 반경으로 전환되는 과정은 다음과 같습니다: 손상이 DamageThreshold로 나뉘어지고, 그 결과가 DamageToRadius에 곱해집니다. 그리고 마지막으로 객체의 크기(객체 경계 박스의 평균 넓이)로 곱해집니다. 이는 손상과 크기를 모두 조정하므로 DamageThreshold 과 mesh scale이 모두 달라지게 되지만, 전달되는 손상은 바뀌지 않고 그대로입니다.

ForceToDamage - 충격력은 이 인수에 의해 손상으로 전환됩니다. 이것이 제대로 작용하려면 Actor의 CollisionComponent에서 bNotifyRigidBodyCollision이 체크되어 있어야 합니다.
CrumbleParticleSystem - 이것은 PhysX 에미터를 가지고 있는 파티클 시스템이 되도록 하는 것입니다 (PhysXParticleSystemReference 참고). 부숴짐을 흉내내기 위해 PhysX Mesh Emitter를 사용할 수 있습니다. 가장 낮은 (가장 작은) 레벨에 있는 덩어리가 손상에서 DamageThreshold를 받으면 이는 파괴됩니다. CrumbleParticleSystem이 선택된 경우에는 해당 덩어리의 부피는 메시의 "유동체" 파티클의 그룹으로 대체됩니다. 이들은 도형과 충돌하여 여러 개의 작은 몸체들을 모방해 냅니다.
CrumbleParticleSize -CrumbleParticleSystem을 사용할 때(위의 항 참조), 파괴된 덩어리들은 이 거리만큼 떨어져있는 파티클들로 채워집니다.
FractureSound - 덩어리가 떨어져 나갈 때(또는 부숴질 때) 재생할 수 있는 SoundCue.
DepthParameters - 이것은 덩어리 계층의 각 레벨당 하나씩인 파라미터 세트들의 배열입니다. 이 배열의 크기는 조정할 수 없습니다; 그 크기는 덩어리 계층내 레벨의 수에 의해 설정되어 있습니다. 세트 [0]은 PhysXDestructibleActor 용의 파라미터들을 부여합니다. 세트 [1]은 최상위 레벨 덩어리용의 파라미터들을 부여합니다(각각의 덩어리가 하나의 FracturedStaticMesh 조각을 나타내는 ). 한 레벨의 자르기를 사용하면, 그 다음으로 고운 레벨의 덩어리에 적용되는 세트 [2]가 생겨납니다. 또 두 레벨의 자르기를 사용하면 세트 [3]가 생겨나는 등, 레벨이 추가됨에 따라 세트가 추가됩니다. 각 레벨에는 다음과 같은 파라미터들이 있습니다:
  • bTakeImpactDamage - ForceToDamage > 0일 경우, 충격력은 이 레벨에서 손상을 적용합니다.
  • bPlaySoundEffect - FractureSound가 설정되어 있는 경우, 이 레벨의 덩어리가 떨어져나갈 때 (또는 부숴질 때) 음향이 재생됩니다.
  • bPlayParticleEffect – 이 레벨에서 깨진 덩어리들은 FracturedStaticMesh에서 설정된 FragmentDestroyEffect를 재생합니다 (이것은 StaticMesh 에디터의 FSM에 설정되어 있습니다. FractureTool 페이지를 참고하십시요).
  • bDoNotTimeOut – 이것이 설정된 경우 이 레벨에 있는 덩어리들은 환경 설정 변수인 MaxDynamicChunkCount가 (아래의 LOD Scaling 참조) 초과되지 않는 한 무기한으로 남아있게 됩니다. 이것이 설정되지 않은 경우에는 환경 설정 변수 DebrisLifetime에 (또한 아래의 LOD Scaling 참조) 의해 주어진 시간이 경과하면 이 덩어리는 파괴됩니다.

LOD 스케일 조절

PhysXDestructible에는 두 개의 글로벌 LOD 파라미터가 있습니다. 이 둘은 모두 BaseEngine.ini의 [Engine.PhysXLODVerticalDestructible] 및 파생된 ini 파일에 에 들어 있습니다. 이 두 파라미터는 다음과 같습니다:

MaxDynamicChunkCount - PhysXDestructible에 대해 떨어지는 덩어리, 따라서 리짓 바디의 최대 수를 설정합니다. 이 수치는 해당 레벨의 모든 PhysXDestructible에 대한 총계입니다. 덩어리들은 FIFO(선입선출) 원칙에 의해 보존됩니다. 따라서 MaxDynamicChunkCount의 한계를 유지하기 위해 가장 오래된 덩어리가 가장 먼저 파괴됩니다.
DebrisLifetime - "파편" 덩어리들을 얼마동안 보존해둘 것인지 설정합니다. 이 경우 "파편"은 단순히 bDoNotTimeOut 필드가 체크되지 않았다는 것을 뜻합니다 (위의 Destructible Parameters 참고).

만일 최대 덩어리 수의 한계를 초과하거나 제한 시간을 초과하여 덩어리가 제거되면, 이 덩어리는 CrumbleParticleSystem을 사용해서 완전히 부숴집니다. 설정된 CrumbleParticleSystem이 없으면, 그 덩어리는 간단히 사라져 버립니다.

PhysXDestructibleActor 만들기

PhysXDestructibleActor를 만들려면, Generic Browser에서 PhysXDestructible을 선택한 다음, Level Editor 에서 액터를 배치하고자 하는 위치를 오른 클릭하면 됩니다. 그리고나서 'Add PhysXDestructibleActor...' 를 선택합니다 (아래 그림 참조).

CreatePhysXDestructibleActor.png

레벨에 액터가 배치되면, 이 인스턴스의 DestructibleParameters를 변경하고, 액터를 조정하거나 또는 이를 동적으로 만들 수 있습니다. Destructible의 "support(지지)"에 영향을 주는 파라미터들도 있습니다. 아래의 Support 섹션을 참고하십시요.

다음은 PhysXDestructibleActor의 속성 윈도우입니다.

PhysXDestructibleActorProperties.png

여기에는 몇가지 지적해둘 점들이 있습니다.

  1. DestructibleParameters는 PhysXDestructible로부터 복사된 것이며, 이 액터 인스턴스용으로 변경되 수 있습니다.
  2. PhysXDestructibleActor의 Physics를 PHYS_RigidBody로 바꾸면 이를 동적으로 만들 수 있습니다.
  3. PhysXDestructibleActor가 동적이 아닌 경우, 이는 지지 그룹의 일부가 될 수 있습니다. 여기에 대해서는 아래의 Support 섹션에서 자세히 설명하겠습니다. 다음은 4개의 지지 필드에 대한 설명입니다:
    • SupportDepth – 지지의 계산이 계층의 이 깊이에서 이루어집니다. Depth = 0 (기본값)은 지지의 계산이 FracturedStaticMesh 조각의 깊이, 즉 가장 큰 조각에서 이루어진다는 것을 의미합니다.
    • PerFrameProcessBudget –프레임별로 지지의 계산을 수행하는데 허용되는 반복 (지원 그래프 탐색)의 수. 이는 지지 그룹이 아주 크지 않은 한 대개 별문제가 되지 않습니다. ProcessBudget이 초과되면 처리되지 않은 덩어리들은 자동적으로 떨어져 나갑니다.
    • bSupportChunksInSupportFragment – 이것이 체크되면 SupportDepth에 있는 덩어리는 (FractureTool에서 설정된) FracturedStaticMesh support chunk(지지용 덩어리)의 자식일 경우에만 "support chunk"로 간주됩니다.
    • bSupportChunksTouchWorld -이것이 체크되면, SupportDepth에 있는 덩어리들은 세계의 도형에 닿을 때만 건드릴 때만 "support chunk "로 간주됩니다.

크럼블 파티클 시스템 만들기

크럼블(가루) 파티클 시스템은 PhysX Emitters를 사용하며, 가루내기를 모방할 때는 대개 메시 에미터를 사용합니다. 가루내기는 "부피 채우기"를 통해 이루어지기 때문에 수백 개, 대로는 수천 개의 유동체 파티클이 생성됩니다. 이런 경우에는 파티클에 대해 인스턴스화된 메시 렌더링을 사용할 것을 권합니다. 이를 유효화하려면 파티클에 적용할 머티리얼을 열어서 bUsedWithInstancedMeshParticles를 체크하십시요:

MeshHWInstancing.png

메시 파티클에 적용된 이 머티리얼을 사용해서 PhysX 메시 에미터를 만듭니다. PhysXParticleSystemReference를 참고하십시요.

그 다음, PhysXDestructible의 "보기판" 또는 PhysXDestructibleActor 인스턴스를 위한 DestructibleParameters를 엽니다. Generic Browser에서 파티클 시스템을 선택한 다음, CrumbleParticleSystem 옆에 있는 초록색 화살표를 클릭하여 이 필드를 채워넣습니다.

지금까지 설명드린 것들의 예로서, 앞서 만든 파괴할 수 있는 통이 들어있는 레벨을 실행하고 그 통을 마우스 왼쪽 버튼으로 클릭하여 손상을 적용하면 다음 그림 같은 것이 나타나게 됩니다:

BarrelDestroyed.png

지지대 (support)

위에 설명한 것처럼 정적인 PhysXDestructibleActor 는 "support chunk"(지지대 청크)를 가질 수 있습니다. 지지된다는 개념은 다음과 같이 계산됩니다: 청크가 지지대에 닿아있으면 지지되어 있는 것입니다. 이런 식으로 전체 액터가 지지되어 있는 것으로 시작했다가, 충분히 파괴되면 (지지대 청크와의 연결이 끊어지면) 그 일부는 지지되지 않을 수 있습니다. 지지되지 않은 청크는 동적으로 변합니다.

추가로 지지대 구조물은 레벨에 접해 있는 둘 이상의 PhysXDestructibleActor 사이로 뻗어있을 수 있습니다. 그렇게 접하는 PhysXDestructibleActor 모든 아일랜드는 지지대 구조물을 이룹니다. 이런 식으로 정적인 Destructible 을 연결 또는 "타일"로 붙여 하나의 커다란 Destructible 액터처럼 작동하도록 할 수 있습니다.

동적인 Destructible 은 지지대 계산에 포함되지 않으며, 지지대 아일랜드의 일부가 아닙니다.

예를 들어 Destructible 벽 조각을 만들어 보겠습니다. EffectsDemo_Resources.Ephyra_lpwallow3 정도면 괜찮은 벽 조각은 될 수 있으나 너무 작습니다. 그러므로 스케일 조절 예제로 적합하겠네요.

크기 조정과 쿠킹

앞서 예로 든 벽의 계속으로서, 위에서 설명한 순서에 따라 EffectsDemo_Resources.Ephyra_lpwallow3로부터 PhysXDestructible을 만들어 보겠습니다. 그리고 FractureTool을 사용해서 그것을 12개의 조각으로 깨뜨린 다음 둘째 레벨 자르기를 사용해서 많은 조각들로 자를 것입니다. 조각들을 쓸모있게 만들기 위해서는 크기를 조정할 필요가 있습니다. 그러므로 덩어리를 위한 충돌 모델 또한 조정되어야 합니다. 우리는 레벨에서 이들 (볼록) 충돌 모델들이 사전에 쿠킹되도록 하려고 합니다. 따라서 이들을 쿠킹하고자 하는 척도를 지정해줄 필요가 있습니다. PhysXDestructible을 더블 클릭한 다음 CookingScales 옆에 있는 초록색 ‘+’ 버튼을 클릭하여 이를 CookingScales 배열에 추가합니다. 그리고 쿠킹하고자 하는 척도를 추가합니다. 이 경우에는 (10,10,10)이나 균일 척도인 10x를 선택합니다. 주: 조정되지 않은 인스턴스를 사용하지 않을 계획이면, 레벨 파일의 공간을 절약하기 위해 (1,1,1) 스케일을 제거해야 합니다.

CookingScale.png

이제 Generic Browser에서 PhysXDestructible을 선택하여 위에서 설명한 것처럼 레벨에 PhysXDestructibleActor를 만듭니다. 레벨에서 액터의 속성 시트를 열어 DrawScale3D를 (10,10,10)으로 바꿉니다:

ScalingADestructible.png

...이로써 조정된 destructible을 사용할 준비가 다 되었습니다.

Support의 예

벽의 조각을 사용한 이 지지의 예를 끝마치려면, 레벨을 실행하여 콘솔에 *APEXVIS SUPPORT*를 입력하십시요. destructible 액터가 지지되면, 지지그래프가 그려집니다:

Support.png

여기서는 벽이 지면에 닿아 있습니다. 그러므로 가장 밑에 있는 덩어리들은 (bSupportChunksTouchWorld 가 기본으로 설정되어 있으므로) support chunk들입니다. 에디터에서 이 벽을 복사하여 원래의 벽과 맞물리도록 이동하면, 지지 그래프는 그 두 번째 벽까지 뻗어갑니다:

Support2.png

두 번째 벽은 그 자체에 의해 지지되지 않고 있는 점을 주목하십시요. 이는 그 벽이 세계의 도형에 닿아있지 않기 때문입니다 (또한 이 경우 bSupportChunksInSupportFragment가 false로 기본 설정 되어 있습니다). 그렇지만 이 벽은 지원된 PhysXDestructibleActor에 닿아 있으므로 그 지지를 얻습니다. 이 둘은 지지 그룹을 형성합니다.

아래 벽과 위 벽 사이의 support가 무너질 때까지 ,

PartiallyDestroyedWalls.png

... 아래 쪽 벽을 사격해 보십시요:

DestroyedWalls.png

잘 알려진 문제점들


  1. 충격에 의한 손상이 항상 작용하지 않습니다. 이는 통합시의 버그 때문이거나 , 아니면 PhysX SDK의 버그 때문입니다.
  2. 첫 번째 손상시에 FracturedStaticMesh가 제거되고 SkeletalMesh로 대체됩니다. 조각들을 보이지 않게 하고, 필요할 때만 SkeletalMesh로 대체함으로써 되도록이면 스태틱 메시로 표시되는 것이 많아지도록 하는, 보다 효과적인 접근방식이 계획되어 있습니다.
  3. 메시가 너무 곱게 잘려지는 경우, 작은 파편들이 공기 중에 "떠다니는" 다소 이상한 에러가 나타날 수 있습니다.
  4. FracturedStaticMeshes 와 PhysXDestructibles 에 대한 변경 내용이 레벨의 PhysXDestructibleActor 인스턴스에 전달되지 않습니다.