2011年12月6日火曜日

ブログを移転しました

真に勝手ながら、この度ブログ及びホームページを移転することになりました。
引越し先はコチラです

今までこのブログを見てくださってありがとうございます。

2011年11月15日火曜日

GTAIVのモデルとテクスチャをGTAViewerで読み込んでみた【一通り終了】

今回は前回途中まで読み込んでたwdrフォーマットをちゃんと読み込んでみました。以下のが前回までの状態です。

前回までは「法線データが壊れる」、「UV座標が壊れる」等の不具合があり(法線の長さが0 or 全て同じ方向を向いてる、UV座標の値が非数値 等等)、参考にしてるサイトにも詳しく記載されておらず、ここ数日困っていました。

ところが先日、より詳しく記載しているサイトを発見してしまいました。頂点データが壊れる場合の対処法の他、wtdフォーマットの読み込み方等とても役に立つ情報が満載なサイトです。おまけにサンプルコード付き!

おかげで頂点データも正しく読めるようになり、テクスチャの構造も理解することが出来ました。

というわけで、頂点読み込み修正+テクスチャ付きスネークがコチラです↓




 前回と比べ物にならない位うまく出来ました。髪のテクスチャが若干おかしいですけど・・・。

wdr内にはマテリアルの記述がなく、代わりにシェーダーに関する記述があります(というよりシェーダーがマテリアル扱いになってる)。DiffuseやらAmbientやらSpecularやらの記述が全くないので、おそらく指定先のシェーダーでそういうものがあらかじめ設定されてるんでしょうね。シェーダーの記述部分は必要なデータは「テクスチャ名」、「適用シェーダー名」くらいです。

「シェーダーで髪を綺麗に見せるような描画処理をしていて、実は何もしないとこうなっちゃうよ?」なのか、「単純に主のコーディングがおかしいんじゃないの?」のどちらなんでしょうかね?まぁどちらだったとしても、綺麗に描画できるようにインデックスいじったりシェーダー書いたりして、結局自分のコードをいじることになるんですけど。

ゲーム画面だと髪、綺麗ですね・・・

他の既存ツールでの描画結果を確認したいんですけど、GTA4のゲームデータがないと使えないものが多いです(SparkIVやOpenIV)。以前紹介したWDRViewerはテクスチャ読み込めないので確認が出来ません・・・。

とりあえずこれ以上踏み込むにはGTA4のPC版ゲームディスクを手に入れる必要があるようです。まぁ持ってませんし今後買うかは未定なので、GTA4を手に入れるまでこれは保留にしておこうと思います。

ちなみに、このスネーク以外のスキンMOD・武器MODはうまく読み込めました。でもGTA4用のスキンMODをあまり持ってないのでテスト回数が少ない、という不安要素はあります。
AK-47


スナイパーライフル

ロケットランチャー(RPG)

wdrフォーマットが読み込めるようになったおかげでwddフォーマットも読み込めるようになってます。wddフォーマットの中身は単純で圧縮したwdrデータの塊でした。

WDD変換された霧雨魔理沙

これでwftフォーマットさえ読み込めればボーンデータも揃うんですけど・・・コチラはやっぱりフォーマット仕様がわかんないので今は無理そうです。

とりあえずGTA4は今回で一区切り打って、次回からまたGTASAに戻ろうと思います。

2011年11月12日土曜日

GTAIVのモデルフォーマットをGTAViewerで読み込んでみた【テストプログラミング】

最近GTA4にMOD導入したものをよく見ようになったのでちょいとやってみました。今回読み込んだものは以下のモデル。

メタルギアシリーズの「スネーク」です。コチラのサイトで紹介されてます。

調べてみたところ、GTA4ではメッシュモデルにdffフォーマットを採用してないようで、新たに「wdr」、「wdd」、「wtd」、「wad」、「wft」等の新たなフォーマットが採用されてるようです。

.wdr・・・武器モデル、人体モデルの部品(顔等) 前作までのdffフォーマットに該当
.wdd・・・pedデータ 前作までのdffフォーマットに該当
.wtd・・・テクスチャデータ 前作までのtxdフォーマットに該当
.wad・・・アニメーションデータ 前作までのifpフォーマットに該当
.wft・・・車データ
※間違ってるかもしれません

今回はフォーマット仕様が公開されてたwdrフォーマットを読み込んでみました。

頂点バッファ・インデックスバッファさえあれば取り合えず形にはなるのでその二つだけ読み込んで描画してみました。結果はコチラ↓

とりあえずうまくいきました。フォーマット公開サイト以外にも「WDR Analyze」というアプリケーションも参考にしています。フォルダ内に.jarファイルがあったので、解凍してclassファイルを逆コンパイルしてソースコードを引っ張り出してきました。おかげで作業がはかどりました(ただこのアプリケーション、不具合があります)。

幾つかのモデルで試してみましたが、読み込みに失敗するモデルもあるようです。まだまだ改良が必要なようです。

ちなみに「WDR Viewer」という既存のツールがあるようです。コチラは特に不具合はないようです。

次はマテリアル、テクスチャも読み込むつもりです。が、wtdフォーマットに関しては無理そうです。まだ仕様が公開されてないフォーマットが幾つかあり、wtdフォーマットはその一つです。ZLib形式で圧縮してるらしく、前半部分の記述がwdrフォーマットと同様なのはわかってるんですけどね。

未知のバイナリフォーマットを解読するスキルが備わってればよかったんですけど・・・私にはそんなスキル備わってません。

まぁ今は他にやることがあるので実装はもう少し先になりそうです。

2011年11月5日土曜日

アニメーション付きColladaフォーマット出力完成

前回の続き。ようやく完成しました。

失敗してた原因ですが、前回の記事で「キーフレーム変換行列の回転部分におかしなところがある」というように書きましたが案の定。クォータニオン→オイラー角を取り出す処理に問題がありました。

