09、Xファイル出力

**グレーの囲いの中のソースには全角スペースが含まれています。ご注意ください。




Xファイル出力機能が付きました。
スキンメッシュのマルチレイヤーのXファイルを出力できます。

ただし、いくつか注意点があります。

1、DirectXのバージョン
RokDeBone2の出力するXファイルはDirectX9.0c用のものです。
古いSDKのMView.exeを使うか、もしくはサンプルのSkinnedMeshのコードと同じように読み込んで再生してください。
新しいSDKのXViewerでは表示が崩れます。
新しいSDKでもSkinnedMeshサンプルではうまくいきます。
噂に聞いたところではXViewerは1つのパーツに複数マテリアルを使うと表示が崩れたり、モーションの操作も足りないそうです。


2、ボーンの有無
Xファイル自体はボーンのないファイルも可能なのですが
OpenRDBではボーンの無いXファイルには対応していません。
Xファイル出力する前にボーンを入れてください。


3、影響度の問題
1つのボーンの影響も受けていない頂点が存在すると、Xファイル出力したときに不正なファイルになり読み込めなくなります。
このような頂点がある場合はmqo読み込み後のdbg.txtに記述されます。


4、名前の問題
RokDeBone2ではパーツやボーンに同じ名前のものがあってもエラーになりませんが
Xファイル出力する場合には不具合の原因になります。
名前がかぶらないようにリネームしてください。
ボーン名には自動的に末尾に「_Joint」と付加されますので
表示パーツと同名のボーン名があっても大丈夫です。
また、名前にすべて日本語名を使用している場合は心配する必要はありません。
日本語名は自動的にアルファベットの固有の名前に変換して出力するようになっています。
ですがテクスチャファイル名は日本語は不可です。
テクスチャファイル名に日本語を使った場合は不正なXファイルになります。

###### 2012/02/26プログラム修正
マウス操作をメタセコイアライクに修正しました。
右ドラッグでカメラ回転。
中ドラッグでカメラ移動。
左ドラッグでIK
になりました。

###### 2012/02/26 13:10頃 プログラム修正
最小化ボタンを押したときにパネルも非表示にしました。
最小化から復帰時にパネルが復活します。
最大化ボタンを押したときにウインドウパネルがメインウインドウの上に来るようにしました。
パネルが邪魔な時は最小化してください。最小化しないまま他のアプリを選択するとパネルが残ります(仕様)
ファイル選択ダイアログが出る前にパネルを一時的に非表示にしました。

###### 2012/02/26 20:40頃 プログラム修正
ジョイントをダブルクリックしてからドラッグするとカメラが回転してしまう不具合を修正。
各パネルのcloseボタンを2回押さないと閉じられない不具合を修正。
地面の格子オブジェクトを追加。「表示」メニューで非表示にできます。

###### 2012/02/28 7:20頃 プログラム修正
ライトのスライダーを動かそうとすると、デバイス設定のダイアログが出てくる不具合を修正。

###### 2012/03/01 8:35頃 プログラム修正
メインウインドウに「選択部を注視点にする」チェックボックスを追加しました。
  チェックを入れると選択ボーンが注視点となり視点回転の中心となります。
Shiftキーを押している間はマニピュレータを表示しないようにしました。
  Shiftを押している間はマニピュレータのリングとのあたり判定も発生しません。

###### 2012/03/01 11:35頃 プログラム修正
一番親のボーンもマニピュレータのリングで回転できるようにしました。

###### 2012/03/01 17:40頃 プログラム修正
qubファイル保存時(プロジェクトの保存で自動的に保存されるモーションファイル)に
ボーンの総数情報に誤情報が記述され不正なファイルになることがあるバグを修正。
複数キャラクターを読み込むと、ボーンのコンボボックスが正しくなくなるバグを修正。

###### 2012/03/03 4:05頃 プログラム修正
カメラのマウスドラッグによる回転速度をアップしました。
カメラのマウスによる仰ぎ角の動作を逆にしました。

###### 2012/03/03 20:10頃 プログラム修正
初期状態でツールパネルの削除を押すとエラーになるバグを修正。
メタセコイアで材質を割り当てていない面が存在してもエラーにならないように修正。
ボーンなしデータを読むとエラーになっていたのを修正。


ソースは下のページからダウンロードしてください。
OpenRDBダウンロードページ




09−01、OpenRDB方式とSkinnedMesh方式の違いとつじつま合わせ

ボーンの位置を原点に持ってくる変換をoff
その逆変換をinvoff
回転変換をR
移動変換をT
とします。

そして親の変換には語尾に_parを付けます。

このときOpenRDBでの変換の仕方は

off * R * T * invoff * off_par * R_par * T_par * ...(一番親までさかのぼる)


で表せます。

ところがDirectX標準のSkinnedMeshの方式はちょっと違います。

off * R * T * R_par * T_par * ... (一番親までさかのぼる)


のようになります。

これじゃあやり方が違ってXファイルに出力できないんじゃないかと思うかもしれませんが
ひと工夫することで簡単につじつまを合わせられます。

OpenRDBでのTの部分の出力を

T' = T * invoff * off_par

とすることでOpenRDB方式は

off * R * T' * R_par * T'_par ... 

と書けるようになります。

つまり移動変換の値をちょっと工夫して出力すれば
SkinnedMeshと同じ仕組みのモーションを出力することが出来るのです。

あとはそれほど問題にならないでしょう。
OpenRDBのXファイル出力のファイルはXFile.hとXFile.cppです。

オープンソースのトップに戻る

トップページに戻る