コリジョン形状(3D)

このガイドでは以下の事を説明します:

  • Godotの3Dで使用できるコリジョン形状です。

  • 凸形状または凹形状のメッシュをコリジョン形状として使用します。

  • パフォーマンスを考慮した3Dコリジョン形状です。

Godotはさまざまな種類の衝突形状を提供しており、それぞれにパフォーマンスと精度のトレードオフがあります。

You can define the shape of a PhysicsBody3D by adding one or more CollisionShape3Ds as direct child nodes. Indirect child nodes (i.e. children of child nodes) will be ignored and won't be used as collision shapes. Also, note that you must add a Shape3D resource to collision shape nodes in the Inspector dock.

注釈

1つの PhysicsBody 複数のコリジョン形状を追加すると、それらが重なることを心配せずに済みます。それらは互いに "衝突" しません。

プリミティブコリジョン形状

Godotは、以下のプリミティブコリジョン形状を提供します:

ほとんどの小さなオブジェクトの衝突は、1つまたは複数の基本的な形状を使用して表現できます。しかし、大型の船やレベル全体のような複雑なオブジェクトの場合は、代わりに凸形状や凹形状を使用する必要があるかもしれません。詳細は以下で説明します。

動的オブジェクト、たとえばRigidBody や CharacterBodyの場合は、基本的な形状を使用することをお勧めします。これは挙動が最も安定しているためです。これらの形状はパフォーマンスが優れている場合が多いです。

凸形状コリジョン形状

凸形状コリジョン形状 は、プリミティブコリジョン形状と凹型コリジョン形状の折衷的な選択肢です。これらはどんな複雑な形状でも表現できますが、重要な制約があります。その名前が示すように、個々の形状は 凸型 の形状しか表現できません。例えば、ピラミッドは 凸型 ですが、中が空洞の箱は 凹型 です。1つのコリジョン形状で凹型オブジェクトを定義するには、凹型コリジョン形状を使用する必要があります。

オブジェクトの複雑さによっては、凹型コリジョン形状を使用する代わりに、複数の凸型形状を使用することでパフォーマンスが向上する場合があります。Godotでは、 凸形状分解 を使用して、中が空洞のオブジェクトに大まかに一致する凸型形状を生成できます。ただし、凸型形状の数が一定量を超えると、このパフォーマンスの利点は失われます。レベル全体のような大きく複雑なオブジェクトの場合は、凹型形状を使用することを推奨します。

エディターでは、MeshInstance3D を選択し、3Dビューポートの上部にある Mesh メニューを使用して、1つまたは複数の凸形状のコリジョン形状を生成できます。エディターは以下の2つの生成モードを提供しています:

  • Create Single Convex Collision Sibling は Quickhull アルゴリズムを使用します。このモードでは、自動生成された凸型の衝突形状を持つ 1 つの CollisionShape ノードを作成します。単一の形状のみを生成するため、パフォーマンスが良好で、小さなオブジェクトに最適です。

  • Create Multiple Convex Collision Siblings は V-HACD アルゴリズムを使用します。このモードでは複数の CollisionShape ノードを作成し、それぞれが凸型の形状を持ちます。複数の形状を生成するため、精度が向上し、特に凹型オブジェクトに適していますが、パフォーマンスのコストが伴います。中程度の複雑さを持つオブジェクトでは、1つの凹型コリジョン形状を使用するよりも高速である可能性が高いです。

凹形状または三角形メッシュのコリジョン形状

凹形状コリジョン形状 、または三角メッシュコリジョン形状は、少数の三角形から数千の三角形まで、あらゆる形状を表現できます。凹形状は、Godotにおいて最も正確で、最も処理速度が遅いオプションです。 凹形状は StaticBody 内でのみ使用可能です 。CharacterBodyやRigidBodyでは動作しません。ただし、RigidBodyが Static モードに設定されている場合は例外的に動作します。

注釈

凹形状は最も正確な 衝突 を提供しますが、接触報告の精度はプリミティブ形状よりも低い場合があります。

レベルデザインにGridMapを使用しない場合、凹形状がレベルの衝突判定に最適なアプローチです。ただし、レベルに小さな詳細部分が含まれている場合、それらを衝突処理から除外するとパフォーマンスやゲームの操作感が向上することがあります。そのためには、3D モデラーで簡略化されたコリジョンメッシュを作成し、Godot にそれを基に衝突形状を自動生成させる方法があります。詳細については以下をご覧ください

注意点として、プリミティブ形状や凸型形状とは異なり、凹型衝突形状には実際の "体積" が存在しません。そのため、オブジェクトを形状の 外側 だけでなく、 内側 にも配置することが可能です。

エディターで凹型の衝突形状を生成するには、MeshInstance3Dを選択し、3Dビューポート上部にある Mesh メニューを使用します。エディターには次の2つのオプションが用意されています:

  • Create Trimesh Static Body は便利なオプションです。この機能は、メッシュの形状に一致する凹型のコリジョン形状を持つ StaticBody を作成します。

  • Create Trimesh Collision Sibling は、メッシュの形状に一致する凹型のコリジョン形状を持つ CollisionShape ノードを作成します。

参考

3Dシーンのインポート では、モデルをGodot用にエクスポートし、インポート時に自動的に衝突形状を生成する方法について説明しています。詳細についてはこちらを参照してください。

パフォーマンス注意点

PhysicsBody につき衝突形状は1つに限定されません。それでも形状の数をできるだけ少なく保つことをお勧めします。これはパフォーマンス向上のためで、特にRigidBodyやCharacterBodyのような動的オブジェクトでは重要です。さらに、物理エンジンの内部最適化を活用するために、CollisionShape の移動、回転、スケーリングを避けるべきです。

単一の非変形コリジョン形状を StaticBody で使用する場合、エンジンの broad phase アルゴリズムは非アクティブな PhysicsBody を除外できます。その結果、 narrow phase ではアクティブなボディの形状のみを考慮すればよくなります。しかし、StaticBody に多くの衝突形状がある場合、broad phaseは失敗します。より遅いnarrow phaseがそれぞれの形状に対して衝突チェックを行うことになります。

パフォーマンスの問題に直面した場合、精度に関して妥協を行う必要があるかもしれません。ほとんどのゲームでは、衝突判定が100%正確であることはありません。代わりにクリエイティブな方法でそれを隠したり、通常のゲームプレイ中に目立たなくさせたりしています。