以下のコードはCollada内のフレーム行列に関する記述の一部です
<node id="センター" type="JOINT">
  <translate sid="location">0.000000 6.681501 0.000000</translate>
  <rotate sid="rotateZ">0.000000 0.000000 1.000000 0.000000</rotate>
  <rotate sid="rotateY">0.000000 1.000000 0.000000 0.000000</rotate>
  <rotate sid="rotateX">1.000000 0.000000 0.000000 0.000000</rotate>
  <scale sid="scale">1.000000 1.000000 1.000000</scale>
  <node id="センター先" type="JOINT">
    <translate sid="location">0.000000 -6.474001 0.000000</translate>
    <rotate sid="rotateZ">0.000000 0.000000 1.000000 0.000000</rotate>
    <rotate sid="rotateY">0.000000 1.000000 0.000000 0.000000</rotate>
    <rotate sid="rotateX">1.000000 0.000000 0.000000 0.000000</rotate>
    <scale sid="scale">1.000000 1.000000 1.000000</scale>
  </node>
</node>

「translate」がローカル座標の値で左から順にX・Y・Z、「rotate」がローカル軸回転の値で左から順にX軸・Y軸・Z軸・角度(デグリー角)となっています。

次のコードはアニメーションの記述の一部です。
<!-- X軸回転 -->
<animation id="センター_RotationX">
  <source id="センター_input">
    <float_array id="センター_input-array" count="2">0.000000 89.500000</float_array>
    <technique_common>
      <accessor source="センター_input-array" count="2" stride="1">
        <param name="TIME" type="float" />
      </accessor>
    </technique_common>
  </source>
  <source id="センター_output">
    <float_array id="センター_output-array" count="32">0 90</float_array>
      <technique_common>
        <accessor source="#センター_output-array" count="2" stride="1">
          <param name="ANGLE" type="float" />
        </accessor>
      </technique_common>
    </source>
    <source id="センター_INTERPOLATION">
      <Name_array id="センター_INTERPOLATION-array" count="2">LINEAR LINEAR</Name_array>
      <technique_common>
        <accessor source="#センター_INTERPOLATION-array" count="2" stride="1">
          <param name="INTERPOLATION" type="Name" />
        </accessor>
      </technique_common>
    </source>
    <sampler id="センター_sampler">
      <input semantic="INPUT" source="#センター_intput" />
      <input semantic="OUTPUT" source="#センター_output" />
      <input semantic="INTERPOLATION" source="#センター_INTERPOLATION" />
    </sampler>
    <channel source="#センター_sampler" target="センター/rotateX.ANGLE" />
</animation>

<!-- 平行移動 -->
<animation id="センター_Location">
  <source id="センター_input">
    <float_array id="センター_input-array" count="2">0.000000 89.500000</float_array>
    <technique_common>
      <accessor source="センター_input-array" count="2" stride="1">
        <param name="TIME" type="float" />
      </accessor>
    </technique_common>
  </source>
  <source id="センター_output">
    <float_array id="センター_output-array" count="6">0.000000 6.681501 0.000000 0.000000 6.681501 10.000000</float_array>
      <technique_common>
        <accessor source="#センター_output-array" count="2" stride="3">
          <param name="X" type="float" />
          <param name="Y" type="float" />
          <param name="Z" type="float" />
        </accessor>
      </technique_common>
    </source>
    <source id="センター_INTERPOLATION">
      <Name_array id="センター_INTERPOLATION-array" count="2">LINEAR LINEAR</Name_array>
      <technique_common>
        <accessor source="#センター_INTERPOLATION-array" count="2" stride="1">
          <param name="INTERPOLATION" type="Name" />
        </accessor>
      </technique_common>
    </source>
    <sampler id="センター_sampler">
      <input semantic="INPUT" source="#センター_intput" />
      <input semantic="OUTPUT" source="#センター_output" />
      <input semantic="INTERPOLATION" source="#センター_INTERPOLATION" />
    </sampler>
    <channel source="#センター_sampler" target="センター/location" />
</animation>

フレーム宣言部のlocationとrotateの値をここで変更しています。
Colladaはクォータニオンをそのまま使うことが出来ないようで、rotateタグを使う必要があります。ボーン行列の回転量をクォータニオンで所持してるので、クォータニオンからX・Y・Z軸それぞれの回転量を取り出す必要となったわけです。

そこでひと通りのクォータニオン→軸回転抽出について色々調べてみました。が、全てうまくいきませんでした。今回参考にした計算式を幾つか書いておきます。

①回転量がθ、回転軸をX・Y・Zを表す
クォータニオン(w, x, y, z) = (cosθ/2, Xsinθ/2, Ysinθ/2, Zsinθ/2)

これはもう見たまんまですね。XNAで実際に計算するとこうなります。
Quaternion qt; // 既に値が設定されてるものとする
Vector3 angle = Vector3.Zero;

angle.Z = MathHelper.ToDegrees((float)Math.Asin(qt.Z) * 2.0f);
angle.Y = MathHelper.ToDegrees((float)Math.Asin(qt.Y) * 2.0f);
angle.X = MathHelper.ToDegrees((float)Math.Asin(qt.X) * 2.0f);
この方法を試してみたところ、回転軸が複数個混じってるものは正常な回転量が取り出せないようです。単一軸回転のものは正しい回転量が抽出できます。

②回転行列RがXYZ順で合成した回転行列の場合
回転量Z = atan2(R12, R11)
回転量Y = -asin(R13)
回転量X = asin(R23 / cos(回転量Y)) ※ R33が負数の場合、回転量X = 180 - 回転量X

これをXNAで計算するとこうなります。
Quaternion qt; // 既に値が設定されてるものとする
Matrix rotate = Matrix.CreateFromQuaternion(qt); // 行列化
Vector3 angle = Vector3.Zero;

angle.Z = MathHelper.ToDegrees(
    (float)Math.Atan2(rotate.M12, rotate.M11));

float radianY = -(float)Math.Asin(rotate.M13);
angle.Y = MathHelper.ToDegrees(radianY);

float cosY = (float)Math.Cos(radianY);
angle.X = MathHelper.ToDegrees(
    (float)Math.Asin(rotate.M23) / cosY);

if(rotate.M33 < 0)
  angle.X = 180 - angle.X;
これは回転行列の合成順によって使用する値が異なりますが、計算式は変わりません(全6パターン)。詳しく知りたい方はコチラを参照してください。

YawPitchRollなので合成順はYXZ。XNAは右手系なので合成順を入れ替えて回転行列の合成順をZXYとして計算してみました。

