2017年04月17日

独自フォーマットは無理でした

独自フォーマットを作っていましたが、1ヶ月以上作業してもメッシュひとつ描画できなかったため、久しぶりに心が折れてしまいました。
Blenderからデータを取得してバイナリに書き出すまでは順調に思えたのですが、そのデータを使ってモデルを描画してみたところ、頂点インデックスがズレたような描画結果になっていて、その原因の特定ができずに作業が長期に渡って停滞しまい、モチベが尽きてしまいました。
書き出したデータが間違っていたのか、インポータでやらかしたのか、はたまたエンジンの不具合なのか、原因は結局分からずじまいですが、まあ、この問題が解決したとしても、この先に発生するであろう全ての不具合でこの3つの全てを疑いながら作業するのは重労働過ぎると思ったので、原因を解決する気力も起こらず諦めてしまいました。。

まぁ残念というか悔しい結果に終わってしまいましたが、モデルのエクスポートから描画までを通して作成したことはかなり勉強になったかと思います。今までAssimpに頼りきっていた部分をかなりクリアにできたことは今回の収穫といえると思います。とでも言わないとやってられない気分です(爆
まぁ勉強になったのは事実で、モデルデータ周りのことは本当に知らないことが多かったです。特にVBO対応の頂点属性データを作るのがこれほど難しいことだとは知りませんでした。個人的にはアニメーションよりはるかに難しく思いました。いい勉強になりました。
気力が回復して次にまた独自フォーマットに挑むことがあるなら、そのときは結果が出せそうな気がします。とでも言わないとやってr(ry


というわけで、今回は進捗が全くありませんでした。この1ヶ月で書いたコードは3000行くらいありましたが、すでに全て退場しています。Blenderのエクスポータは1500行の本編と__init__.pyというけっこう本格的なスクリプトを書きましたが、まぁこれはいつか掘り返して使うかもしれないのです。貴重なBlenderPythonの資産として今後に活かせそうな気がします。

ちなみに、独自フォーマットを作ろうとした理由ですが、Assimpがサポートしていない物理剛体やIKなどのデータを調達するためでした。ついでにAssimpも卒業したかったのですが、うん、甘かった。
足りないデータの調達は、それ専用のエクスポータを作成するつもりです。
最初からこうしとけばよかったかも。

今回はこんな感じです。
では。
posted by gency at 03:45| Comment(0) | 3DProgramming

2017年03月01日

進捗Friends

スケルトンの可視化をこれまでのジョイントのみの表示からボーン表示にしてみました。デュアルクォータニオンスキニングのテスト中に、ジョイントだけだと見づらかったので作ったものですが、その後少し改良してボーン選択機能なども追加しています。
描画はGL_POINTSとGL_LINESだけという雑な作りながら、割りとボーンらしくなっているのではと思います。まぁ、私はBlenderではいつもStickかWireでボーンを表示するので、違和感を感じないだけかもですが。というか、あの槍の先みたいなやつは見た目は良いけど作業してるときは邪魔でしかないんだよぉ(愚痴

skeleton1.jpg

ボーンは選択するだけでなく動かすこともできますので、FKのみですがポージングも可能です(ポーズ保存機能はなし)
また、アニメーション中にボーンを選択すると、そのボーンのみ編集モードに移行し、ユーザーが自由に動かせる状態になります。右腕ボーンだけに独自の変形をセットし、他のボーンはキーフレームアニメーションを再生するということもできます。さらに編集モードの状態で物理剛体をバインドすればラグドールや揺れ物を実装することも可能です。もちろん同じ要領でIKも実装できます。この辺はこれから実装する予定ですが、その前に山積みのタスクをやっつけねばです(´・ω・`)

全体図。

skeleton2.jpg

個々のWidgetは使えるレベルに仕上がっていますが、GUIコンテキストの制御でまだ設計がふわふわしているところがあるため、GUIのシステムとしては実用レベルに達していない感じです。あっ、日本語入力のバグも健在でしたね。あれを直すのはいつになるのか。というか私にあれが直せるのか(マジキ千コード

画像の左に見えるのは、見ての通りですがカラーピッカーです。Blenderのカラーピッカーを参考に作りまして、動作も殆ど同じにしています。操作レスポンスはBlenderよりも格段に良く何気に自信作だったりします。RGBにはまだ対応していませんが、勿論対応はするつもりです。というかHSV→RGBの変換コードはすでに書いてて、円の右下にある矩形内に選択中の色が表示されていますが、これはRGBに変換した値をシェーダーに渡して描画しています。なので後はGUIにRGBとして扱う仕組みを作るだけで対応はできるのですが、UIレイアウト的な部分でけっこう考えてしまって作業が止まってる感じです。デザイン的な作業はどうにも苦手が克服できないですね。。まぁ興味がないからなんだろうけど(直球


今回は以上です。
では。
posted by gency at 00:40| Comment(0) | 3DProgramming

2017年02月16日

デュアルクォータニオンスキニング

デュアルクォータニオンによるスキニング(DQS)を実装しました。
DQSはけっこう古い技術で、問題点も多いとのことで個人的には実装したいってほど興味もなかったのですが、他のスキニングを調べてみてもDQSに勝るスキニングはいまだに存在しないようだったので、んじゃ実装してみるかという感じでコード書いてみました。

参考サイト
https://www.cs.utah.edu/~ladislav/dq/index.html

こちらのサイトにはデュアルクォータニオンと行列の相互変換のサンプルコードが載っています。論文の数式がさっぱり理解できなかった私には非常に有難いサンプルでした。
DQと行列の相互変換さえできれば、DQSの実装は比較的簡単にできるかと思います。ただ、CPU側の処理で、どの段階の行列をデュアルクォータニオンに変換すればいいのか分からなくて、私は少し迷いました。まぁ普通に考えて合成行列(シェーダーに送るボーンの変形行列)だよなぁって思ったので、これをDecomposeして回転と平行移動成分を取り出し、それをデュアルクォータニオンに変換してシェーダーに渡してとやっていたのですが、最初のテストで上手く動かなかったために、あれ合成行列違うのか?となってしまい、けっこう迷走しておりました。。
ちなみに、上手く動かなかった原因は、glm::quatのオーダーが「x」からなのを知らず「w」から始まると思い込んで処理していたからでした;
考えてみれば、クォータニオンの各成分を直接弄るのは初めてだったかも・・。


今回は動画で内容を紹介するつもりでしたが、いろいろおかしなことになってしまったので、これで終わりとさせて頂きます。
追記の方にボツにした動画と感想文を入れておきますので、よかったら見てやってください。

では。

追記
posted by gency at 22:18| Comment(0) | 3DProgramming