UDN
Search public documentation:

CollisionReferenceJP
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

Collision(衝突) のリファレンス

ドキュメントの概要: Unreal Engine での衝突に関する操作のリファレンスおよびガイド。

ドキュメントの変更ログ: James Golding によりポート化および更新。Richard Nalezynski? により管理。

衝突の概要

衝突によって Unreal レベルが目を見張るほど変容するのは言うに及ばずですが、レベルのオブジェクト間の衝突に時間を費やすにはそれだけの価値があるのです。

実行される衝突には、Unreal 衝突と、剛体の物理衝突 (Novodex 社の PhysX に基づく) の 2 つのタイプがあります。

レベル BSP およびテレインでの衝突は、それほどの調整が必要なく機能します。ただし、静的メッシュでの衝突は、多くのトライアングルを伴うため最適化が必要です。ここで主な作業は、グラフィックに対してよりも衝突に対して単純な形状を使用することです。これには理由が 2 つあります:

  • より速く。 レベル内の現在の三角形の数では、グラフィックメッシュの三角形を衝突に使用すると非常に遅くなります。
  • より滑らかに。 銃撃戦の最中に小さなグラフィックディテールで 邪魔されたり(snagged) するのは、本当にイライラするものです。

Unreal における衝突

アクタのプロパティ

特定のアクタの Collision セクションには、アクタに関する多数のプロパティがあります。

bCollideComplex アクタが動いている間はこのアクタの単純衝突 (Collosion モデル) を無視し、ポリゴン単位の衝突を実行します。
BlockRigidBody 物理エンジン (PHYS_RigidBody) を使用するオブジェクトが、このアクタと衝突するかどうか。
bNoEncroachCheck このアクタが動くときに 'encroachment' チェックをオフにする最適化。これを有効するとゲーム速度は上がりますが、アクタトリガに触れたり、プレーヤーを押したり、ボリュームに出入りすることはできなくなります。
bPathColliding エディタで AI パスをビルドするときにこのアクタがパスをブロックできるかどうか。
CollisionComponent このアクタが動くのに使われるコンポーネントへのポインタ。PHYS_Walking などを使用する場合、このコンポーネントの AABB はレベルに逆らって流され、PHYS_RigidBody を使用する場合はこのコンポーネントの形状/物理が使用されます。
CollisionType これは、複数の衝突設定を簡単な方法でレベルデザイナーに提供する方法です。エディタでこの値を変更すると、アクタの下位レベルフラグ (CollideActors、BlockActors、BlockNonZeroExtent、BlockZeroExtent、BlockRigidBody) と CollisionComponent が設定されます。

Collosion フラグ

レベル内に配置したオブジェクトと、Unreal がどのように衝突するかをコントロールするために、多数のフラグが備えられています。フラグはアクタ プロパティとコンポーネント プロパティの両方に現れる時があります。この場合、アクタのフラグがオーバーライドとして機能します。これを有効にするには、双方共に、 TRUE に設定する必要があります。

CollideActors (Collosion アクタ) オブジェクトが Unreal の衝突判定を受けるには、これは TRUE である必要があります。
BlockActors このオブジェクトがプレーヤーの動きをブロックするかどうかを指定します。例えば、トリガでは CollideActorsTRUE に設定し、=BlockActors= を False に設定します。
BlockZeroExtent zero-extent (ゼロエクステント) トレースとは、武器などによく使用される通常のラインチェックです。このタイプのチェックを行うときは、対象オブジェクトのこのフラグを TRUE にする必要があります。
BlockNonZeroExtent non-zero-extent (ノンゼロエクステント) トレースは、プレーヤーの移動などに使用される swept-box (Axis-Aligned Bounding Box または AABB) チェックで、 False の場合、このタイプのチェックではこのオブジェクトは無視されます。

Collosion タイプ

レベル内でCollosion を調整するには、 ブロッキングボリュームCollosion モデル のふたつのツールがあります。双方共に「閉じられた」メッシュである必要があります。

Blocking Volumes

これは、ゲーム内でプレーヤーが衝突する非表示のアクタです。最初のビルダブラシを適切な形に作成し、次にエディタの [Volume] (ボリューム) ボタンを右クリックしてリストから [BlockingVolume] を選択します。プレーヤーが特定のレベル領域 (壁の向こう側など) に行かないようにする場合にも利用できます。