が、コチラもうまくいきませんでいた。Z・Y・Z軸単体回転のモーションをそれぞれ作りテストしてみたのですが、X軸回転だけうまくいきません。念のため6パターン全てのやり方で計算してみましたが、やはり一つの軸だけ正常な値が取り出せませんでした。上記の計算式には条件が足りないのでしょうか?

というわけでクォータニオンからの角度抽出がうまくいかずここ数日悩んでたんですが、先日あることを思い出しました。

そうだ!MATRIXタグ使ってアニメーションすればいいんじゃないかな?と。

むしろ今まで何故気付かなかったのかが今となっては謎ですが、「location」「rotate」「scale」タグを「matrix」タグに書き換えて出力しました。
<node id="センター" type="JOINT">
  <matrix sid="transform">1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 6.681501 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 1.000000</matrix>
  <node id="センター先" type="JOINT">
    <matrix sid="transform">1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 -6.474001 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 1.000000</matrix>
  </node> 
<animation id="センター_PoseMatrix">
  <source id="センター_input">
    <float_array id="センター_input-array" count="2">0.000000 0.333333</float_array>
    <technique_common>
      <accessor source="#センター_input-array" count="2" stride="1">
        <param name="TIME" type="float" />
      </accessor>
    </technique_common>
  </source>
  <source id="センター_output">
    <float_array id="センター_output-array" count="32">1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 6.681501 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 0.000000 6.681501 0.000000 0.000000 1.000000 -25.750000 0.000000 0.000000 0.000000 1.000000</float_array>
    <technique_common>
      <accessor source="#センター_output-array" count="2" stride="16">
        <param name="TRANSFORM" type="float4x4" />
      </accessor>
    </technique_common>
  </source>
  <source id="センター_INTERPOLATION">
    <Name_array id="センター_INTERPOLATION-array" count="2">LINEAR LINEAR</Name_array>
    <technique_common>
      <accessor source="センター_INTERPOLATION-array" count="2" stride="1">
        <param name="INTERPOLATION" type="Name" />
      </accessor>
    </technique_common>
  </source>
  <sampler id="センター_sampler">
    <input semantic="INPUT" source="#センター_input" />
    <input semantic="OUTPUT" source="#センター_output" />
    <input semantic="INTERPOLATION" source="#センター_INTERPOLATION" />
  </sampler>
  <channel source="#センター_sampler" target="センター/transform" />
</animation>

平行移動・スケール・回転を一つにまとめたのでコード量も少なくなりました。スッキリしていいですね。

Blender2.6で出力したデータを読み込んでみました。

以前までのものは読み込んでも型崩れを起こしてたんですが、今回の更新でそれもなくなりました。Papervision3Dでも動作確認済みです。ようやくうまくいきました。

さて、Collada出力が完成したので以前から言ってた通りGTAViewerを更新します。前身のPMDForColladaもクォータニオン→角度抽出処理をしてるので、コチラも再度更新しておきますね。

※追記
GTAViewer、及びPMDForColladaを更新しました。

※Colladaで行列を扱う場合の注意点
以前AndroidでColladaスキンメッシュアニメーションをやった時にも少し触れてたのですが(少し的外れだったけど)、Colladaの行列は「縦行列」のようです(値が行順ではなく列順)。なので出力する際にボーンのローカル行列を転置行列に変換する必要があります(Transpose)。これ、やってるとやってないじゃ大違いです。ツールによって規模が異なりますが、大抵型崩れを起こします。ちなみにBlenderだとこうなります。

もはや原型すらありません。自前でCollada入出力をする方がいらっしゃるなら、行列には注意しましょう。アニメーションでも、シーンでも、ジョイントでも、行列を扱う場合は必ず転置行列化するように!

2011年10月30日日曜日

GTAViewerでアニメーション付きColladaフォーマット出力テストプログラミング

BlenderのVMDインポーターが思ったほどうまくいかないので息抜きにやってみました。アニメーション以外の出力は既に出来てるのでアニメーション部分だけ以前作った『PMDForCollada』のものを流用して組んでみました。

結果はこのようになりました。Papervision3Dで表示しました。
Papervision3Dでアニメーション其の3・4

回転で一部おかしなところがあります。アニメーションを付属してないデータは正常に描画されるので、キーフレーム変換行列の回転部分におかしなところがあるようです。

MMD→DAE変換を試したところうまくいきました。何でGTAだと失敗するんでしょうね?

まぁ、Blenderのスクリプトも含めぼちぼちとやっていこうと思います。

2011年10月27日木曜日

Blender2.6用VMDインポーター作成中・・・

ひと通り形になったので記事にしてみました。

Blender2.5版は作らない予定です。というのも、2.6からBlenderの日本語化が出来るようになり、いま組んでるスクリプトは日本語化していることが前提となるからです。

調べてみましたが 、公式で日本語化に対応したのはBlender2.6RCからみたいです。

今の方法だと2.5では導入できないので、おかしな動作が起きてもそれがスクリプトのバグなのかBlender2.6の不具合なのかがわからないのがネックです。

何故ネックなのかというと、以下のような現象が起こったからです。実際に見てもらいたいと思います。

まずはZ軸回転モーションをMMDとBlender2.6で読み込み比較したものです。

次にX軸回転モーションをMMDとBlender2.6で読み込み比較したものです。

膝がおかしいのはIKの使用の違いからくるものなので気にしないで下さい。それ以外はX・Z軸回転はMMDと同じ動作をしています。ところがY軸回転だとこのようになってしまいます。

何故このようになるのかがよくわかりません。Blender側で同じような回転を手動で行って回転角度を出力したところ、Y軸の角度は対して変わっておらずX軸の角度が大きく変貌してました。

X軸角度とY軸角度を入れ替えると、MMDと同じように回転するモーションもあればそうでないモーションもありチンプンカンプンです。

クォータニオン回転・オイラー角回転の両方で試してみましたが結果は同じでした。

これはBlender2.6の不具合なんでしょうか?それとも只私が 仕様を誤認識して起きたスクリプトの不具合なのでしょうか?よくわからないです。

2.5版でも導入できたら確認しやすかったんですけどね・・・まぁこのスクリプトは元々作る予定のなかった、オマケみたいなようなものなのでゆっくりと作っていくつもりです。

