- 2007-11-25 (日) 13:29
- action script
物理エンジンライブラリ「Fisix」。今ちょっと触っているのですが、どうせ1ヶ月もすればスッパリ忘れてしまいそうなので、基本の基本からメモしておこうと思いました。
書いてる本人以外には分かりにくいと思います。
参考:
APIリファレンス
パッケージはswc化してるので、FlashCS3では遊べません。.swcを.zipにリネーム&解凍しても、そもそもFlash用コンポーネントではないので使えない様子。
FisixEngine クラスの setGravity(x方向, y方向) で全体の重力を決める。1秒でいくら動くかを設定するので、毎フレーム1px動かすときは 1 * stage.frameRate となる。
FisixiEngine クラスの継承元の FisixObject クラスのメソッド newSurface とか newCircleParticle とかでプリミティブを追加
上のnew[オブジェクト]メソッドによる生成方法の他にも、new FisixObject してモノをつくってから、エンジンに addObject することでも、図形の追加は可能。(via flashrodさん:http://d.hatena.ne.jp/flashrod/20061228)
各プリミティブの setVelocity(new Vector(x方向, y方向), あと謎の引数); でプリミティブごとの重力ベクトルを生成。その方向に勝手に進むように指定できる。
new Surface(始点のベクトル, 終点のベクトル, 太さ); において、太ければ太い程バグが起こりにくい。太さ1だと衝突検知時におかしくなるところ、10にすればキチンと動いた。なお、太さ設定はオプション、デフォルト値は1。
FisixEngine クラスのsetReactionModeメソッド。リファレンスでは引数はCollisionModesと書いてあるのに、チュートリアル見るとsetReactionMode(ReactionModes.PHYSICAL)みたく、ReactionModesクラスのプロパティを指定しているのは何故だろう?←APIリファレンス側がsetDetectionModeと誤表記してるっぽい。
エンジンを開始させる FisixEngine クラスのstartEngine(フレームレート); を発動させれば物理シミュレーション開始となるが、これを使わず mainLoop() を Event.ENTER_FRAME でも代用できる。mainLoop メソッドの引数はデフォルトで1だが大きすぎる。引数の原理は未確認。←たぶんsetGravityメソッドの引数とのバランスが大事。
エンジンやサーフェイス設定をした後で、setRenderGraphics(graphics); でthisのgraphicsに対して描画できる。例えば ground:Sprite に入れ子にしたいときは setRenderGraphics(ground.graphics);
setRenderGraphics()の後でFisixEngineインスタンスに対して新規でSurfaceを追加した場合、イメージ的には再度 setRenderGraphics(描画先グラフィック); を宣言しないとダメっぽいけど実は不要。
オブジェクトの削除はunload();で消せる!dispose();がどうも上手く動かなくてつまづいてた!
FisixObjectを継承した外部クラス内で図形を描画しておいて、それをメインクラス上でaddObjectするのが定石(via:モンスタートラックのTruckV2.as)
DetectionModes クラスでシミュレーションの度合いと処理速度の兼ね合いを調整できる。HYBRID_RAYCASTが中間ぐらいでバランスが良いのでオススメらしい。
タイヤはWheelParticle、ボディはCircleParticle(最軽量)の集合体で作る。
2個のパーティクル(例:ホイール)を単純に繋ぐだけならStickConstraint、サスペンションちっくにしたければSpringConstraint。繋げたものをaddConstraintして、setCenter(x,y)で配置場所を決定。(via: http://wiki.fisixengine.com/index.php?title=ConstraintsTutorial)
別体系のFisixEngineインスタンスを2個作って、両エンジンの支配下となるオブジェクトとかは作れない。例:_rootで両サイドに壁を作って、その中にSpriteを入れ子、その中でSpriteごと動く別体系のFisixEngine上にクルマを置くとかは無理っぽい。同一エンジンインスタンス上に置いてDynamicSurfaceで動く壁を作ることで対処した。
Constraints でモノを構造化するときは、リアルと同様、3点で支えないといけない。その際もSpringConstraint が柔らかすぎると、衝撃の反動で構造が崩れることがあるので、第3引数を下げすぎないことが重要。
要するに車でもイスでもとにかくオブジェクトを作りたいときは、CircleとWheelの各パーティクルを配置してConstraintsで繋ぐこと。その際、各円の中心間の距離を設定することになる。適当でも大丈夫みたいだけど、正確に座標を出した方が良さそう。前述の構造の崩れは、Circle半径を大きくすることでオブジェクト内の隙間に入り込まないようにすればOKかな。
FisixとMicrophoneの連動サンプル作ってるのだけど、FlexでMicrophone使うとブラウザプレビュー時にタブ閉じたらFF強制終了する。対処法としては一旦別サイトにページ更新してからタブ閉じてるのだけど面倒だなぁ。
- Newer: ロードした画像達をタイル上に並べる
- Older: Web Designing に記事書かせていただきました
Comments:0
Trackbacks:0
- Trackback URL for this entry
- http://www.trick7.com/blog/2007/11/25-132937.php/trackback
- Listed below are links to weblogs that reference
- Fisix をゼロから触る時のメモ from trick7