スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

ふりかえり

XNA->monogame->SharpDXへの移植の流れで途中でいろいろ機能追加したりしていろいろ学んだこともある。。

SharpDXそのままじゃ実装されてないスキンメッシュ実装っていうのが一番SAN値削られて発狂&退場寸前だったんだけど、まあどうにかなったし。
その辺をなんかまとめたいなあと思った。


完全に独断や偏見が入っている(まわりのことがみえていない)記事なので「なに言ってんだこいつ」と思う人はごめんなさい。

 スキンメッシュは3Dのプログラミングでの壁であり、しかもほぼ最初のほうに存在する関門でどっから手を入れていいのかさっぱりわからない分野でもあると思う・・。

 書籍を探したけどなんかピンとくるものはなくてうーん・・とググりつづける日々。

 しかし3D技術というものは-∞から0へ極限まで近づけていくものであり、とにもかくにも物体が動かないとなにもならない。最低限のリアリティを獲得することもままならない。それがゲームであればなおさら。だからこそ、スキニングは基礎の基礎であり、順序としてはポリゴン表示、モデル表示のすぐ次に必要になる。
 しかし具体的な情報が少なすぎるという謎の障壁があって、規模のない開発では大きな障壁になってるんだと思う。
 0からつくるぞーと息巻いて振り上げた拳を下ろさざる得ない悲劇は、どれくらいあるだろうかとは思う。
 DirectXの中でXファイルが標準的に扱われていた頃だとフォーマットの選別に悩む要素が現在より少なかっただろうけど。現在はXファイルなんて時代遅れだし、各3DCGソフトウェアでの出力プラグインも相性や方言問題を抱えたままメンテナンスされなくなって、新しいバージョンではそのプラグインが動かないとかそういうことも起きてそう(推測)
まあ、directxのツールで簡単に開けてしまうXファイルをゲームに使用するのはどうか、ということもあるけど、まず動くものを作って自前のフォーマットに置き換えていく、という着実なアプローチをとること自体がXファイルでは難しいかもしれないなあとは思う。

 参考になったネットリソースでは
 マルペケさんのところでは基本概念からまるで菩薩のように丁寧に説明してあってかなり参考になり、本当に基本とは大事なんだなあと実感した部分でもある。

その1 モデルそのもの
 というかまずはというか自分の場合出だしのデータがFBXなので、FBXをパージングしないと話にならないので、それについて情報を集めた。Assimpというモデル読み込みを抽象化する感じのライブラリが存在し、それがFBX対応であるという情報。
 さっそくC# port版で読み込みを始める。目標とするものがXNAのModelクラスなので、その構造に沿うような読み込み方をしないといけないが、読み込み処理をしらべて書いているうちに、モデルというものは、
・モデル全体
・その下にあるMeshにあたる部分
・さらにその下にあるModelMeshPartに当たる部分
 的なのに分かれていることがわかる。
 このModelMeshPartにあたる部分とはマテリアルが当たっている部分になる。単純にモデルを描画する場合、XNAで言えばマテリアル=シェーダーで考えられる。シェーダーにはメインで使用するテクスチャは一つあれば最低限いい。
(ここは本当に最低限のModelMeshPart分割の考えなので深く考える必要はない)
 というか、Assimpでファイルを読み込んでゲーム向けを考えてデータを取り出していると大抵上記のような構成になると思うけんども・・どうなんだろう・・。
 ともあれ、ここまでは構成される要素が少なく、やってみれば未経験でも意外とすぐたどり着ける。。。。


その2 アニメーション情報
 モデルはとにかく頂点情報と法線、UVさえ取得できてしまえば描画できる。最初にどうにかこうにか真っ黒なモデル、次にテクスチャを張ったモデルを表示できたときは感動したけど、こっから先のアニメーション情報の読み出し、スキン メッシュのための行列に関しては死ぬ目にあった。
 情報とその理解が十分にあれば順番に組み立てていけばいい話なんだけど、どうも俺は馬鹿だった・・。
 アニメーションに関しては地獄から来たトライアンドエラー地獄だったし、モデルが性格に動かない場合に見た目から何がおかしいのかをせめて少しでもわかりやすくするために単純な構造のモデルでトライアンドエラー地獄を繰り返した。
 アニメーション情報の読み込みはXNAのコンテントパイプラインでのアニメーション読み込みを参考にできた。アニメーションプレイヤーに関してもそう。
 地獄にハマってる間はモデルの破綻具合からなにがおかしくて何が正しいのかがまったくわからなかったので、モデルのウェイトの読み込みからおかしいのか、変形行列の読み込みがおかしいのか、バインドポーズの扱いがおかしいのか(ライブラリ・ソフトウェア・参考資料の間で呼び名が異なる場合が多くれ混乱もした)、そっからのスキン行列の組み立ておかしいのかがよくわからず、どっから見直せばいいのかがにっちもさっちもいかなくて何度も心が折れかけた・・。