もう一度既存のスクリプトやドキュメントに目を通してみようかな?

2011年10月25日火曜日

Blender2.54~2.60対応PMDインポーター更新&リリース②

少々早すぎますが、一応日付は変わったので更新しちゃいました。
昨日言っていた通り、膝ボーンの回転制限及びボーンの移動・拡大のロック処理をBlender2.54~2.60のスクリプト全てに追加しました。

Blender2.49のスクリプトもIKの再帰回数・ウェイトを新たに反映させて更新しました。コチラは膝ボーンの処理・ロックの処理は追加してません(やり方がわからん・・・)。

※注意
今回から膝ボーンの処理を追加したため、スクリプト内で"ひざ"という文字列をutf-8形式で記入してます。万が一ですが、この文字列のせいでスクリプトが認識されない場合があるかもしれません。もしそうなった場合はスクリプトファイルを「utf-8」の文字コードで上書き保存するか、もしくは"ひざ"と書かれてある部分を「utf-8」に文字コード変換して上書き保存してください。

utf-8文字コードで開いた場合、このようになります。

s-jis文字コードで開いた場合、このようになります。

追記
VMDインポーター作成中!

2011年10月24日月曜日

Blender2.54~2.60対応PMDインポーター更新&リリース①

MikuMikuDanceのモデルフォーマットであるPMDファイルをBlender2.60で読み込むスクリプトをリリースしました。

今回の更新でようやくボーンウェイトを反映した状態で読み込めるようになりました。穏当に長くなってしまいましたが、ようやく実装することが出来ました。

また、今回の更新にあわせて前バージョンのBlender2.5(2.54~2.59まで)のPMDインポーターを全て更新しました。全てのバージョンでボーンウェイトを適用状態で読み込めるようになりました。

Blender2.49用PMDインポーターも元々ボーンウェイト反映は出来てましたが、ボーンが見づらいので若干の修正をしてます。

ブログを初め、このスクリプトを開発してからもうすぐ1年、ようやく完成させることが出来ました。長々と引っ張ってしまい真に申し訳ありませんでした。

スクリプトの詳細はZE10の開発倉庫から、ダウンロードは開発作品倉庫(SkyDrive)からお願いします。

追記
平行移動のロック、膝ボーンの回転角度制限を入れておくのを忘れてました。
修正できたのでまた明日更新しようと思います。

2011年10月23日日曜日

Blender2.60対応メタセコイアインポーター/エクスポーターリリース

先日Blender2.60が正式にリリースされました。なんでも最新安定板とのこと。
ということで、早速メタセコイア入出力スクリプトを2.60版に更新しました。

なお、この最新版は2.59版でも使うことは出来ますが、2.59版メタセコイア入出力スクリプトは2.60へそのまま移植しても動作しないので必ず更新するようお願いします。

Windows XPでしか動作確認をしてませんが、基本的に以前のものと変わってないのでMacOS、Linuxでも動作可能です。本当はUbuntuで動作確認したかったんですが、11.10に更新したら動かなくなっちゃいました。

※注意点
機能は前バージョンと変わっていませんが、一つだけ修正点があります。
以下の画像を御覧下さい。

前バージョンまでと同じやり方で読み込んだ結果です。よくわかりませんが、今回のBlenderではライティングが暗くなるようです。これは私のスクリプトだけでなくほかのインポーターにも同様の現象が見られます。前回までがライティングが正しく作動してなかったのでしょうか?詳しいことは良くわかりません。

とりあえず前作と同じような描画結果にすべく、今回からシェードを切る処理を追加しました。

Materialクラスのuse_shaderess(赤丸で囲った部分)にチェックを入れるようにしてます。これで前回までの描画結果と同じようになります。ライティングをかけた状態にしたい場合はここのチェックを切るようにお願いします。

pmdインポーターは前回から余り進歩してません。どうしても頂点ウェイトグループの設定がうまくいかないんです・・・これさえ終われば完成なんですけどね。中途半端でもいいという方がいればアップロードするのでおっしゃって下さい。今の状態でも形状とボーンの読み込みは出来るので、読み込んだ後に手動で頂点グループ設定さえすれば使えるかと思います。

Blender2.60の記事はココから
Blender2.60のダウンロードはココから
スクリプトの詳細説明はココから
スクリプトのダウンロードはココから

2011年10月21日金曜日

ブログタイトル変更しました

ブログの名前を「開発白書(ダイアリー)」から「研究記録(レコーダー)」に改めました。今回で2度目のタイトル変更となります。

元々「開発日誌(ダイアリー)」という名前でしたが他のブログと被ってたため変更しました。現在の更新状況を考えると「日誌」には程ほど遠いので結果的によかったと思ってます。

まぁ今回タイトル名変えたのも特に深い理由はありません。単純に私が「白書」というものを理解しておらず、「ダイアリー」では意味が通らないだろうと今頃になって考えた結果こうなりました。

というわけで、今回から『とあるPGの研究記録(レコーダー)』として運営していくのでよろしくお願いします。

追記
Blender2.60がリリースされたようです。これにあわせてスクリプトも更新しておこうと思います。

GTAViewer Xファイルの読み書き修正

結構前になりますが、「GTAViewerでXファイル出力」の続編です。
開発始めてもう4ヶ月経ってますね・・・月日の流れは早いもんだ。

イキナリですが、GTAViewerはDFFフォーマット以外のデータも読み書きが出来ます。全てライブラリ等を使わず自前で読み書きしてるわけですが、このXファイル読み込み(書き込みは自前)だけは内部でインポート用スクリプトを起動させて読み込んでます。

まぁ言ってもこのスクリプトも自作です。
XNAでXファイルを読み込むためにはあらかじめコンテンツパイプラインを経由させる必要があるので、ビルド後だと読み込めません。プログラム起動後にコンテンツパイプラインを動かす方法もあるんですけど難しすぎたのでやめました。

スクリプトはC++とDirectXで組んでて、処理の内容は以下のような流れになっています。

実行元がスクリプトに読込先ファイルのパスを渡す

D3DXLoadMeshHierarchyFromXでスキンメッシュ付きXファイルを読み込む

メッシュ内から頂点バッファ・インデックスバッファ等の必要なデータを抽出

自作フォーマット形式で出力 出力先をスクリプト実行元に知らせる