Collision Models(Collosion モデル)

Collision Models(Collosion モデル) は、パッケージ ファイルに StaticMesh の一部として保存されています。StaticMesh を配置する度に、同じ方法で衝突します。Collosion モデルは静的メッシュの一部であるため、StaticMesh グラフィックと同じ方法でインスタンス化されます。Collosion モデルは静的メッシュの一部なので、静的メッシュのグラフィックと同じ方法で インスタンス化 され、したがってメモリの面ではブロッキングボリュームよりも効率的です。

StaticMesh ブラウザで、いくつかのプロパティを変更してCollosion モデルが使われる方法を変えることができます:

衝突タイプ デフォルト 説明
UseSimpleRigidBodyCollision (単純な剛体衝突を使用) TRUE これが TRUE でCollosion モデルが存在する場合、Collosion モデルは一組の凸面の外殻に変えられ、このオブジェクトに対する完全な物理オブジェクト(ビークルまたはラグドールなど)の衝突を計算するために使われるます。もしも UseSimpleRigidBodyCollision が TRUE でCollosion モデルが存在しない場合、剛体はこのオブジェクトとは衝突しません。 UseSimpleRigidBodyCollision を False に設定した場合、物理エンジンはグラフィック トライアングルと衝突します。これはグラフィック トライアングルが比較的大きい場合にのみ使用してください。詳細については、下の 剛体の衝突 をご覧ください。
UseSimpleBoxCollision TRUE これが TRUE の場合、_Non-Zero Extent(非ゼロエクステント)_ ラインチェックにCollosion モデルが使用されます (存在する場合)。これにはプレーヤの動きなどが含まれますが、火器の発射は含まれません。これが TRUE の場合はトライアングル単位の衝突は使用されず、Collosion モデルは存在します。 UseSimpleBoxCollisionFALSE に設定した場合、マテリアルに基づく三角形単位の衝突が使用されます。マテリアルの衝突をオフにするには、 Material(マテリアル) を開いて EnableCollision (衝突を可能にする) を False に設定します。Collosion モデルを持たずに UseSimpleBoxCollision を TRUE に設定すると、衝突は起こりません。
UseSimpleLineCollision TRUE これが TRUE の場合、 Zero Extent ラインチェックにCollosion モデルが使用されます (存在する場合)。これにはほとんどの弾道やコロナのトレースなどが含まれます。Collosion モデルが存在しない状態で UseSimpleLineCollisionTRUE に設定した場合、または UseSimpleLineCollisionFALSE にした場合、マテリアルに基づく三角形単位の衝突が使用されます。マテリアルの衝突をオフにするには、マテリアルを開いて EnableCollision を False に設定します。

Collosion モデルの作成

静的メッシュにCollosion モデルを作成するには、いくつかの方法があります。静的メッシュにCollosion モデルを加えた後は、パッケージ ファイルを保存する必要があります。

ブラシを衝突として保存する

レベルに、Collosion モデルを加えたい StaticMesh を配置します。次に、望みどおりのCollosion モデルの形にシェイプしたビルダ ブラシを周りに配置します。シェイプは出来る限り単純にします。静的メッシュを選択し、右クリックして Save Brush As Collision (ブラシを衝突として保存する) を選択します。StaticMesh に適用したスケーリングも考慮されています。

この衝突は、選択した StaticMesh すべてのインスタンスに加えられることを覚えておいて下さい。ブラシを衝突として保存した効果を確認するには、StaticMesh を含むパッケージを保存する必要があります。

K-DOP

K-DOP は、静的メッシュビューアで単純なCollosion モデルの生成に使われるツールです。K-DOP は境界ボリュームの一種で、 K discrete oriented polytope の略語です (K は軸方向に並べられた平面の数です)。基本的には、軸方向に整列する K 個の平面を、メッシュの出来るだけ近くに押すことによって生成される形状をCollosion モデルとして用います。エディタでは、この K は次のいずれかになります。

6 軸に沿って整列したボックス
10 面取した4つのエッジを持つボックス - X 軸、Y 軸、または Z 軸 に沿って整列したエッジを選べます。
18 すべてのエッジを面取したボックス
26 すべてのエッジと角を面取したボックス

下の例を参照してください。このユーティリティは、パイプ、柱、柵などが一杯あるパッケージに便利です。

kdop_sizes.jpg

