Doc:JA/2.6/Manual/Game Engine/Physics/Object Type/Occluder

提供: wiki
< Doc:JA‎ | 2.6‎ | Manual‎ | Game Engine‎ | Physics‎ | Object Type
移動先: 案内検索


Page status (reviewing guidelines)

Copy This page is a copy of the same page in 2.4 manual, need to be updated
Proposed fixes: none

Occluder

選択的オクルージョン(occlusion=ふさぐ)とは、オブジェクト(オクルーダー)が他のオブジェクトを隠す(GPUに送らないようにする)能力のことです。実装はtree selectionと同じです。

オクルージョンはデフォルトでは有効になっていません。これを有益に使うためにはよく理解する必要があるからです。適切に使用されない場合、ゲームがスローダウンすることがあります(ただしそれほど多大にではありませんが。処理に使う時間は自動的に調整されます)。

動作の仕組み

オクルージョンはすくなくとも一つのオクルーダーが存在する場合に起動します。オクルーダーの設定はphysicsパネルにあります。

オクルーダーはネットワークベースのオブジェクトのみに使われなくてはいけません。これは物理計算に関する限り、衝突計算をしないということと同じです。オクルーダーモードが他の物理モードと相互排他的である理由は、オクルーダーはそれ専用にデザインされるべきで、すべてのメッシュをオクルーダーにするべきではない、ということを強調するためです。しかしながら、Pythonとロジックブリックを使って、他の物理オブジェクトにオクルーダーの機能を与えることも可能です。これについては後で触れます。

オクルーダーオブジェクトが視野錐台に入ってくると、ゲームエンジンはそのオブジェクトの面からZデプスバッファを作成します。面が片面表示か両面表示かは重要です。表側が見えている面および両面表示になっている面だけがZデプスバッファの作成に使われます。複数のオクルーダーが視野錐台内にあるときは、ゲームエンジンはそれらを結合して最も手前にある面を残します。

Zデプスバッファの解像度はWorld設定の"Occlu Res"ボタンでコントロールできます。

デフォルトでは、解像度はビューの最も長い辺に対して128ピクセル、他の辺に対しては長さに応じて設定されます。128というのは非常に低い解像度ですが、カリング(描画から除外すること)のためには十分です。解像度は1024まで上げられますが、CPUの使用も増大します。

ゲームエンジンはDBVTツリーを走査して、個々のノードが完全にオクルーダーに隠されるかをチェックします。隠される場合は、そのノード(およびそれが内包するすべてのオブジェクト)を消去します。

更なる最適化のため、ゲームエンジンはすくなくとも一つのオクルーダーが視野錐台にあるときのみ、Zデプスバッファを作成、使用します。それ以外の場合はオクルージョンを使わない場合と比べてパフォーマンスの低下はありません。

使い方

オクルージョンカリングを使うのが有益でない場合もあります:

  • オクルーダーが小さく、多くのオブジェクトを隠さない場合。
    この場合、オクルージョンカリングはCPUを遅くするだけです。
  • オクルーダーが大きいが、隠されるオブジェクトがシンプルな場合。
    この場合、オブジェクトをGPUに送ってしまったほうが良いでしょう。
  • オクルーダーが大きく、多数の複雑なオブジェクトを隠すが、それが非常に予想しやすい状況の場合。
    たとえば、複雑なオブジェクトがたくさん詰まった家などです。ここでオクルージョンカリングを使ってもうまく働きますが、特定のロジックを作って表示・非表示を切り替えたほうがもっとパフォーマンスはあがります。たとえば、カメラが屋内にあるときだけ表示されるようにオブジェクトを設定するなど。

オクルージョンカリングが最も意義を持つのは、オクルーダーが大きく(ビルや山など)、多数の複雑なオブジェクトを隠し、それが結果を予想しにくい状況である場合です。しかしながら、パフォーマンスをそれほど気にし過ぎなくても良いです。適切でない使い方をしたとしても、パフォーマンスの低下はある程度に抑えられるアルゴリズムになっています。

オクルーダーは視覚的に描画されるオブジェクトであってもかまいませんが、面が多すぎるとZデプスバッファの作成に時間がかかるので注意してください。たとえば、地表はオクルーダーの候補としてはあまり良くありません。面や重なっている部分が多すぎます。オクルーダーをシンプルかつ透明(invisible)にして、複雑なオブジェクトの内部に配置することもできます(たとえば複雑な建物の壁の内側に沿って)。オクルーダーに穴をもたせて、そこからオブジェクトが見えるようにすることもできます。

複雑な地形からオクルーダーを作るときにありうる手順を以下に示します。

  • 地形を複製して、低ポリゴンに作り直す。
  • 水平になっているパーツをすべて削除して、急勾配な部分だけを残す。
  • すべての面を透明にして、オクルーダーモードをセットする。

さらに最適化するため、オクルーダーをいくつかのオブジェクトに分割して(個々の山や壁からそれぞれオクルーダーを作る)、地表と同じ作業をします。このようにすると、オクルーダーに隠された地形がレンダリングされなくなります。

ワイヤーフレームモードでゲームを実行すると、オクルージョンが動作していることを確認できます。

ゲーム内でのコントロール

Pythonを使って、オブジェクトのオクルージョン能力を有効/無効にできます。

obj.occlusion = True
obj.setOcclusion(True, False)    #param1=occlusion, param2=recurse in children

オブジェクトは必ずしもGUI上でオクルーダーとして設定されていなくてもかまいません。どのようなメッシュでも、staticオブジェクトでもdynamicオブジェクトでも、オクルージョン能力を有効にできます。

Visibilityアクチュエータを使うこともできます:

Dev-GameEngine-occlusion-brick.png


アクチュエータのレイアウトが変わったので注意してください。排他選択のVisibleボタンとInvisibleボタンは、別々の機能に関する二つのオン・オフボタンに置き換えられました(Visible/InvisibleとOccluding/Non-occluding)。

アクチュエータを使う場合は、VisibilityとOcclusion両方の設定(有効/無効)を指示したことになってしまいます。個別に設定する場合はPythonを使ってください。

既知の制限

  • オクルージョンカリングを使う場合、ゲームが始まった時点ですくなくとも一つのオクルーダーが存在していなくてはいけません。オクルーダーはアクティブなレイヤーにある必要はありません。その後は、どのメッシュオブジェクトに対してもオクルージョンの有効・無効をゲーム内で設定できます。