このようになってます。本当はスクリプトを経由させず自前のインポーターを作りたかったんですが、フォーマットの自由度が高すぎるXファイルで、全てのパターンに合致するようなインポーターを作るには時間が今以上に掛かりそうだったのでこのような形式をとりました。Xファイルが廃れていく理由もこの辺にあるのではないでしょうかね?

さて、実は前回Xファイル書き込みが失敗した理由はこのスクリプトに原因がありました。DirectXでスキンアニメーションする場合、描画を効率良くする為にサブセット化という処理が施されます。主にマテリアルやメッシュオブジェクト毎にグループが作成されます。この時、ボーンもグループ内のメッシュに影響を与えているものだけがそのグループへと割り当てられます。ボーン使用制限数以上のボーンを持つモデルもこのサブセット化をすることで使用個数の制限内に抑えられるというわけです。

このサブセット化をすると、ボーンコンビネーションというデータが作られます。
typedef struct _D3DXBONECOMBINATION {
    DWORD AttribId; //属性テーブルの識別子 マテリアルの参照番号
    DWORD FaceStart; // 開始面 グループ内の最初の面の参照番号
    DWORD FaceCount; // 面の数 グループ内の面の数
    DWORD VertexStart; // 開始頂点 グループ内の最初の頂点の参照番号
    DWORD VertexCount; // 頂点の数 グループ内の頂点の数
    DWORD *BoneId; // ボーンの参照番号配列 一度に描画できるボーンを識別する値の配列
} D3DXBONECOMBINATION, *LPD3DXBONECOMBINATION;
これで分割後の頂点やボーンにアクセス出来るんですけど・・・私は何故かマテリアルはこれを使ってるのにもかかわらず、ボーンや頂点はボーンコンビネーションを無視して読み込んでました。複数個グループがあっても最初のグループのデータだけでボーンや頂点の参照先を決めるという失敗して当たり前の処理を今まで気付かず行ってました。

この部分を修正することで、Xファイルの読み書きがほぼ完成しました。ただ出力が若干安定しないようです。

以下の動画はGTAViewerでdffモデルと、dffをXファイルに変換して再度読み込んだモデルを比較したものです。正面から見て右がdffフォーマット、左がXファイルフォーマットです。

動きも合致、特におかしなところは見当たらず完璧に出力しているように見えますよね?ところがこれをC++とDirectXで読み込むとこのようになります。

一見正常に動いてるように見えますが、時たま足や腕が変な方向へ曲がるのが確認できるかと思います。特にCJの荒ぶりかたがひどいです。

最後に、XNAでコンテンツパイプラインを経由させて描画したものです。ひにけにXNAさんのアニメーションライブラリを使ってます。コチラはかなりひどいことになってます。

DirectX・XNAでなぜここまでの差が出るのかは良くわかりません。DirectX付属のソフト「DxViewer」があればよかったんですが、新しいDirectX入れたときに古いDirectX消したら一緒に消えちゃいました。そして何故か新たなDirectXにはDxViewerが付属されてない始末。

このように使用するツールやアプリケーションによって書き込んだモデルが正常な形状を維持できてない場合があります。他に確認できるツールがあればいいんですけど、複数モーション対応のXファイルインポータが付属してるツールって意外とないんですよね。

Blender→初期インポート・アドオン等なし 誰か作ってないかな?
RokDeBone2→形状のみ読み込み可能
Softimage Mod Tool→複数個のアニメーションは非対応 プラグインないのかな?
Softimage→持ってないから知らない Mod Toolと同じ?
MAYA→持ってないから知らない
3dsMax→持ってないから知らない
LightWave3D→持ってないから知らない
Metasequoia→プラグインありそうだけどライセンスがない あるとしてもKeynote?

とりあえずSoftimage Mod Toolで確認する作業になりそうです。Xファイル読み込みは完璧そうです。

読み書き機能はこのあとXファイル出力→アニメーション付きCollada出力→PMD出力→DFF出力の順でやろうかと考えてます。余裕があればtxd出力、ifp出力、vmd出力、bvh出力もやろうかと思ってます。

あと前回の記事で動画投稿をすると書きましたが 、一応Xファイル出力とアニメーション付きCollada出力が出来た辺りで紹介PVを作ろうと考えてます。が、長引きそうな場合は動画を先に作っちゃいます。

追記
出力したファイルをSoftimage Mod Toolで読み込んでみました。

DirectXの描画結果に近いものになりました。
ちなみに、Softimageで再変換したXファイルをGTAViewerで読み込むとこうなります。

これはひどい!

2011年10月11日火曜日

GTAViewer ロースペック版 Ver1.0.0.2 リリース +α

先日リリースしたGTAViewer Trial Ver1.0.0.5の主な機能を追加したロースペック版をリリースしました。

動画・連番BMP出力・画像表示の際にテクスチャがおかしくなるバグを修正してます。その他はトライアル版の更新内容と同じです。

また、トライアル版の前回のバグを修正した1.0.0.5αをリリースしてます。モーションが時間が経つごとにずれていくバグを修正してます。



ライトパネルも若干変更を加えてます。

2011年10月9日日曜日

GTAViewerトライアル版 Ver1005 リリース

1ヶ月ぶりの更新となりました。内容は以下のとおりです

・ライティング
今回からモデルフォーマットごとにライティング計算を独立させてました。現在MMDのライティングだけ独立してます。その他のフォーマットは共通の計算です。

・MMDライティング
MMD基準のライティングに修正しました。トゥーンマップ・スフィアマップに対応してます。

・モーション補間
新たにベジェ曲線補間に対応しました。が、どうやら動画・連番BMPで出力した時にタイミングがずれるようです。これは次回までに修正しておきます。修正できたので次回では直ってます。

修正前のSweetMagic


修正後のSweetMagic


・その他の機能
ファイルをドラッグ&ドロップすることで読み取れるようにしました。

前回更新予告で紹介した新機能
・動画出力の規制
・動画/連番BMP出力時のテクスチャバグ
・ライティング切り替え
・レンダリングの修正
・マテリアルパネル
・テクスチャ(ロースペック版のみ)

詳しくはGTAViewer更新予告の記事を参照してください。

