本日、とても大きな地震があったのですが。皆さん、御無事でしょうか。
ちなみに自分の地域は震源から離れているので、ほとんど問題無かったです。
今はTVで地震速報を観てますが、東北・関東は倒壊や津波で大変みたいなので
なんだか心配です。それとこれからも地震が続くのかどうか気になるところです。
最近はこまめにデータのバックアップを取るようにしていましたが、日頃から
そうした対策意識を持っておくことが大切になりそうだなと改めて感じました。
テレワークならECナビ Yahoo 楽天 LINEがデータ消費ゼロで月額500円〜!
無料ホームページ 無料のクレジットカード 海外格安航空券 海外旅行保険が無料! 海外ホテル
3Dを使ったり使わなかったりする制作日誌。
本日、とても大きな地震があったのですが。皆さん、御無事でしょうか。
ちなみに自分の地域は震源から離れているので、ほとんど問題無かったです。
今はTVで地震速報を観てますが、東北・関東は倒壊や津波で大変みたいなので
なんだか心配です。それとこれからも地震が続くのかどうか気になるところです。
最近はこまめにデータのバックアップを取るようにしていましたが、日頃から
そうした対策意識を持っておくことが大切になりそうだなと改めて感じました。
LWSファイルからのモーション読み込みがある程度出来てきたので、さっそく
新しいモデルの方をプログラム上に読み込んでみました。
毎度のことながら、とても試行錯誤することになりましたが、実装できて本当に
よかったです。デバッグで画面が立ち上がる前の「うまくいくかな?それともまた
失敗だろか?」っていうもやもやの中でうまくいったときの喜びは大きかったでした。
それで、今回は何に苦戦したかといえば。今までウェブ上で調べていたらLWの
回転順序はY-X-Zだと書かれていたので、そうとばかり考えていたのですが、
実はそうではないんですよね。確かにレイアウト上ではY軸を動かせば他の2軸も
拘束しているように見えるし、Z軸を動かしても他の2軸は動かないので、Y-X-Z順
に回転しているんだなと思うのが普通なのですが、プログラム上での実際の回転
順序はZ-X-Yなんです、これが。
それで、回転順序は合っているとばかり思っていた上にスキニング後の位置が
ボーンの長さよりも長くなったりしていたので、オフセット情報がおかしいのだろう
とばかり考えていて、結局無駄な時間を過ごしてしまいました。どうやらスキニング
の場合は回転と平行移動の行列を交互に掛け合わせるので、回転順序が違うだけ
で親空間からの距離も変わるみたいですね。
それと後になってから色々と考えてみましたが。結局Z-X-Y回転なのにGUI上では
Y-X-Z回転のように見える謎がよく分からずに終わりました。例えるなら天動説と
地動説のように、地球からみれば太陽は地球を中心に回って見えるけど太陽から
みれば地球は太陽を中心に回って見えるような感じで、相対的に逆転してみえる
ものなのかな、と。なんともあやふやな答えしか出せませんでしたが、いずれ分かる
ようになったらまたそのときにでもメモしようかと思います。
そういえば、実装してみて思いましたが。モーション情報が読み書きできるように
なったので、モーションファイルのコンバータが作れそうだなと思いました。
現状だとBVH、DAE、VMD当たりのフォーマットについてはある程度把握できて
いるので、機会があれば実装しようかなと考え中です。昔の自分だったら、
フォーマット調べても「何コレ?分からん。。」で終わっていたのですが。それなりに
成長したのかもしれないな。
ちょっとColladaファイルもぼちぼち覗いていたこともあって、ルート直下の
情報についてはある程度把握できたので、突然ではありますがColladaの
フォーマットについて少しだけまとめてみようかなと思います。
ColladaのフォーマットはXML準拠のテキストフォーマットで構成されています。
XMLについて実はあまり知らないのですが…;HTMLの拡張版という浅い認識で
とりあえず話を進めていきたいと思います。つまり、HTMLと同じように
全ての情報はタグと閉じタグによって括られます(HTMLにはインライン属性
という閉じタグがつかないものもありますが、それは置いておきます)。
注意:この日誌ではタグ文字は書き込めないようになっているみたいなので
タグ文字は[]に変換して書き込んでます。
Colladaのルートは[Collada]タグで構成されており、
[Collada]タグ内は以下のタグで構成されています。
・[asset]:ファイルに関するプロパティ
・[library_animations]:アニメーション情報
・[library_cameras]:カメラ情報
・[library_lights]:ライト情報
・[library_images]:イメージ情報
・[library_materials]:マテリアル情報
・[library_effects]:エフェクト情報
・[library_geometries]:ジオメトリ情報
・[library_controllers]:キーフレーム情報
・[library_visual_scenes]:仮想シーン情報
・[scene]:シーン情報
仮想シーンとシーンの違いは、仮想シーンは実際の1つ1つのシーン(例えば
走るモーションのシーンや歩くモーションのシーン)で、シーン情報は仮想
シーン情報全体を管理した情報となっているようです。
仮想シーン情報にそのシーン内で使用するジオメトリIDとそのジオメトリに
適応するマテリアルID等が格納されていて、マテリアル情報にはエフェクトIDが
登録されていて、エフェクト情報からシェーディング情報や使用するイメージ
IDを参照するといったようになっています。アニメーション関係のタグに
ついてはまだほとんど調べていないため、説明しても間違いだらけに
なりそうなのでここでは控えたいと思います。
ちなみに使用しないタグについては記述しなくてもよくて、記述の順番も
任意でよいといった感じですが、Colladaのルート直下のタグについては
同じタグは2回以上記述されないような仕様になっているように思いました。
というより、2つ読み込まれるとどう読み込んでいいか分かりませんし;
例えば実際にジオメトリを2つ格納したい場合は[library_geometries]直下に
[geometry]というタグを2つ格納しそのタグでジオメトリを分けるといった
感じです。また、HTMLと同じように
[geometry id="ModelID1" name="JohnSmith" ]
といった感じで、各ジオメトリにIDと名前を設定します。
IDを参照して情報を得るので名前というのは別に必要ないのですが、これは
3Dソフトで各情報の名前を表示する用のものなのかなと思いました。
てっきり、ものすごく複雑な構造になっているのかと思っていましたが、
一つ一つに分けてみればHTMLと同じような設計になっていて、なんだか
分かりやすくていいなと思いました。
LWOのスケルゴンとウェイトマップを読み込めるようになりました。
スケルゴンはLWSでボーンを読み込めば別に必要ないのですが、、まあこちらの
方が色々と便利かなと思ったのでこちらでボーンをプログラムに読み込んで
いきたいと思います。とりあえずこれでLWOの読み込みは完成ですが、
LWOフォーマットはスキップ処理の実装はすんなりと出来ましたが頂点マップの
情報が至る所に分岐していたので、エラー処理にすごく苦戦してしまいました。
頂点マップ名だけを格納するチャンクとか、他のチャンクにまとめた方がいいと
思ったものですが、既に完成しているフォーマットに云っても仕方がありません。
次はLWS読み込み!一番実装が不明瞭なのはスケルゴンからどうやって
LWSと同じ初期姿勢を得るのかということですが、ただいまちょっと考え中です。
LWOファイルの読み込みがある程度できてきました!
けれど、実装してみると当初の予想よりも結構難しかったという印象でした。
というのも頂点座標等の取得はそれなりにすんなり出来たのですが、何故か
プログラム上では正常に描画されないという問題が発生したのです。
この問題について色々と試行錯誤するうちに、どうやらマルチレンダーターゲットと
固定機能パイプラインを併用すると描画されないということが分かったので、それで
一件落着なのですが。。たったこれだけのことで2日近くかかってしまいました苦笑;
正直もう駄目かもしれないなんて、軽く絶望しかけましたよ。まあ、プログラムを
しているときはこんなこと日常茶飯事なのですが、…これって自分だけかな。。
そういえば、Xファイル読み込めるのならLWOの読み込みいらないんじゃないかと
思われそうですが。一応利点を大きく2つ挙げてみます。
・Xファイルはインポートは自作ですが、エクスポートは他者のプラグインなので
バグを発見しても修正できないが、自作ならそれが可能。
・LWのモーフやマルチUVをそのまま読み込める。
この2つとも自分にとってはかなり大きなアドバンテージになるので、LWOと
LWSが読み込めるとすごく助かるのです。ちなみに現状はXファイルが読み込め
たり読み込めなかったりといった感じなので、プログラム上のモデルがいつまで
立ってもやたら古いのは実はそのせいなのです;
他所様のプラグインとか見ていて思いますが、Xファイルの出力の際、何らかの
不都合が生じた場合はその問題についての適切なメッセージを返してほしい
ものなんですけどね。。例えば、インデックスサイズがWORDサイズを
超えている場合は"このモデルのインデックスサイズはWORDを超えています。"
というメッセージを返してほしかったりするんじゃないかな、と思います。
そして残るはウェイトの読み込みとLWSファイルの読み込みです。
LWSファイルはSDKのマニュアルにはものすごく簡素に書かれていて、どうしよう
かと思いましたが、ファイルを眺めているうちにモディファイア系の処理は
plugin~EndPluginという部分にまとめられていることが分かったので
まとめて読み飛ばせば割とシンプルに実装できることが分かってきました。
早く実装できるといいなあ。
ちまちまとLWOフォーマットについて勉強中です。
今までは3Dソフトのフォーマットは難しそうだから敬遠してたのですが、ようやく
ある程度理解できるようになってきたので。少しプログラムを組んでみて、今回
LWOファイルの頂点情報とインデックス情報とテクスチャ情報が取得できるように
なりました!まだまだ序盤ですが、これだけでもシンプルなモデルなら読み込んで
そのままプログラム上で使える感じです。
それと読み込んだモデルのバッファを最適化する関数を作成したり、Xファイルを
書き出す関数も作成したりしてみました。2つともまだ中途半端な実装なのですが、
これらの機能がうまく組み合わさることでプログラムと3Dソフトのデータ以降が
すごくスムーズになると思うので、ここは頑張りたいところです。
ただ少し気になるのが、LWOの読み込みをサポートしているソフトは色々とある
のですが、LWSの読み込みまでサポートしているソフトになると、何故かすごく
少ないんですよね。。こちらはテキストフォーマットなので簡単に読み込めそうな
気がするのですが、モディファイア系の読み込みが面倒くさいのかもしれない。
バイナリファイルの方が読み込みしやすいとは、、これ如何に笑。
LWOフォーマットはIFF(Interchange File Format)という汎用フォーマットを
採用してるのですが、正直3Dソフトのフォーマットはどれも互換性が無さ過ぎる
ので、IFFのような汎用フォーマットの記述で統一してしまえばいいと思ったり。
ColladaのようなXMLタイプでもいいんですが、各情報のスキップとかは
IFFのようなチャンク構造じゃないとしづらいし、スキップが容易に出来ない以上、
全ての情報について把握する必要がありますからね。。
多分Colladaを自作読み込みなんて個人レベルでは出来ないと思うんです。
まあ汎用フォーマットで統一しようにも、実際は各社の思惑なんかも色々と
ありそうなので、そうはいかないのが現実なのであった。
今回はひさしぶりにプログラムの更新して、デカールプロジェクションという技術を
実装をしてみました。ちなみにデカールという言葉はプラモでも使われているようで、
3Dの間でもカラーマップのことをデカールと呼んだりもするので、実は結構定義が
あやふやだったりしますが。。今回実装したデカールプロジェクションというのは
壁やキャラクターにぺたっとシールを貼り付ける技術のことです。動画では青い
四角部分がデカールで実装しています。
処理部分はCPU計算で実装したのですが、技術的には以前実装したシェーダに
よる丸影とほとんど同じなので、実はそのシェーダを少し改良しただけでGPUで
実装できるんですけどね。。なぜあえてCPUで実装したかといえば、デカールの
処理内で使われるシザリングという技術を導入したかったからなのです。
このシザリングというのは、ポリゴンを任意の平面で分断して切り取るという至って
シンプルなテクニックで、DirectXではありがたいことに描画時のニアクリップ面に
対して自動的にシザリングを行ってくれます。ちなみにこれが行われないと
どうなるかといえば、、説明は行列計算の話になってくるので省きますが。
これだとカメラの後ろ側のポリゴンまで描画されてしまいます笑。
このシザリングをわざわざ自前でやる必要があるのかといえば、"背景モデルを
自動で分割できるから"というのが今回の本当の狙いだったりします。
モデリング制作において、毎回背景を手動で最適化されるように分割するのは
しんどいのですが。これによって気軽にぐりぐりと背景が作れるようになる訳です!
久しぶりに日記を更新したせいか、今回はやや記事が長くなりました。
技術的な話でも少し書こうかと思いましたが、、あまり有益な情報の無い、
ただの長文になってしまいました苦笑。
LW10の新機能まだまだ他にないかな、と今現在も探っているところですが。
3つほどプラグイン形式の新機能を発見したので、ちょっとご紹介。
・Weight Blur
モデラー。Mapタブに入っている。
ウェイトにブラーをかける。
・DNA
モデラー。Additionalに入っている。
DNAっぽい(?)ポリゴンを作成。
・SpriteGen
レイアウト。RenderGlobal>Outputに入っている。
レンダシーンを1枚のタイル状のスプライト画像として出力。
SpriteGenについては公式サイトの新機能一覧に載っていたのでそこから
気づきましたが、DNAについては「何だろうこれは」としかいいようがありません;
機能はまさにそのまま、医学系の番組で見かけるようなDNAモデルを作成します。
使いどころはものすごく限定されそうですが、、覚えておいて損はない、かも。
ちなみにまだまだ他にもないかな、とLW9とLW10を同時に起動させながら
探していたのですが。LW10が突然強制終了してしまい、LW9の方をみて
みるとコマンドが半分近く減っていた、という現象が発生!
いざという時のためにコンフィグファイルをバックアップしてあったので復旧は
すぐ出来ましたが、やってくれますなあLWさん。
そこで気がつきましたが、LW10のコンフィグファイルはユーザディレクトリ直下
ではなく.NewTekというフォルダ内に作成して住み分けしてました。
そもそも何故LW9はユーザディレクトリ直下に堂々と置くのやら…苦笑。
それと上の3つのプラグインはLW9でも読み込んで使用することが出来ます。
ただし奨められた方法ではないので、やらない方がいい気がします。ちなみに
コンフィグファイルの破損はLW9にプラグインを読み込ませる前に発生した
のでLW9とLW10の同時起動をする際は一応コンフィグファイルのバック
アップをしておいた方が無難だということが分かりました。
追記:
他にもレイアウトのモーションオプションのコントローラタブにFollowという項目が
追加されてました。これだけだとモディファイアからFollowするのと同じかな
と思ったのですが、なぜかTexture Editorボタンがついてるので不思議です。
テクスチャでコンストレインの度合いを調節するんだろうか?今のところ謎です。
スカルプト作業が長引いてしまったので、とりあえずリダクションと微調節をして
プログラムに読み込む用のローポリゴンモデルを作成してみました。
ちなみに手と顔だけ他のキャラクターからそのまま借用。せこいです笑。
後はUV作成+法線マップの転送ですが、、ハイポリモデルの完成半ばでローポリ
モデルを作成したので、微調節によって予想以上に予想以上に形が変わって
しまいました。これだとおそらく法線マップの転送があまりうまくいかないと思う
ので、どうしようかと現在少し悩み中。
ローポリモデルをガイドとしてハイポリモデルを調節するのがベストでしょうが、
果てさてどうしたものか。何かいい方法がないものかな。
LW10のプレリリース体験版を遅まきながらインストールしてみました。
噂のCOREが体験できるのかと思っていましたが、、どうやらプレリリース版と
いうことで、まだ実装の公開には至っていないようでした。
けれどレイアウトのビューをVPRレンダリングに切り替えたときは「おぉ!」って
思いました。これは以前からmodoにも搭載されているような機能なので、あまり
目新しいものではなかったりしますが、数年ぶりのLWアップデートということで
なんだか妙な感動を覚えてしまいました笑。
そうそう、以前のVPRと違いノードも考慮して描画されるところが結構嬉しいところ
ですが。他所様のサイトを見る限り、標準のノード以外のプラグインノードはほとんど
エラーになるみたいです。触ったところ、VPR以外の実装はほとんどLW9と変わら
ないので、おそらくLW9のプラグインはほとんど動作するかと思いますが、VPR
だけはCORE向けの実装になっているので以前のプラグインでは動作しない、
といったところでしょうか。
それとLW10の新機能一覧を見る限り、他にはBulletの搭載やビュー上でのゲーム
モード等があるようですが、これらの実装については確認できませんでした。
ただ、ゲームモードについてはLWレイアウトのGraph Editor項目の下に
"Virtual Studio"という新しい項目が搭載されていて、Preferencesオプション
パネルにも新しくNavというタブが追加されていました。
自分のUSBパッドではLWにデバイス認識されず、動作を確認できなかったので
今ひとつ分からない感じに終わりましたが、項目を見る限りだと、Navタブから
ゲームモードに使用するデバイスを選択し、Virtual Studioでプレイヤーと
なるキャラを設定するといった感じになるのかなと思いました。
おそらくBlenderのゲームモードと同じような機能になるのかと思いますが、
これもなんだかんだで面白そうな機能だなと思いました。実装が楽しみです。
さらに、あまり他のサイトでも紹介されていない新機能を発見しました。モデラーの
Display OptionsパネルのViewportタブ内での半透明描画処理の指定項目に
"Alpha Clip"というのが追加されていました。選択してみてもSort By Objectと
同じ動作だったので、まだ未実装なんだと思いますが。。
これってもしや…DirectXでいうところのアルファテスト+Zバッファ描画なのかなと、
何気にすごく期待しています。今までLWモデラーではZソート描画でしか半透明
ポリゴンを描画できなかったので、個人的に一番嬉しい機能だったりします。
他にはGeneral Optionパネルにも少し新しい項目がついてましたが、
自分で調べる限り新機能はこれで全部でした。公式サイトで公開されている
推奨スペックを見る限り、自分のへっぽこPCだとまともに動かないかなぁなんて
思って触り始めましたが、なんとLW9と全く同じ軽快さでした笑。LWCOREだと
重くなるから、モデラー、レイアウトも残すということなんでしょうね、きっと。
2月中にはCOREリリース予定だそうですが、待ち遠しいです。