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
中国翻译
한국어
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 | このオブジェクトがプレーヤーの動きをブロックするかどうかを指定します。例えば、トリガでは CollideActors を TRUE に設定し、=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 モデルは存在します。 UseSimpleBoxCollision を FALSE に設定した場合、マテリアルに基づく三角形単位の衝突が使用されます。マテリアルの衝突をオフにするには、 Material(マテリアル) を開いて EnableCollision (衝突を可能にする) を False に設定します。Collosion モデルを持たずに UseSimpleBoxCollision を TRUE に設定すると、衝突は起こりません。 |
UseSimpleLineCollision | TRUE | これが TRUE の場合、 Zero Extent ラインチェックにCollosion モデルが使用されます (存在する場合)。これにはほとんどの弾道やコロナのトレースなどが含まれます。Collosion モデルが存在しない状態で UseSimpleLineCollision を TRUE に設定した場合、または UseSimpleLineCollision を FALSE にした場合、マテリアルに基づく三角形単位の衝突が使用されます。マテリアルの衝突をオフにするには、マテリアルを開いて 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 | すべてのエッジと角を面取したボックス |

モデリング プログラム (3D Studio Max または Maya) での作成
Collosion モデル は、3D モデリングプログラム (3D Studio Max または Maya) で作成できます。 ボックス、球体、凸面のオブジェクトなどを作り、メッシュの周囲に適切に配置します。名前が的確に付けられていれば、これらのシェイプは Unreal によりCollosion モデルに変換されます。ネーミングの規則は下のとおりです(大文字・小文字を区別する):UBX | ボックス プリミティブ |
USP | 球体プリミティブ |
UCX | 凸面メッシュ プリミティブ |
- ボックスは、MAX では Box オブジェクトタイプ、Maya では Cube ポリゴンプリミティブを用いて作成します。ボックスの頂点移動やボックスの変形により、四角形のプリズム以外の形にすると機能しなくなるためこれはできません。
- 球は、 Sphere オブジェクトタイプを用いて作成します。衝突では本来の球体に変換されるため、球のセグメント数を多くする必要はありません (8 が適切な値です)。ボックスと同様に、個々の頂点を移動してはいけません。
- 凸形オブジェクトは、完全に閉じた任意の 3D 形状です。例えば、ボックスも凸形オブジェクトになります。次図はどれが凸形であるかを示しています。


剛体の物理衝突
Novodex の PhysX の剛体物理エンジンの仕組みでは、接触が発生するフレームごとに 接触点 (contact points) を生成します。これはラインチェックよりも複雑なプロセスなので、実際の物理オブジェクト (ラグドールなど) が衝突するジオメトリを、速度と挙動の面で出来るだけ単純にとどめておくことが大切です。例えば、多数の小さな三角形があれば物理オブジェクトが 絡まって (snagged) しまい、処理に時間をとられます。 最初に、Physics アクタをブロックするアクタのbBlockRigidBody
フラグを True に設定する必要があります。静的メッシュとブロッキングボリュームではこれがデフォルト設定です。
UseSimpleRigidBodyCollision
が true の場合 (詳細は前述の Collosion モデルを を参照)、Collosion モデルを適用し、これを凸包のプリミティブセットに変換して接触点を生成します。 静的メッシュビューア? で [View] (表示) メニューから [View Collision] (衝突を表示)を選択すると、プリミティブの総数が分かります。この数が 10 より少ないのが理想的で、絶対に 100 以内に抑えてください。
Rigid-body アクタは三角形単位の BSP とテレインに衝突することから、BSP とテレインに特に小さな三角形が存在しないようにしてください。細かなディテールにはブロッキングボリューム/Collosion モデルを使用します。
剛体衝突のフィルタリング
剛体オブジェクトの衝突は、Component 内の RBChannel と RBCollidesWithChannel オプションを用いて制御できます。-
RBChannel
では、このオブジェクトが衝突の対象となるオブジェクトタイプを指定します。 -
RBCollidesWithChannel
では、このオブジェクトとの衝突を生成するオブジェクトのタイプを指定します。
サンプル
以下は、よくある衝突のシナリオにおける各種の衝突フラグの設定方法の例を示しています。物理シミュレーションに関して衝突チェックとフラグを正しく組み合わせられることが最終目標です。プレーヤーの動きと弾道
プレーヤーの適切な動きについては (具体的には、衝突シリンダを用いて Pawm (ポーン) の動きと他の Pawn との衝突を制御し、同時に運動ボーン (kinematic bones) を用いて正確な衝突検出を行う場合)、以下を検討してください。- Unreal 物理 (
PHYS_Walking
など) は、CollisionComponent だけを AABB (axis-aligned bounding box) から押し出します。=PHYS_Walking= が使用されているときに、SkeletalMeshComponent を CollisionComponent として用いるのは良いアイデアではありません。キャラクターの動きに伴って形が大きく変化するからです。 - ラインチェックは、アクタにアタッチされたすべての PrimitiveComponents (
CollideActors
とBlockZeroExtent
が TRUE に設定されているコンポーネント) に対して実行されます。 - PhysicsAssetInstance と運動ボーンについては、対ボーンのラインチェックを行う必要はありません。PhysicsAsset を割り当てて、=CollideActors= と
BlockZeroExtent
を TRUE に設定するだけで、ラインチェック結果が得られます (コンポーネントがアタッチされている場合)。 - RBChannel/RBCollideWithChannel は、物理エンジンの衝突にのみ影響します。プレーヤーが
PHYS_Walking
を使用している場合は影響しません。
CollideActors
と BlockZeroExtent
を TRUE に設定します。さらに、武器のトレースを干渉しないように、CylinderComponent で BlockZeroExtent
を FALSE に設定しておくのがよいでしょう。
ゲーム内の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
(ゲーム統計) どれだけ長い異なるタイプの衝突が生じているかについての様々な役に立つ統計値が表示されます。