今回はトライアル版のみです。ロースペック版の更新はしばしお待ち下さい。
今回は紹介用動画も投稿するのでよければソチラも御覧下さい。

最後に、更新がかなり遅くなってしまい大変申し訳ありませんでした。

2011年10月4日火曜日

GTAViewerのライティング計算について

トライアル版の計算式をMMD基準に変更してみました。

以前と比べてMMDの描画結果に近くなりました。シェーディング部分がまだ若干違うので要修正です。

ただ今度はGTA組が暗くなってしまいました。

モデルフォーマット毎にライティング計算を区別する必要がありそうです。まぁそのほうがMMDのトゥーンテクスチャやスフィアマップテクスチャも導入しやすくなるので結果オーらいです。

ちなみにGTAスキンはライティング計算をOFFにすれば以前と同じ描画結果が得られるようです。

まずはGTA(DFF)フォーマット、MMD(PMD)フォーマット、Xファイル毎にシェーディング処理を新たに追加しようと思います。前回の記事で発見したバグも修正したのでひとまずこの処理を加え次第更新しようと思います。

2011年10月3日月曜日

GTAViewer更新予告

GTAViewerのトアイアル版及びロースペック版を近々更新する予定です。本当は前日までに更新する予定だったのですが、ギリギリで新たなバグを発見してしまい更新が伸びてしまいました。

以下は更新内容です。

・動画出力の規制
出力するファイルサイズが2GB(2,147,483,648Byte)を超える場合、ファイルを分割して出力するように修正してます。以前のバージョンだとサイズオーバーした動画は再生することが出来ませんでした。

・動画/連番BMP出力時のテクスチャバグ
コメントでご報告していただいたバグです。動画や連番BMPを出力する際にモデルのテクスチャがおかしくなるというものでした。コチラも現存確認しているモデルでのみ修正しています。他のモデルでバグが再発する可能性があるので完全に修正できたわけではありません。

・ライティング切り替え
ライティング(ライトと法線の計算で掛かる陰影処理)の反映の切り替えをモデル毎にON/OFF出来るようにしました。デフォルトではライティング計算するようにしています。


・レンダリングの修正
新たに描画状態『背』を追加。背景画像のON/OFFを出来るようにしました。また、モデルでテクスチャを使ってるモデルの頂点色が無視されるバグを修正してます。


・マテリアルパネル
新たにマテリアル情報を表示するパネルを追加しました。ここで値を修正することでマテリアル値を変更できるようにさせる予定です。

・テクスチャ(ロースペック版のみ)
2の階乗のサイズでないテクスチャもモデルに反映できるようにしてみました。が、一部のモデルではうまくいかないことがあります。うまくいかない場合は素直に画像のサイズを2の階乗に修正してください。

以上です。
バグの修正自体は余り時間は掛かりそうにないですのですぐ更新できます。
あとそろそろアニメーションのベジェ曲線補間を導入しておこうと思います。

2011年9月12日月曜日

PMX読み込み始めました!

DFFやXファイル→MMDへの変換を考えた場合、ボーンインディセスが3つ以上になるとPMDへの変換がうまくいかないことを考慮してPMXの読み込み機能を付加することにしました。

仕様がわからなかったので色々調べてみたんですけど、PMDEditorのフォルダ内にフォーマットについての文書がありました。結構近くにあるものです。

ひと通り目を通してみましたが、若干PMDと仕様・構造が違うようですね。
PMXの方がDFF←→MMDの相互変換が安定しそうなので、読み込み&書き込みまで実装する予定です。

2011年9月7日水曜日

GTAViewerトライアル版 Ver1004に更新

前回の更新から大分時間が経ったので新たなバージョンをリリースしました。
本当はちょこちょこと更新したほうがいいんでしょうけど・・・普通はどうなんでしょうかね?

ちなみに今回の更新内容は細かい機能が追加されただけなので動画にはしません。大きな更新をしたら新たに動画を作って投稿する予定です。

更新内容
・メタセコイアフォーマット書き出し(.mqo)
MQOファイルを出力できます。Keynoteには対応してません。
アニメーションで変形した状態で出力することも可能です。

・MikuMikuDanceフォーマット書き出し(.pmdのみ)
pmdフォーマットが出力可能です。表情、IK、表示・枠名リスト、拡張部分は未対応です。Tailボーン番号がおかしくなる可能性があります。まだまだ修正が必要です。

・オブジェクトの表示切替
ツリー画面からオブジェクト・ジオメトリ・マテリアル毎で表示切替が出来るようになってます。切り替えたい名前のところで右クリックするとメニューが開きます。

・ライティング
MMDに合わせてライティング計算を変更しましたが、まだ修正が必要です。
任意でライトの向き・明るさが変更できるようになりました。円の中でマウスをドラッグさせるとライトの向きが変わります。最大2つのライトが設定可能です。

・描画メニュー
描画状態切り替えを細かくしました。

・動画出力の修正
画像サイズを変更した際にアスペクト比がデフォルトのままになってたのでアスペクト比も変わるように修正しました。また、AVI出力でフレーム数が約2400フレーム以上になると出力に失敗することがわかりました。これは次回の更新までに分割して出力するように修正しておきます。

同封のReadmeにも記述してるので目を通してみてください。
ダウンロードはいつものところからどうぞ
開発作品倉庫

2011年9月1日木曜日

GTAViewerエフェクト未使用版リリース

タイトルの通りです。シェーダーを使わないバージョンを新たにリリースしました。

基本的な性能はロースペック版と同じです。頂点ブレンドをCPU側で行うことで最大65536個までのボーンを一度に描画することが出来ます。ボーン数だけで言えばハイスペック向けのトライアル版より上回っていますが、PCによっては処理が重くなります。

ちなみにシェーダーを使わないようにした結果、武器エフェクトが消えています。また、他のバージョンと比べてライティング結果が違いますのでご注意下さい。

なお、今回のバージョンでもXNAの性質上オンボードでは動作しない可能性があります。ご了承下さい。

今回は同時にロースペック版も更新しました。複数のバグを修正しています。 このバグ修正はロースペック版/エフェクト未使用版だけのバグで、エフェクト未使用版のほうでも修正を施しています。

トライアル版の更新はまだ掛かりそうです。

