タイトルとは関係ないですが、物理オブジェクトを選択した時にも
プロパティを編集できるようにしたいと思うので、まずはコチラを片づけます。
コンストレイントを選択してプロパティビューを更新するというものを実装しているので
これを参考に対応します。
<半日実装>
対応しました。
質量、慣性、速度、ダンピング、サイズ、位置、回転など
オブジェクトに関わるほぼ全てのプロパティが編集できることを確認しました。
では本題の追加できるコンストレイントを増やす作業に入ります。
特に難しいことはなく、Point2Point コンストレイントの実装を真似して
作業を進めるだけで、Hinge コンストレイントの追加コマンドを実装できました。
現在は .kbl ファイルに HingeConstraint の情報を書き出せないので
少々面倒ですが、セーブ・ロードのコードを書いていきます。
デバッグ中…
はい、Hinge コンストレイントの書き出し、読み込みを確認しました。
プロパティは次のとおり↓
BulletSharp.Matrix AFrame
bool AngularOnly
BulletSharp.Matrix BFrame
bool EnableMotor
BulletSharp.Matrix FrameOffsetA
BulletSharp.Matrix FrameOffsetB
float LimitSign
float LowerLimit
float MaxMotorImpulse
float MotorTargetVelocity
int SolveLimit
float UpperLimit
bool UseFrameOffset
ちょっとハマってしまった(40分ほど)落とし穴がありました。
Hinge を作成する際、次のコードを実行しますが
ここで、渡すべき情報は AFrame, BFrame ではなく
FrameOffsetA, FrameOffsetB だったという罠。
続いて、Hinge プロパティを編集できるように機能追加を行います。
機能追加を行いました。
ヒンジの軸の向きを修正したり、制限角度を設定したり、トルクを与えたりと
基本的なヒンジコンストレイントの編集が行えることを確認しました。
引き続き、次の6自由度のコンストレイントの追加、編集、保存と復元機能を実装します。
参考に040話の btGeneric6DofConstraint のメモを一読します。
(調べたのが一年前ですから、もうすっかり忘れてしまっています。自分のことですが、まとめてくれていて本当に助かる。)
<実装>
うーん、6自由度コンストレイントの追加はできますが
コンストレイントの描画で苦しみます。…つまり何をどうすれば良いのか…
お?ひらめきました!
解決できたようです。
以下のコードで実現しました。(改めて見ると簡単ですね。)
では、一通りプロパティを編集できるようにしてみます。
<実装>
リニアスペースの軸方向の設定、回転制限や軸方向ごとのトルクなどを編集出来ることを確認しました。
1つずつコンストレイントの編集機能を付けたり、セーブ・ロードを書くとストレスが大きいので
ひとまずすべてのコンストレイントを追加する機能を埋めました。
現在次のコンストレイントを追加することができます。
残りの実装つらいよぅ…
まず、Point2Point, Hinge, Hinge2, D6, ConeTwist, Slider
のコンストレイントを設置できるようにしました。
すべてのコンストレイントの設置画像。
コンストレイントの表示だけの画像。
選択操作ができるので、それぞれのコンストレイントの編集機能を加えていきます。
<一日実装>
できました。
さて、今度は入出力ですね。
色々とパラメータが足りていませんが、全てのコンストレイントの保存、復元が出来るようになりました。
もう少し復元できるパラメータを増やします。
例えば 6自由度コンストレイントの場合は次のパラメータを復元できるようにします。
Slider コンストレイントなら次のパラメータです。
読み書きするだけなので、単純な作業です。
KimberliteBinary のフォーマットも次のように書き換わりました。
中段の大きなブロックが複数あると思いますが、これらがコンストレイント用のデータブロックです。
さっそく入出力テストを行なってみましょう。
Point2Point, Hinge, D6, ConeTwist, Hinge2, Slider のコンストレイントのプロパティの
保存、復元が確認できました。
簡単な実装ですが 3,4時間ほど作業して、ノーエラービルド、動作確認でバグ無しを確認すると結構嬉しいですね。
はい、ということで今回の「様々なコンストレイントの編集機能」のお話のノルマは達成しました。
次回は、動作テストを行う予定です。
(この辺から見ている方が楽しくなってくるはず…)
お楽しみに!
2012/10/27 初記。
2012/11/17 更新。