モデリング プログラム (3D Studio Max または Maya) での作成

Collosion モデル は、3D モデリングプログラム (3D Studio Max または Maya) で作成できます。 ボックス、球体、凸面のオブジェクトなどを作り、メッシュの周囲に適切に配置します。名前が的確に付けられていれば、これらのシェイプは Unreal によりCollosion モデルに変換されます。ネーミングの規則は下のとおりです(大文字・小文字を区別する):

UBX ボックス プリミティブ
USP 球体プリミティブ
UCX 凸面メッシュ プリミティブ

  • ボックスは、MAX では Box オブジェクトタイプ、Maya では Cube ポリゴンプリミティブを用いて作成します。ボックスの頂点移動やボックスの変形により、四角形のプリズム以外の形にすると機能しなくなるためこれはできません。
  • 球は、 Sphere オブジェクトタイプを用いて作成します。衝突では本来の球体に変換されるため、球のセグメント数を多くする必要はありません (8 が適切な値です)。ボックスと同様に、個々の頂点を移動してはいけません。
  • 凸形オブジェクトは、完全に閉じた任意の 3D 形状です。例えば、ボックスも凸形オブジェクトになります。次図はどれが凸形であるかを示しています。

Convex.gif

注意点として、現在のところ、球は剛体衝突と Unreal のゼロエクステントトレース (武器など) にのみ使用され、ノンゼロエクステントのトレース (プレーヤーの動きなど) には使用されていません。また、静的メッシュが不均等にスケーリングされている場合は、球とボックスは機能しません。通常は UCX プリミティブの作成が推奨されています。

衝突オブジェクトを設定した後で、グラフィックと衝突メッシュを同じ .ASE ファイルにエクスポートできます。.ASE ファイルを UnrealEd にインポートすると、衝突メッシュを自動的に検出してそれをグラフィックメッシュから消去し、Collosion モデルに変換します。

注意: 複数の凸包 (convex hull) として衝突が定義されているオブジェクトの場合、その外殻がお互いに交差しない状態で最高の結果が得られます。例えば、ロリポップ形の衝突を、アイスキャンデー部分と棒部分の 2 つの凸型の外殻として定義した場合、下図のように 2 つの間に隙間が残ります。

lollipop.jpg

非凸形のメッシュを凸形プリミティブに分割するのは複雑な作業で、予期せぬ結果を招く可能性があります。別のアプローチとして、Max または Maya でCollosion モデルを手動で凸形の断片にする方法があります。これには、静的メッシュのインポートで bOneConvexPerUCXObject オプションを使用します。このオプションを選択すると、ファイル内の個々の UCX_ オブジェクトが完全に 1 つのプリミティブになります。凸形以外のオブジェクトは凸包で包囲されて凸形になります。これにより制御の幅が広がるので、複雑なメッシュの場合にはこの方法が得策です。

剛体の物理衝突

Novodex の PhysX の剛体物理エンジンの仕組みでは、接触が発生するフレームごとに 接触点 (contact points) を生成します。これはラインチェックよりも複雑なプロセスなので、実際の物理オブジェクト (ラグドールなど) が衝突するジオメトリを、速度と挙動の面で出来るだけ単純にとどめておくことが大切です。例えば、多数の小さな三角形があれば物理オブジェクトが 絡まって (snagged) しまい、処理に時間をとられます。

最初に、Physics アクタをブロックするアクタの bBlockRigidBody フラグを True に設定する必要があります。静的メッシュとブロッキングボリュームではこれがデフォルト設定です。

UseSimpleRigidBodyCollisiontrue の場合 (詳細は前述の Collosion モデルを を参照)、Collosion モデルを適用し、これを凸包のプリミティブセットに変換して接触点を生成します。 静的メッシュビューア?[View] (表示) メニューから [View Collision] (衝突を表示)を選択すると、プリミティブの総数が分かります。この数が 10 より少ないのが理想的で、絶対に 100 以内に抑えてください。

Rigid-body アクタは三角形単位の BSP とテレインに衝突することから、BSP とテレインに特に小さな三角形が存在しないようにしてください。細かなディテールにはブロッキングボリューム/Collosion モデルを使用します。

剛体衝突のフィルタリング

