技術文章Game


・・・執筆中・・・

 

Box2D FAQ
author: Erin Catto
translated: Nobuhide Tsuda
27-Jul-2012

概要

本稿は Box2D FAQ (2012/07/27時点)の日本語訳である。

間違い・問題点があった場合は 津田(ntsuda@master.email.ne.jp)にメールしてくだされ。

Box2D とは何?(What is Box2D?)

Box2D は多機能の2次元固体物理エンジンです。Erin Catto により C++ で記述されています。 多くのゲームで使用されています。2008 Independant Game Festival で大賞を受けた「Crayon Physics Deluxe」も使用しています。

Box2D は zlib ライセンスを使用し、無償で使用することができます。 zlib ライセンスは帰属を要求しませんが、可能な時に、あなたは Box2D にクレジットを与える必要があります。

Box2D はどのプラットフォームをサポートしているの?
(What platforms does Box2D support?)

Box2D は Windows 上の Visual C++ により開発されました。Flash、Java、C#、Pyton に移植された版があります。

Erin Catto は C++ 版をメンテナンスしていますが、他の言語のサポートは提供していません。 他の言語版のサポートはコミュニティまたは(おそらく)移植者により行われています。

誰がそれを作ったの?(Who makes it?)

Erin Catto は、移植版のサポートをする人々とともに、Box2D の影の原動力です。 Box2D はオープンソースプロジェクトであり、コミュニティのフィードバックを受け付けます。

どうしたら助けてもらえるの?(How do I get help?)

あなたは、まず、ドキュメントとこのFAQを最後まで読む必要があります。 さらに、配布ソースに含まれるサンプルを学習する必要があります。 その後、フォーラムに行き、残った疑問について質問できます。
(訳注:ドキュメント・FAQをちゃんと読まずにフォーラムで質問するのは止めてね、ってこと)

Erin Catto にサポートを求めるPMやメールを送るのは止めてください。 議論により他の人も利益を得ることができるので、フォーラムで質問するのが最もよいことです。

ドキュメント(Documentation)

正式なドキュメントはどこ?
(Where is the official documentation?)

マニュアルは情報の最もよいソースですが、ドキュメントの多くのソースがあります。 マニュアルは配布物に含まれていますし、オンラインではhttp://box2d.org/documentation.htmlにあります。