最後にトライアル版と比較。スカートがあらぶってた現象が消えてます。ライティングの違いもわかると思います。

GTAViewer 現在の開発状況③α【GTA→PMD変換】

まだまだやっつけですが、GTAフォーマットをPMDフォーマットに変換することが出来ました。


IK・表情は付けてません。VMD出力もまだ出来ません。一応、形状だけまともに変換できるようになってます。

問題点
・GTAのボーンとMMDのボーンの構造が違う
これが意外と厄介な問題ですね。下図を見てもらうとわかりますが、現状態はボーンの向きが逆さになってます。修正の必要有です。



・ボーンブレンディング数が3本以上の場合、2本以下まで制限する必要がある
PMXフォーマットで出力できれば問題解決ですが、あいにくPMXフォーマットの構造を知らないのでパスです。影響度が一番小さいものを消すくらいしか良さそうな案が思いつきません。

・暗い
GTAフォーマットはアンビエントがないので暗いです。GTAViewer側でマテリアルを操作できるようにする必要があります。

まぁ今回、やっつけにもかかわらずちゃんと出力&MMDで読み込めたので結構満足だったりする。問題点を改良してまともな処理が出来るように頑張ろう!

2011年8月30日火曜日

GTAViewer 現在の開発状況③

シンプルにまとめてみた!
前回の更新から新たに追加・修正したもの

・ライト操作















・アニメーション操作を修正中






・メタセコイアフォーマット書き出し





















これからの予定
・ライティング計算の修正
・BVHモーションのモデル反映
・モーション付きCollada フォーマット出力
・MMDフォーマット出力
・MMD読み込みの完全対応

幾つか実装できたら更新版をリリースします。

追記:
動画内でスカートがあらぶってる理由がわかりました。ボーンが256本を越えていたのが原因だったようです。ボーンのインデックスはByte型(8bit符号無し)で扱っているので、0~255の数までしか扱うことが出来ません。従って256→0、257→1という風に扱われてしまいます。大きなサイズの型に変えたくてもボーンインディセスにはByte型しかあてらうことが出来ないみたいです。

コレの解決方法としましては、「複数のボーングループを作って段階を分けて描画する」というものが望ましいと思います。一度の描画で扱えるボーンは256本までなので、例えばボーン数が300本ある場合は256本、48本と2つのグループに分けて2段階で描画します。

まぁ実際にコレをやるにはボーンインディセスの関係上簡単にグループ分け出来ないのですが有効な手段はおそらくコレしかないでしょう。ロースペック版も1度に60本までしか描画できないので同じ手法をとることによってアニメーションを実現させようと思います。コレがうまくいけばAndroidでもアニメーションが実現できるでしょう。

しかし、まさかボーン数が256本以上のモデルを作る方がいるとは思いませんでした。

以前作ってたXNAのPMDインポートプラグインでも再生してみました。
ボーンが256本を越えてるのでモデルを変えてやってみました。コチラはベジェ曲線補間してるので曲と動きのタイミングはバッチリです。

2011年8月27日土曜日

Blender2.59対応メタセコイアインポーター/エクスポーターリリース

前回の記事からかなり時間が経ってしまいました。ようやくスクリプトをリリースできました。

実際のところMQOスクリプトは前回で既に完成してたのですが、PMDスクリプトと一緒にリリースしたかったので溜めていました。

結局まだ時間が掛かりそうなので先にMQOスクリプトを配信することにしました。まぁ時間が掛かったというよりも、サボってました。すみません。年に数回、何もしたくなくなるときがあるのです。

Blender2.58版のスクリプトをそのまま導入しても動作はしますが、警告が表示され、その警告のせいで処理が遅くなるようです。Blender2.59で前回のスクリプトをお使いの方はなるべく今回のスクリプトへ更新するようお願いいたします。

PMDスクリプトのほうも、ウェイトの重みづけまで完成してます。頂点とボーンとの関連付けがまだうまくいってなのでそれの修正しだいリリースする予定です。

スクリプトの詳細はいつものところから→ZE10の開発倉庫
ダウンロードは新開発倉庫から→開発作品倉庫

2011年8月15日月曜日

Blender2.59がリリース!

本日、Blender2.59が公式リリースされました。
記事→公式リリース : Blender 2.59が正式リリース
ダウンロードリンク→http://www.blender.org/download/get-blender/


いつもならここで新たなBlenderにあわせたメタセコイア入出力スクリプトとMikuMikuDance入出力スクリプトを更新&リリースするのですが、今回新たなBlenderに2.58版のスクリプトをそのまま導入したところ問題なく動作しました。

只MMDスクリプトが頂点ウェイトグループを作る処理がまだ実装できていなかったので、公式リリースに合わせてMMDスクリプト・MQOスクリプトを共に更新しておこうと思います。

MQOスクリプトに関しては更新後も特に変化はないので今までのものを使っていただいてかまいません。

おそらく今日~明日中には出来ると思うので完成しだい報告&リリースする予定です。今しばらくお待ち下さい。すみません。まだ時間が掛かりそうです。

追記:
診断メーカー作ってみました。暇つぶしにどうぞ
あなたにオススメの飲み物を紹介してあげったー

2011年8月10日水曜日

AndroidでGTAキャラ描画

久しぶりにAndroidプログラムやりたくなって、とりあえずIS03でCJを描画してみた。


正確にはPEDを直接読み込んでるわけではなくGTAViewerでColladaに変換→ツールでオリジナルバイナリフォーマットに変換→読み込んで描画 という流れでやってる

グローブストリートのメンバーを全員集合させてみた




FPSが30にいかない 5体描画してるからしょうがないのかな? まぁこれはNDK側のコードを修正してみよう読み込み速度は問題なし!やっぱりバイナリだと速い!

本当はアニメーション付きで描画させたかったけどボーン数が一定量超えちゃってるんで今の状態では描画は無理みたい MMDなんか最大で256本ボーン使ってるし、対応できるように工夫しないといけないな

まぁ気まぐれでやったんで、実際に修正するのはGTAViewer完成後かな?

追記:
次は盆明けに更新する予定です。

2011年8月2日火曜日

ロースペックPC向け GTAViewer簡易版リリース

ご要望がありましたので作成しました。

