切り替え時に指定するキーが必要なので、それぞれに適当なキーを決めておきます。]]>で、コードにてウィンドウのロード時にこれらメニューのリソースを取得します。あとは使いたいタイミングでアクセスするだけ。この書き方なら右クリックでメニューを表示させずに済みます。(右クリック時に隠すという、前回の急場しのぎのコードは不要となったので消しました。押した結果を次に示します。メニューが表示されることを確認しました。3Dカーソルを移動できるようにします。タブを追加しこのタブでツールのプロパティを編集できるようにしました。動作を確認、今後も何かツール独自のプロパティを編集したい時はこのタブに追加する予定です。後は簡単なロジックを組む作業です。<作業>動作確認できました。クラスのディープコピーは特殊なコードを書かない限り起こらないはずでは?そう習ったのだけど...クラスを別の変数に格納して、それを弄った場合と、大元のクラスを弄った場合とで動作が変わった。自分の理解が足りていないということでごめんなさい。新しいデータフォーマットを定義します。パックして、追加データを加えるというものです。<考え中>はい、定義しました。(頭痛くなるまで考えたけど、きっと不備があり、後で手直しすることになるだろう。)紫色の剛体情報がバカみたいに多いです。(そんなところまで調整するのかよ...と思いながら策定しました。パックせず、パスで参照するようにしています。例によってツッコミどころが満載なので詳細は載せません。データの書き込みクラスと読み込みクラスを作ります。<作業>ひとまず、ヘッダーブロックとフッターブロックを読み書きできるようにしました。動作を確認これから、残りのブロックの処理をひたすら書き続けます。(単なる作業なので、正直つらいです。)<丸二日間コーディング>なんとか組みあがりました。フォーマットは大幅に変わりました(笑)さっそく動作確認をしてみましょう。ファイルを出力します。読み込むと次のとおり。正しく読み込み、表示ができているようです。コンストレイントを配置します。↓の図はピック機能で遊んでいる瞬間です。触っていてアンドゥ・リドゥ機能が無いと大変不便であることに気付きました。(この確認が終わったら、機能追加する予定です。ファイル(.kbl)を保存し、情報をクリアします。ファイルを読み込みます。しますね...読み込み成功を確認!よっしゃー!やった!2日間の苦労(苦痛と言ってもいい)が報われた瞬間でした。作成コードを次に示します。すべてのデータを書き出しているので、一時停止したその瞬間から再生できる状態でロードが完了します。]]>コメントアウトしている情報は書きだしたはいいけど、読み取り専用で外から設定できない情報です。コンストレイントについて情報を復元する際にちょっと手を入れてあげる必要がありました。オブジェクトとオブジェクトを結びつけるのがコンストレイントなので復元したオブジェクトのどれとどれを?と判別方法を確立する必要があります。プロパティにユニークな名前を入れて、この名前を使って判別するようにしました。ユニークな名前は適当に決めて良いので、16文字のランダムな文字列を作成する機構を用意して対応しました。セーブとロードで余分に情報が必要になったという話です。対応中にまた一つ仕事が増えてしまいました。できる操作が少ない今のうちにコマンドパターンを入れて、アンドゥ・リドゥを片づけましょう。パターンですか...しばらく前に触れましたね。同じ所まで来ましたね。書くとコマンド、コマンドバインディングが連想されます。作らないほうが良さそう、後々自分で混乱してしまいそうです。コマンドのインタフェースと履歴管理クラスを作成しました。コンストレイントの追加処理をコマンドクラスとして用意し、テストしてみます。<試験>アンドゥができるので、間違えて追加したコンストレイントを削除してやり直しができます。ストレスなく、すべての積み木を数珠つなぎできました。コンストレイントの追加がアンドゥ・リドゥできることを確認しました。厳密には選択状態もアンドゥ・リドゥできないとコンストレイントのリドゥが正確に再現できません。作業負荷は大きくありません。<追記>選択処理もアンドゥ・リドゥ出来るようにしました。ついでに選択の中でもアクティブなオブジェクトをオレンジ色で表示するよう修正しました。コンストレイントの編集機能を実装したいと思います。追加した後の調整と言った方が表現として合っていると思います。場合は次のパラメータが編集可能です。PivotInAPivotInBDampingImpulseClampTauどのコンストレイントを編集するのか決めるためまずはコンストレイントの選択機能を付けようと思います。書き出し、読み込みを行えません。...衝突判定だけが目的のオブジェクトのために重力などの剛体シミュレーションに時間を割くのも良くないので、衝突オブジェクトも書き出し、読み込みできるようにします。<実装>これまでの剛体の情報設定、取得の部分に手を加えて剛体と衝突オブジェクトで分岐することで特に難しいことなく実装できました。レイキャストで選択できるが、他の剛体に影響を及ぼさないセンサオブジェクトも必要です。登録時にグループとマスクのビットフラグを指定することで実現できます。衝突グループの設定(フィルタリング)より)大きいキューブが剛体、小さいオブジェクトが衝突オブジェクトです。センサオブジェクトとして、他の剛体に影響を及ぼさないことも確認しました。参考に、フラグ設定は次のコードで行います。登録後、このフラグ情報を取り出す方法を探していますが、不明です。コチラから設定する情報なので困りはしないと思いますが、実装時には注意が必要です。物理ベース情報にも、剛体か衝突オブジェクトかの情報を付加します。センサオブジェクトを作れるようになるので、コンストレイントを描画している所にこのセンサオブジェクトを配置し、選択操作できるようにするという魂胆です。<実装>うまくいったようです。実際はセンサオブジェクトを非表示にしますが、デバッグ用に表示しています。選択したオブジェクトからコンストレイントを取得出来るようにして後はプロパティグリッドに、選択したコンストレイントのプロパティを表示出来るようにすれば今回の目標はクリアです。<実装>気になって仕方がないので、先に片付けます。次のコンストレイントに対してセンサオブジェクトを配置するなら...こう↑ですね。はい、ということでプロパティグリッドの更新処理に手を加えて選択したコンストレイントのプロパティを表示するようにしました。(選択カラーは青白く光る感じにしています。プロパティだけ表示しています。用のプロパティに書き換えます。<作業>はい、書き換えました。コンストレイントのプロパティを編集できることを確認しました。編集した結果が即時反映されることも確認できました。あとは、これを保存して再度読み込む事ができることを確認するだけです。いうことで今回のお話のノルマ達成〜。前回の自分のクレームに対応するのがそこそこしんどかったです。オマケ破壊衝突閾値...というものを低めに設定してみました。強めに引っ張るとプッツリと切れてしまいました。戻ってしまうことを確認。編集できないようです。操作したかったのですが...残念。いうパラメータも編集できるようにしましたがこれらが動作にどう影響を及ぼすかは、ドキュメントが無いことにはわかりません。公式の解説ページを参照しましたが資料なし、元々物理には詳しくないので、必要に迫られたら詳しく調べる予定。Web拍手レス>物理演算ライブラリ群のbulletの日本語解説サイトとして機能するのはおそらくこのサイトのみでは?今後も期待です。メッセージありがとうございます。ついて不明な点を調べると過去に自分が書いたページだった、なんてことが多々あります。お役に立ててうれしいです。サンプルプロジェクトは次のリンク先の「Download」ボタンから入手できます。-わかりづらいかもしれないので、参考画像も示しておきます。