gujaguja.jpg
fig.1
 左側にはボーンのワールド行列とスキン行列を描画して動いているのかをデバッグ。
 なにがおかしいのがかわからないという地獄。

skinning.jpg
fig.2
 この画像の段階ではスキンメッシュの失敗の仕方がBlender上でボーンウェイトを付けたモデルをモデルのローカル座標で動かしてしまった時の崩壊の仕方が似ていたので、Blenderでどういう風に動かしたらこういう変形になってしまうのかを確認しているところ。ここでは回転の要素だけがおかしいということがわかってガッツポーズした・・
 モデルの変形失敗について、目で見てなにがおかしいのかということが失敗したモデルからはなんだかよくわからないということがひとつの壁だと思う。なにがおかしいのかが分かるところまで来たらもう困ることはほどんとない。

 結局のところ、たとえばC#言語で、特定のフォーマットから一からスキニングして表示までをわかりやすく説明しているサイトはみつからず、断片をかき集め、小さい脳みそを揉みしだきながらどうにかスキンメッシュアニメーションを実装できた。

 ひとつの試金石なのではないだろうか・・ と思うくらいには難しかったと思うんですけど、ほかの人はサクっと作れちゃうもんなんですかね・・
 ただ難しくても試金石レベルではあると思う。ここから先のIKや用意されたアニメーションデータを使わない自動アニメーションなんかはもうどうなってるのやら。

その3 ボーンウェイトの罠
 キャプチャーが残っていないので例示できないけど、スキニングはできた、それっぽく動いている、しかし規則性もなく一部の頂点だけがまるでボーンウェイトがかかっていないかのような動きをする・・・というのにすこし悩まされた。
 またも数値とシェーダーとにらめっこ。
 さらにはAssimpに同梱されているビューアともにらめっこ。このビューアではどうやら自分のプログラムと同じ頂点がまた別のおかしな動きをしているのがわかった。
 元データであるBlenderではウェイトは設定したし、Blender上ではウェイトがかかってるように動いている・・。
 ここで数値を見てうんうん唸った結果気づいたのは、4つあるウェイトの値が合計で1になってるのとなってないものがあるということ。
 変な変形になってる頂点はその合計が1になっていないもの・・。ということで、ウェイトの合計が1になるようにノーマライズ。
 実行した瞬間に破綻なく正しく動くモデル・・。 苦労した分、望むものが手に入ったことはうれしかった。。

 この頂点のウェイトをノーマライズすることに関してはネットリソースがなく、「ほかのひとはどうしてんだこれ」っていう部分でもあるので、なんか参考になる人がいたらうれしいなあと思う。

 
スポンサーサイト

コメントの投稿

非公開コメント

プロフィール

zerobyteorbit

Author:zerobyteorbit
deathpiyoがgameをdevelopしたり、musicをcomposeしたり迷走したりする。

現在は迷走中。

under the lotusはリビルドのために考え中。

deathpiyo twitter

UnderTheLotus test3h(download)
I'm thinking about rebuilding UTL.


同人音楽アルバム
[Lovers Immortality]
-Japanease-
Lovers Immortality -works until worldend- DLsite.com直リンク
Melonbooks DL
-English-
Lovers Immortality -works until world end- Link to DLsite.com

18+
【東の森の魔女2 VS 魔王 -終宴する世界と肛虐(逆)の魔女たち-】
東の森の魔女2 VS 魔王 -終宴する世界と肛虐(逆)の魔女たち- DLsite.com直リンク
DMM.同人

紹介ページ


【地下迷宮の機械姦自壊オナニー生活。】
地下迷宮の機械姦自壊オナニー生活。 DLsite.com直リンク
DMM同人

紹介ページ




DLSite
Link to DLsite.com

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
FC2カウンター
検索フォーム
RSSリンクの表示
リンク
QRコード
QR
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。