大方予想してたのですが、前回のトライアル版だとPCのスペックの関係上起動できない方が幾人かいらっしゃったようです。トライアル版が「XNA Hidef用GraphicsDeviceプロファイル」というハイスペックPC向きの設定にしてたので致し方ありません。

なので今回、トライアル版で可能なことを幾つか制限することでロースペックPCでも起動できるGTAViewerを用意しました。「XNA Reach用GraphicsDeviceプロファイル」という設定を行ってます。

機能の制限内容は以下のようになってます。

性能の違い
Hidef(トライアル版) Reach(簡易版)
モーション用ボーン数 256本60本
頂点数 符号付32ビット 符号付16ビット
画像サイズ 値は自由 最大4096×4096 2の階乗のみ 最大2048×2048
シェーダーモデル 3.02.0

※1回の描画で使うことが出来るスキンメッシュアニメーションのボーンの最大数
アニメーションしなければ制限は掛からない ボーンの描画自体に制限はない

・アニメーション出来るボーンは60本まで ボーン描画には制限は掛からない
・頂点数はトライアル版は0~2,147,483,647、簡易版は0~32,767の範囲まで使用可能
・画像幅が2の階乗のものだけ使用可能(2,4,8,16等) 出力に関しての制限は掛からない

以上です。その他の機能はトライアル版と同じように使うことが出来ます。
動作環境は揃ってるのに今回のバージョンが起動しない場合、GPUが対応してない可能性があります。まぁおそらくGTA SAが動く環境でなら動作すると思います。

なお、機能制限版のリリースに合わせてトライアル版も更新してます。対した内容ではないのでここでは説明しません。詳しくは同封のReadmeを参照してください。

2011年7月31日日曜日

GTA SAキャラのMUGENへの移植方法

前回の動画のオマケでCJをMUGEN入りさせたんですが、今回MUGENでCJの作り方に関しての質問があったので記事にしておきます。

使用ツール一覧
SFF用
・GTAViewer
・IrfanView
・GraphicsGale FreeEdition
・SFFAIRMaker2

SND用
・Alci's SAAT GUI FrontEnd 1.0
・SNDEditor

まずはSFFの作り方から
1.GTAViewerにMUGEN化させるモデルデータを読み込む ifpファイルを読み込んで
任意のモーションに設定後、連番BMPで保存

※モデルをインポートする際、X・Y軸回転を-90度にしておくと、モーション適用後にキャラが右側を向いて編集しやすくなります

※キャラサイズを調整する際、あらかじめ比較用のキャラの立ち画像を背景とし読み込んでおくと調整しやすくなります。

また、比較用画像を画面中央に来るように編集し、背景を透明にしておくとさらに調整しやすくなります。画面のサイズは794×548です。
※カメラの調整が終わったら、カメラ情報を保存しておきましょう。のちのち修正・追加をする時に再度カメラを設定する手間が省けます。

2.出力した連番BMPを IrfanViewで256色BMPに変換する
・「ファイル」→「一括変換 形式/名前」を選択
・連番BMPを全て追加 「変換後の形式」をBMPに設定 ファイル名と保存フォルダを設定する

・「詳細設定を使用」にチェック 「詳細設定」ボタンを押す
・「色数の変更」にチェック 「256色」を選択
※任意で「同名ファイルがあれば上書きする」や「リサイズ」を設定する
・実行ボタンを押す

3.DOSMUGEN用、2Pカラーを作る場合
・GraphicsGale FreeEditionを起動 パレットのベースになる画像を読み込ませる
・ 透過させる色(背景色)を左上へ入れ替えパレットウィンドウからパレットを保存

・「ファイル」→「一括変換」を選択
・「インプット」タブで256色変換した画像を全て読み込む
・「オプション」タブで先ほど出力したパレットファイルを選択 「ピクセルを色に合わせる」にチェック

・「アウトプット」タブで出力先を選択 ファイルタイプは「Bitmap」
任意で上書きモードも設定

・「変換」 ボタンを押す パレットが統一された画像データが出力される

4.SFFAIRMaker2でSFFファイルを作成する
・先ほど変換した画像を全て読み込む
・画像位置 、グループ番号、画像番号を設定後、SFF形式で出力する
※パレットを統一した場合Act適用にチェックして色ボケしてないかを確認すること
※必須スプライトを埋めることを忘れないこと 以下の通りやれば問題ないです

以上でSFF作成方法は終わりです。次はSND作成について説明します。

1.Alci's SAAT GUI FrontEnd 1.0を起動して、audioフォルダから声データを抽出する
※キャラの声データがあるフォルダをダブルクリックすると変換が始まります
※各フォルダ内のファイル参照はこのサイトを参考にしてください
 
ちなみにCJの場合、SPC_PA内のものが該当します。VOICE_PLYと書いてあるものがCJの声データです。ライダーの場合 VOICE_GNG_RYDER、スモークの場合 VOICE_GNG_SMOKEです。

2.SNDEditorで抽出した声データを読み込んでSND形式で出力する。
※sndeditor.exeの絶対パスに日本語が含まれてると、コンフィグデータが文字化けして次回から起動しなくなるので気をつけてください。sndeditor.cfgを消せば動くようになります。

以上です。
MUGENキャラの作成方法には色々あると思いますが、私はこのやり方でやってます。MCMが使いにくかったのと、BMP読み込みに対応してなかったのでこのツールを選択しました。AIRの作成も出来ます。

また、 この方式でGTAモデルだけでなく、MMDやXファイルのモデルでもMUGEN入りさせることが出来ます。是非やってみてください。

なお、SFFAIRMaker2はBMPには対応してますがPCXには対応してません。PCXを使う時はあらかじめIrfanViewでBMPに変換しておいてください。

MUGEN初心者の解説ですが、GTAキャラをMUGEN入りさせたい方は、是非参考にしてみてください。この記事を参考にしてGTAキャラがMUGEN入りさせてもらえればうれしいです。

追記:
この記事書いてる途中に何故か2回ほどデータが消えてしまい、やる気0なんだが・・・?

なお、GTAViewerで作成したMUGENキャラを公開する場合、許可の確認とかは特に必要ありません。自由に公開してくださってかまいません。ただ、「公開した」という連絡をいただければありがたいです。理由としては唯一つ、私が使ってみたいから。ただそれだけです。