元記事:
Dev-Ref-Release Notes-2.49-Game Engine - BlenderWiki
訳注:便宜上ページを分けています。
Bullet 物理エンジン
Bullet Physics SDK の更新
- 新しい汎用6自由度(DOF)の実行時に制限、駆動部、ばねを設定可能な Constraint。物理ベースの乗り物、フォークリフト、ロボット、ラグドールなどが可能になります。
- Rigidbody シミュレーション中の、移動・回転時の各軸のロックをサポート。1Dもしくは2Dの物理演算(テトリス・ブロックアウト)が簡単になります。物理タイプを Rigidbody にし、Advanced のポップアップを開きます。
- min/max linear velocity値を追加、オブジェクトの速すぎる動きによる不安定な物理演算を防止できます。また、Python からアクセスし、オブジェクトの現在の方向に加速もしくは加速度を減らすことができます。
- Dynamic と Rigidbody オブジェクトの Damp の式を改良、1.0でオブジェクトが全く動かなくなります。
- 通常どおり、古いファイルで少し違う結果になると予想されるでしょう。
物理演算の統合
オイラー角の反転が修正
- GameObject "mass" アトリビュートが書き込み可能に&setMass Actuator。
- Compound オブジェクトへの Parent と Parent 解除時に、Compound parent shape も動的に更新するように。
- 物理演算の記録時に軸が反転する問題がなくなりました。
Sensor オブジェクトタイプ
Near と Radar Sensor を汎用化した新しい Sensor オブジェクトで、static-static の 衝突判定機能があります。
高度な衝突判定を管理する新しいタイプ、 "Sensor" physics オブジェクトがゲームエンジンで利用可能になりました。Sensor
Near Sensor と Radar Sensor の基底をなす Physics オブジェクトと類似しているため、Sensor と呼ばれています。Near と Rader オブジェクトのように、以下の特徴があります。
- Static と Ghost
- デフォルトでは invisible(不可視)
- 確実に適切な衝突判定を探知するため、常にアクティブになっています
- Static と Dynamic オブジェクトの両方を探知する能力
- Parent オブジェクトとの衝突判定を無視
- Broadphase フィルタリングを以下を元に行う能力
[wiki]-Actor オプション:衝突判定を行うオブジェクトが探知されるためには、Actor フラグが設定されている必要があります。
-Property/Material: そのオブジェクトに添付されている物を、Collision Sensor で指定。Broadphase フィルタリングは、パフォーマンスの理由で重要です。Broadphase フィルタをパスしたオブジェクトのみを対象に衝突判定ポイントが 計算されるからです。[/wiki]
- アクティブな Collision Sensor がない時、自動的にシミュレーションから除去されます。
Near、Radar オブジェクトと違うのは以下の部分です。
- Triangle Mesh を含む、どんな形状も可。
- デバッグ用に可視化可能(単に Visible Actuator を使うだけ)
- 複数の Collision Sensor を持てる
そのほかにも、Sensor オブジェクトは普通のオブジェクトだということがあります。好きなように動かしたり、Parent できます。Dynamic オブジェクトへの Parent時、このオブジェクトに対し、詳細な衝突判定が設定できます。
衝突判定のタイプは形状に依存します。
- box、sphere、cylinder、cone、convex hull はボリュームとして探知します。
- triangle mesh はサーフェスとして探知しますが、Advanced Settings パネルから margin を増やすことで、ボリュームを少し与えることもできます。この margin は、表面の両サイドに適用できます。
パフォーマンスを向上にするには
- Sensor オブジェクトは、Near や Radar よりパフォーマンスが上です。これらはシーングラフの最適化により、同期化が少なくてすみ、(例えば違うプロパティでフィルタリングした)複数の Collision Sensorを持つことができるからです
- 複雑な形状より、できればシンプルな形状(Box、Sphere)の方が好ましいです。
- 常に Broadphase フィルタリングを使用しましょう(空の Property/Material を持つ Collision Sensor を回避します)。
- Collision Sensor は必要な時のみ使用しましょう。Sensor オブジェクト上にアクティブな Collision Sensor がない時は、シミュレーションから取り除かれ、CPU を消費しません。
既知の制限
- Blender が debug モードで動作している時、コンソールウィンドウに次のような Warning が1行表示されます。
"warning btCollisionDispatcher::needsCollision: static-static collision!"。リリースモードではこのメッセージはでません。
- Collision の margin は Sphere、Cone、Cylinder 上では効果がありません。
その他のパフォーマンスの向上
- Near と Radar オブジェクト、そしてその延長線上の Sensor オブジェクトの不必要な補間の削除
- 方向の同期化にクォータニオンの代わりに行列のダイレクトコピーを使用するように。
調節可能な Frame/Logic/Physics Rate
BGE: フレームレート(Frame Rate)、Logic Rate、物理演算レート(Physics Rate)、物理演算のサブレートをコントロールする GUI。
WorldButtons の4つの新しいボタンでフレームレートをコントロールします。
- fps: 秒毎のフレーム数で表現したフレームレートの目標値。
また、Physics タイムステップ = 1/fps で設定されます。
- phys: 実際の fps が目標値未満である場合のゲームフレーム毎の最大 Physics タイムステップ。これにより、ゲーム中の描画が遅くなっても物理演算をリアルタイムにキープできます。
- sub: Physics タイムステップ毎の、シミュレーションのサブステップの固定値。物理シミュレーションの精度を上げます。例えば、速く移動するオブジェクトに便利です。
- log: 実際の fps が目標値未満である場合のゲームフレーム毎の Logic ステップの最大数。これにより、Logic システムが物理シミュレーションに追従させることができます。
[wiki]-上限値 = phys(physより高い値を設定しても効果がありません)
-重い Logic システムのゲームの場合、この値を1にすることで、Logic の時間をコントロール下に置いておくことができて便利です。[/wiki]
これらの phys 以外の値はすべて Python からアクセスできます。
- GameLogic.getMaxPhysicsFrame(): レンダーフレーム毎の最大 Physics フレーム数を取得します。
- GameLogic.setMaxPhysicsFrame(phys): レンダーフレーム毎に実行される最大 Physics タイムステップ数を取得します。
[wiki]-高い値でゲーム中の描画が遅くなっても物理演算をリアルタイムにキープできます。
-Physics タイムステップは固定で、1/tickrate と同等です(setLogicTicRate を参照して下さい)。
-maxphysics/ticrate は、レンダラの物理演算が補正可能な最大ディレイです。
-phys: Integer[/wiki]
BlenderPlayer
BlenderPlayer の更新
- blenderplayer.exe -h の文章を更新。
- blenderplayer の引数(-c, -w, -f)の修正。
- Python が Text(Blend ファイル内部の Textブロック)をインポートできるように。3Dウィンドウでしか動作しませんでしたが、Player でも動作しませんでした。
- " - " の後の引数を無視するように(Blender でも同様。これにより、ゲーム中 Python で独自の引数を読み込ませることができます)
- blenderplayer の開始時に使用される引数を Python から sys.argv でアクセスできるように。
元記事:
Dev-Ref-Release Notes-2.49-Game Engine - BlenderWiki30 May 2009, at 09:20版を元にしています。