何故機能が文書化されていないの?
(Why isn't feature foo documented?)

もしあなたが最新コードを SVN trunk(訳注:SVNはコード管理システムの一種)からゲットできれば、 マニュアルには文書化されていない機能を発見できるかもしれません。 新機能は、それらが成熟し、新しいポイントリリースが切迫した後に、マニュアルに追加されます。 しかしながら、Box2D に追加された全てのメジャーな機能は、機能テストと意図した使用を示すための testbed のサンプルコードにより付随されます。

必要条件(Prerequisites)

プログラミング(Programming)

Box2D を使う前に、C++ の実際上の知識を持っていなくてはいけません。 クラス、継承、そしてポインタの理解が必須です。 C++ を学習するためのリソースが web 上にはたくさんあります。 また、開発環境:コンパイラ、リンク、デバッグ、についても理解している必要があります。

数学と物理(Math and Physics)

固体、力、トルク、力積について基本知識を持っている必要があります。 もし、数学または物理の概念について理解してないかもしれないと思った場合、Wikipedia でそれらを調べてください。 もし、Box2D で使用されているアルゴリズムの深い知識が欲しければ、このページを訪れてください。

API

Box2D が使用する単位は何?(What units does Box2D use?)

Box2D は メートル・キログラム・秒(MSK)単位系にチューンされています。 オブジェクトの移動は、0.1~10メータの間にしてください。 単位にピクセルを使用しないこと!(そうすると)神経過敏なシミュレーションになってしまいます。

ピクセルをメートルに変換する方法(How do I convert pixels to meters?)

100x100ピクセルののキャラクタスプライトを想像してください。 あなたはスケールファクタとして0.01を使用することを決心します。 これはキャラクタの物理サイズが 1メートルx1メートルということになります。 そう、物理BOXのサイズを 1.0 x 1.0 にすることです。 次に、キャラクタが ピクセル座標 (345, 678) からスタートすると想像してください。 そう、物理Boxの位置は (3.54, 6.78) となります。 次に、物理世界をシミュレートします。 キャラクタの物理BOXが (2.31, 4.98) に移動すると想像すると、 キャラクタスプライトのピクセル座標値は (231, 498) となります。 今は、唯一のトリッキーな部分はスケールファクタを選択することです。 これは、あなたのゲームに依存します。 オブジェクトの移動範囲を0.1~10メートルに収め、1メートルがスイートスポットとなるように努めてください。

何故 C++ の荘厳な機能を使わないのか?
(Why don't you use this awesome C++ feature?)

Box2D はポータブルに設計されているので、C++ をシンプルに使い続けるよう努めました。 さらに、依存性を低くするため、STL(ただしソートは除く) や他のライブラリを使っていません。 テンプレートの使用を控え、ネームスペースも使っていません。 C++ に機能が存在するからそれらを使わねばならないということはないといことを覚えておいてください。
(訳注:C++ の高度な機能を無理して使わなくてもいいんだよ) Box2D の他の言語プラットフォームへの多くの移植が、この戦略が成功していることを示しています。

ビルド問題(Build Issues)

何故コンパイル and/or リンクできないのか?
(Why doesn't my code compile and/or link?)

ビルドが失敗する原因がたくさんあります。以下はそれらのいくつかです。

描画(Rendering)

Box2D の描画能力は?(What are Box2D's rendering capabilities?)

Box2D は単なる物理エンジンです。どう描画するかはあなた次第だお。

でも Testbed は描画してるじゃん(But the Testbed draws stuff)

可視化は衝突と物理演算のでバッキングにとても重要です。 わたしは、わたし自身による Box2D のテストを助けるためと、Box2D をいかに使うかのサンプルを示すために、Testbed を書きました。 TestBed は Box2D ライブラリの一部ではありません。

いかにして形状を描画するか(How do I draw shapes?)

形状描画はサポートされていませんし、形状の内部データ構造はおそらく変更されます。 代わりに、b2DebugDraw インタフェースをインプリメントしてください。

正確性(Accuracy)

Box2D はいくつかの理由で近似法を使用しています。

これは、束縛は完全に固体ではなく、復元が0であっても時にはバウンドすることもある、ということを意味します。 Box2D は束縛の近似解法に「ガウス‐ザイデル法」を使用します。 また、微分方程式の近似解法に「Semi-implicit Euler法」を使用します。 Box2D は、また、正確な衝突判定も行いません。 数値的な問題を回避するために、ポリゴンは細い(約0.5cm幅)スキンで覆われます。 これは、時々予測していない接触を誘発します。 さらに、いくつかの形状は重なったり、その結果、ソルバーにより部分的に押されたりするかもしれません。

ゲームを作る(Making Games)

ワームクローン(Worms Clones)

ワームクローンを作るには、任意に破壊可能な地勢が要求されます。 これは Box2D のスコープの範囲外なので、あなた自身でいかにこれを行うかを解決する必要があります。

タイルベース環境(Tile Based Environment)

多くの BOX を地勢として使用するのはきっとうまく行かないでしょう。 何故なら、矩形ライクなキャクターは内部コーナーにひっかかるからです。 Box2D の将来のアップデートでは、端チェインを超えるスムースな動きを許すはずです。 一般的に、矩形キャラクタの利用は控えるべきです。何故なら、衝突許容誤差は望ましくないひっかかりを引き起こすからです。 もっと情報が欲しいなら、このポストhttp://box2d.org/forum/viewtopic.php?f=3&t=3048を見てください。

小惑星タイプの座標系(Asteroid Type Coordinate Systems)

Box2D はいかなる座標フレームラッピングもサポートしていません。 あなたは、しばしばこの目的のために Box2D をカスタマイズしなくてはいけないかもしれません。 この仕事のために、異なった broad-phase の使用が必要となるかもしれません。

決定論(Determinism)

Box2D は決定論的か?(Is Box2D deterministic?)

同じ入力、そして同じバイナリに対して、Box2D は全てのシミュレーションを生成します。 Box2D は乱数もランダムなイベント(たとえばタイマー、etc)も利用しません。

しかしながら、人々は頻繁により厳重な決定性を要求します。 人々は頻繁に、Box2D が異なるバイナリ・異なるプラットフォームにおいて同一の結果を生成することが出来るか知りたがります。 この答えはノーです。 この答えの理由は、浮動小数点演算が多くのコンパイラ・プロセッサに実装されているからです。 もし興味があるのなら、この記事(http://www.yosefk.com/blog/consistency-how-to-defeat-the-purpose-of-ieee-floating-point.html)を読むことをお勧めします。

でも、ほんとに決定性が欲しい(But I really want determinism)

これは自然と固定小数点演算に導きます。 Box2D は固定小数点演算をサポートしていません。 過去には、Box2D は固定小数点演算の NDS に移植され、それは明らかに正しく動作しました。 固定小数点演算は低速で開発がよりたいくつなので、わたしは Box2D の開発に固定小数点演算を使用しないことを選択しました。

復元/摩擦の組み合わせは何故不正確なのか
(Why is the restitution/friction mixing inaccurate?)

物理的に正確な復元値は実験により計測するしかありません。 しかし、実験から幾何を変更するやいなや、値は不正確になります。 次に、同時の衝突を加えることは答えをより不正確にします。 これは以前に気が滅入ったことです。

そう、正確さの質問は答えられています:不成功

ただひとつ残った質問は、いかにそれを便利にするかということです。この意見は変化するかもしれません。

b2Settings がまさにそれです。もし何をしているかを知っているなら、設定で調整してください。

新規ユーザが犯す最も大きなミスは何?
(What are the biggest mistakes made by new users?)

  1. 長さの単位としてメートルではなくピクセルを使ってしまう
  2. Box2D が正確なピクセル値の結果を与えると期待してしまう
  3. 凹ポリゴンを生成するのに b2Polygon を使ってしまう
  4. 動作検証をリリースモードで行なってしまう
  5. C++ を学習せずに、Box2D を使ってしまう
  6. このFAQを読まない ( ̄ー ̄)ニヤリ