剛体オブジェクトの衝突は、Component 内の RBChannel と RBCollidesWithChannel オプションを用いて制御できます。

  • RBChannel では、このオブジェクトが衝突の対象となるオブジェクトタイプを指定します。
  • RBCollidesWithChannel では、このオブジェクトとの衝突を生成するオブジェクトのタイプを指定します。

デフォルトでは、BSP、テレインおよび静的メッシュが Default チャンネルに含まれています。したがって、それらと衝突させたい物理オブジェクトがある場合は、_[RBCollidesWithChannel]_ の [Default] を選択します。通常は、レベル内の静的オブジェクトの [RBCollidesWithChannel] ではフラグが設定されていないので、動的オブジェクトが衝突したいオブジェクトを「選択」します。

RBCC_Nothing という特別なチャンネルがあり、これはデフォルトではこのオブジェクトと何も衝突しないことを意味します。ただし、そのチャンネルに含めた項目を、_RBCollidesWithChannel_ でも設定することができます。例えば、レベル内のオブジェクトのひとつが車輌とだけ衝突するようにするには、このオブジェクトが RBCC_Nothing チャンネルに属するように設定し、次に [RBCollidesWithChannel][Vehicles] フラグをオンにします。

サンプル

以下は、よくある衝突のシナリオにおける各種の衝突フラグの設定方法の例を示しています。物理シミュレーションに関して衝突チェックとフラグを正しく組み合わせられることが最終目標です。

プレーヤーの動きと弾道

プレーヤーの適切な動きについては (具体的には、衝突シリンダを用いて Pawm (ポーン) の動きと他の Pawn との衝突を制御し、同時に運動ボーン (kinematic bones) を用いて正確な衝突検出を行う場合)、以下を検討してください。

  • Unreal 物理 (PHYS_Walking など) は、CollisionComponent だけを AABB (axis-aligned bounding box) から押し出します。=PHYS_Walking= が使用されているときに、SkeletalMeshComponent を CollisionComponent として用いるのは良いアイデアではありません。キャラクターの動きに伴って形が大きく変化するからです。
  • ラインチェックは、アクタにアタッチされたすべての PrimitiveComponents (CollideActorsBlockZeroExtentTRUE に設定されているコンポーネント) に対して実行されます。
  • PhysicsAssetInstance と運動ボーンについては、対ボーンのラインチェックを行う必要はありません。PhysicsAsset を割り当てて、=CollideActors= と BlockZeroExtentTRUE に設定するだけで、ラインチェック結果が得られます (コンポーネントがアタッチされている場合)。
  • RBChannel/RBCollideWithChannel は、物理エンジンの衝突にのみ影響します。プレーヤーが PHYS_Walking を使用している場合は影響しません。

基本的に、Pawn には CylinderComponent と SkeletalMeshComponent が 1 つずつあるのが望ましく、CollisionComponent のポインタを CylinderComponent に割り当て、SkeletalMeshComponent で CollideActorsBlockZeroExtentTRUE に設定します。さらに、武器のトレースを干渉しないように、CylinderComponent で BlockZeroExtentFALSE に設定しておくのがよいでしょう。

ゲーム内のCollosion (衝突)のレビュー

衝突の設定をレビューするため、ゲーム中に使えるコンソールがいくつかあります。以下にそのうちのいくつかを示します。タイプ入力によりそれぞれがトグルされます。

  • show collision (衝突を表示) これにより、レベルで使うすべてのCollosion モデルとブロッキングボリュームが描かれます。
  • show zeroextent ゼロエクステント(line)トレースの場合、レベルにある衝突を表示します。
非可視オブジェクトには衝突はありません。
  • show nonzeroextent 非ゼロエクステント(swept-box または player movement)トレースの場合、レベルにあるコリジョンを表示します。
  • show rigidbody 剛体の場合 (注記:これはRBCC フィルターグループの効果を表示しません。BlockRigidBody および UseSimpleRigidBodyCollisionのみです)、レベルにある衝突を表示します。
  • show missingcollision (衝突設定のないメッシュを表示) レベルの最適化の過程でよく使われ、Collosion モデル内の静的メッシュすべてに明るいシェイダーを付けます。
  • nxvis collision (Novodex 衝突)レベルの Novodex 衝突情報が表示されるため、剛体が何と衝突しているのかを見ることが出来ます。
  • stat game (ゲーム統計) どれだけ長い異なるタイプの衝突が生じているかについての様々な役に立つ統計値が表示されます。