2009年04月30日

テクスチャプラグインをWindowsでコンパイルする(2)

BlenderのテクスチャプラグインをWindowsでコンパイルする場合、テクスチャプラグインの公式ページともいうべきBlender Plugin Repositoyに書かれている方法では、現在のところうまくいきません。

あちこち探してみた結果、MicrosoftのVisual C++ 2008 Express Editionを使用する方法が見つかり、こちらの記事(3月15日)にその手順を書いています。

また、プラグインリポジトリにあるテクスチャプラグインの一部はこの方法ではうまくコンパイルできないものがあるため、LCCというコンパイラを使ってコンパイルする方法をこちらの記事(3月28日)に書きました。この記事を書いた時点では、Blenderからエクスポートしている関数をプラグインで使用している場合は、コンパイルに失敗していました。

その後、LCCコンパイラのマニュアルを調べてみたところ、エクスポートされている関数を利用するための方法がわかりました。今回の記事の手順で、LCCコンパイラでもプラグインリポジトリのすべてのテクスチャプラグインをコンパイルできるようになります。
具体的には、Microsoftのコンパイラを使用した場合のように、インポートライブラリ(plugin.lib)を作成しておいて、リンク時にそのファイルをコマンドの引数に追加する、という感じになります。

WindowsでGCCコンパイラを使用するための環境MinGWでもコンパイルできるようになりましたので、合わせてその手順をご紹介したいと思います。
(以下の内容は、自分で試した範囲でなんとか動作可能なプラグインをコンパイルできた、という状況で書いています。このため、不必要な手順が混じっていたり、本来必要な手順が抜けていたりするかもしれません。あくまで、参考程度のものとして見ていただければと思います。)

○LCCでのテクスチャプラグインのコンパイル
以前の記事と同じように、以下のような状況を想定してコンパイルを行います。
  1. Blenderの「plugins」フォルダを「C:\blender」というフォルダにコピーします。
  2. コンパイルの対象は、「texture」フォルダにあらかじめ入っているclouds2.cとします。
  3. tex.defファイルを「include」フォルダに置きます。
  4. 「include」フォルダ内にあるplugin.h、util.hの内容を一部修正します。
tex.defファイルの内容、plugin.h、util.hの修正内容については、3月28日の記事で書いた通りです。

・インポートライブラリ(.lib)の作成
Microsoftのコンパイラではインポートライブラリを作成する際に、plugin.defというファイルからplugin.libを作成しました。plugin.defはBlenderの「plugins」-「include」フォルダに入っています。

LCCでは、plugin.expというファイルを使用してpluginlcc.libを作成します。(本来はこれもplugin.libという名前でいいのですが、以下の手順でMicrosoftのコンパイラ用のものと同じ名前になると非常に紛らわしいので、このような名前にしてみました)

plugin.expファイルは普通のテキストファイルで、内容はplugin.defと似ています。
blender.exe
_mallocN
_callocN
_freeN
_mallocT
_callocT
_freeT
_hnoise
_hnoisep
_turbulence
_turbulence1
_allocImBuf
_dupImBuf
_freeImBuf
_converttocmap
_saveiff
_loadiffmem
_loadifffile
_loadiffname
_testiffname
_onehalf
_onethird
_halflace
_half_x
_half_y
_double_x
_double_y
_double_fast_x
_double_fast_y
_ispic
_dit2
_dit0
_scaleImBuf
_scalefastImBuf
_scalefieldImBuf
_scalefastfieldImBuf
_de_interlace
_interlace
_gamwarp

このファイルはplugin.DEFファイルを修正して手作業で作成することもできますが、Microsoftのコンパイラ用にインポートライブラリを作成してあれば、それを元に作成することもできます。

ちなみに、LCC用のpluginlcc.libとMicrosoft用のplugin.libは同じ拡張子ですが互換性がありません。同様に、Microsoftのコンパイラ用のplugin.libを作成する際にplugin.expというファイルが作成されますが、LCCで使用するものとは中身は全く別のものです。

Microsoftのコンパイラ用plugin.libからplugin.expを作成します。あらかじめコマンドを実行する場所にplugin.libをコピーしておきます。今回は「C:\blender\plugins\texture」です。
pic090430_01.jpg

コマンドプロンプトを起動し、以下のコマンドを実行します。

cd C:\blender\plugins\texture
pedump /EXP plugin.lib >plugin.exp

ここで、作成したplugin.expファイルをテキストエディタで開いてみると、一番最初の行が「blender.DLL」となっています。この部分はBlenderの実行ファイルの名前になっている必要がありますので「blender.exe」に修正します。
pic090430_02.jpg pic090430_03.jpg

plugin.expからpluginlcc.libを作成するには、以下のようにします。

buildlib plugin.exp pluginlcc.lib

以上でコンパイルのために必要なファイルがそろいました。
pic090430_04.jpg

コンパイルのために実行するコマンドは以下のようになります。

lcc -Ic:\blender\plugins\include clouds2.c
lcclnk -dll -nounderscores clouds2.obj c:\blender\plugins\include\tex.def pluginlcc.lib


一つ目のコマンドでclouds2.objというオブジェクトファイルを作成し、2つ目のコマンドはリンクを行ってDLLファイルを作成します。
pic090430_05.jpg pic090430_06.jpg
pic090430_07.jpg


○MinGWでのテクスチャプラグインのコンパイル
LCCの場合と同じく、MinGWもファイルをインストールするだけでなく、Windowsの環境変数「PATH」にMinGWの実行ファイルの入っている場所(通常は、C:\MinGW\bin)を追加しておく必要があります。

LCCの場合と同じように、以下のような状況を想定してコンパイルを行います。
  1. Blenderの「plugins」フォルダを「C:\blender」というフォルダにコピーします。
  2. コンパイルの対象は、「texture」フォルダにあらかじめ入っているclouds2.cとします。
  3. tex.defファイルを「include」フォルダに置きます。
MinGWでのコンパイルでは、tex.defファイルの内容を一部修正する必要があります。LCCで使用しているものをそのまま使うと、コンパイル時に以下のようにエラーが表示されます。
Cannot export LibMain@12: symbol not defined
collect2: ld returned 1 exit status
pic090430_16.jpg

とりあえず、問題のある部分を削除してしまえば、コンパイルが完了するようになるようです。
LibMain@12
この2行目の部分を削除します。
pic090430_08.jpg pic090430_09.jpg

・インポートライブラリの作成
MinGWでは、インポートライブラリは拡張子「.lib」ではなく、「.a」となります。さらに、ファイル名の頭が「lib」となるようにします。コマンドプロンプトを起動し、「plugins」-「include」フォルダに移動します。

cd \blender\plugins\include

以下のコマンドを実行し、libplugin.aファイルを作成します。

dlltool --input-def plugin.def --output-lib libplugin.a --dllname blender.exe

以上でコンパイルを行う準備の完了です。MinGWでのコンパイルでは、plugin.h、util.hを修正する必要はないようです。
pic090430_10.jpg

「plugins」-「texture」フォルダに移動します。

cd \blender\plugins\texture

以下のコマンドでコンパイルを行います。

gcc -I..\include -c clouds2.c
gcc -shared -o clouds2.dll ..\include\tex.def clouds2.o -L..\include -lplugin

一つ目のコマンドでオブジェクトファイルを作成し、2つ目のコマンドでリンクを行いDLLファイルを作成します。ちなみに、「-L」でリンクに使用するインポートライブラリの場所を指定し、「-l」でインポートライブラリの名前を指定します。このとき頭の「lib」と拡張子「.a」は省略します。
pic090430_11.jpg pic090430_12.jpg

ただし、このようにしてできたDLLファイルを使用する場合、初回にBlenderから読み込む際にエラーが起こりますが、Blenderを終了せずにそのまま再度プラグインをロードすると、2回目以降は普通に読み込めるようになります。
pic090430_14.jpg pic090430_15.jpg

Microsoftのコンパイラ、LCCコンパイラでは、このようなことは起こらないようですので、気になるようでしたらそれらのコンパイラを使うようにしてください。
posted by mato at 23:34| Comment(0) | Blender | このブログの読者になる | 更新情報をチェックする

2009年04月26日

Blender Partyに参加しました

昨日25日に東京の神保町で行われたBlender Party @Tokyo,Japan 2009に参加させていただきました。
当日は天気があいにくの雨で、強風などの注意も必要という天気予報でしたので、電車が止まったりしないか不安でしたが、無事に開始時間に会場に到着できました。

私はどちらかというとコミュニケーション能力があまり高い方ではなくて、初対面の方とお話したりするのは得意ではないのですが、yamyamさん、真猿さん、藤堂+さんなどと同席させていただいて、色々とお話を聞くことができました。
私はまだBlender関連のサイトを十分に把握できていなくて、ハンドルネームを聞いてもその方がどのようなサイトを運営されているのか、どのような作品を作られているのかが分からなかったりして、少々とまどってしまいました
。事前にもう少し調べておけばよかったかなと反省しています。

イベントの方は、上映会、実演共にとても楽しめました。実演をされたトニーさん、ekakiyaさん、shigeさん、大変勉強になりました。ありがとうございました。

そして、前回の記事に書いたようにVFXコンテストに私も応募させていただいていたのですが、なんと審査員特別賞の3番目に選んでいただきました。少しでもイベントを盛り上げることに役に立てたら...というつもりで作ったのに、賞品をいただいてしまって、なんだかとても申し訳ない気持ちです。(賞品はほとんどが関係者の方の自腹とのことです。)投票していただいた皆様、賞品を用意していただいた皆様、本当にありがとうございました。
ちなみに1番となったのは、FDTKさんの「BLUE HERO & Making」、2番はnaokiさんの「Polt」 という作品です。おめでとうございます。

当日の様子をライブ中継した動画がこちらで見られるということです。私も少し拝見させていただきながら、この記事を書いています。

オフ会というものに参加したのは今回が初めてなのですが、Blenderという共通する言語のある人と直接会うことができ、とても貴重な体験をさせていただくことができました。このような会を開催して下さった皆さんに、とても感謝しています。幹事をされたまんださん、グリマーさん、daywalkerさん、ありがとうございました。

posted by mato at 21:26| Comment(2) | Blender | このブログの読者になる | 更新情報をチェックする

2009年04月21日

BPTJ2009のVFXコンテスト

4月25日(土)18:00から、Blender Party @Tokyo,Japan 2009 が東京の神保町 ダイニングカフェ・エスペリアで開催されます。私も参加させていただく予定です。Blender Patyについての詳細はこちらをご参照ください。

これに合わせて行われているVFXコンテストに私も応募させていただきました。コンテストにエントリーされている全ての動画は、こちらで確認できます。

私が応募した動画はこちらになります。
動画の中で使用しているのは、Poser用フィギュアとして公開している「くるる」をBlender用に移植している途中段階のものです。まだ、色々と設定が詰まっていないので正式に公開していませんが、このブログでも以前サンプルデータとして使ったりしています。

作成した動画は16秒と短めです。内容は、机の上でフィギュアになりきっているつもりのくるるさんが、カメラに見つかって焦っているというシーンを作りました。
pic090421_16.jpg

ちなみにくるるさんのまわりにある本物のフィギュアですが、こちらはスペインのリヤドロという陶器のフィギュアです。ちょっと値段が高めですが、デパートの洋食器などの贈答品の売り場に置かれていることがあります。もし実物を見ていただけたら、その造型の素晴らしさに驚かれるのではないかと思います。機会があったら、探してみてください。

ということで、今回は少しプログラミングのことから離れて、応募した動画のことを書いてみようと思います。
このコンテストのテーマとなっているのが、実写映像と3DCGの合成です。私はカメラトラッキング(マッチムーブ)ソフトというものを初めて使用しました。カメラトラッキングのために使用したのはVoodooというソフトウェアです。
pic090421_01.jpg pic090421_04.jpg

カメラトラッキング自体が今回初めて体験するものだったのですが、少しだけ使ってみた範囲では、なかなか思い通りのカメラ設定を得るのは難しいように感じました。使用する素材の動画の内容によって状況がかなり変わってくると思いますが、
  1. エンコードによって画質が落ちている場合、得られるカメラデータの精度も落ちる。
  2. 短い時間ならきちんとしたカメラデータが得られる動画でも、ある程度以上の長さをまとめて解析しようとするとうまくいかない。
というようなことを、実際に作業した中で体験しました。

一度解析が終わった後で、さらにデータを修正することでカメラデータの精度を向上させることもできるようですが、今回はそこまでする時間の余裕がありませんでした。机の上を撮影した動画はいくつか試した中では比較的良好なカメラのデータが得られました。上の画像に映っている猫の動画では、映像とカメラの動きが今ひとつ一致しませんでした。


カメラトラッキングを使っていることというのが今回の動画で一番の重要項目ですが、それ以外にも何点か工夫している部分がありますので、ここからはその辺りについて書いてみたいと思います。

まず、キャラクターの髪、衣服にはクロスシミュレーションを使用していますが、メッシュの形状自体をシミュレーションするのではなく、より少ない頂点数のメッシュでシミュレーションを行い、実際の形状の変形はそれらのシミュレーション用のメッシュに追従させたアーマチュアによって行っています。
pic090421_15.jpg

このように実際にレンダリングするメッシュとシミュレーションのメッシュを分離するという方式は、そのままシミュレーションするよりもセットアップに手間はかかりますが、一度設定を完了してしまえば色々と応用ができる可能性があります。
  1. IPOカーブにベイクすることで自由に編集できる。
  2. 同じシミュレーション設定で全く別の形状を動かすことができる。
今回、衣服のシミュレーションを普通に行うとキャラクターがくしゃみをする動作の反動で激しく変形しすぎてしまい、パラメータの調整だけでは制御が難しい感じになりました。これに対して、シミュレーション用のメッシュで裾の部分を本来よりもかなり長めに伸ばすことで、変形を抑えるようにしています。
pic090421_06.jpg pic090421_07.jpg

髪についてはシミュレーション結果をそのまま使用していますが、服の方はキャラクターのボディーが貫通する部分がかなりあったため、シミュレーションした結果をIPOカーブで編集できるようにベイクし、手動でキーフレームの調整を行っています。

以前、Vimeoにアップした動画では一定の間隔でキーフレームを間引くようにして、残したキーフレームを調整するというような方法を行いました。
しかし、今回の動画では瞬間的にかなり大きな変動が起こるため、キーフレームを間引くことはせず、全フレームにキーフレームを打った状態のままで使用しています。この場合、問題の起こっている部分のキーフレームを全て手作業で修正するというのは困難なため、
  1. まず、ボディーが服を貫通しているフレーム位置を調べ、特定のボーンについてある程度の範囲にわたってキーフレームを削除する。
  2. ボディーが服を貫通しないようにボーンの回転を調整し、適当な位置にキーフレームを打つ。
というような形で修正しました。
pic090421_08.jpg

この辺りについては、NLAエディタを使用すれば変形を修正するためだけのアクションを作成することもできますし、もっとうまく修正する方法があるかもしれません。


そして、もう一つ工夫した点を上げるとすると、髪のレンダリングの部分でアンチエイリアスがうまく利かなかったのを修正していることです。これについては、もしかすると何かのスイッチで解消できるのを私が知らないだけだったのかもしれませんが、「Render」パネルのOSAの値を変えたり、マテリアルの「Links and Pipeline」パネルでFull Osaを使用してもうまく回避できませんでした。

下の画像を見ていただくと、影の暗い部分の形がフレームごとに全く違う位置、形状になっているのがわかると思います。動画として再生する場合、この部分はちらちらと明滅するように表示され、せっかくカメラトラッキングで実写映像と動きを合わせていても、映像的にとても違和感のあるものになってしまいます。
pic090421_09.jpg

これに対する解決策としては、一旦倍の解像度でレンダリングしたものをもとの解像度に縮小する、ということでかなり改善できました。
pic090421_10.jpg

ただし、画像全体に対してこれを行ってみたところ、髪以外の部分では元のレンダリングにくらべて画像がぶれているような感じになってしまい、これはこれでちょっと問題があるという状況になりました。最終的には、髪だけを部分レンダリングしたものをアニメーション出力し、元の画像と2倍にレンダリングしたものを合成しています。
pic090421_11.jpg pic090421_12.jpg

pic090421_13.jpg pic090421_14.jpg

本来ならば、髪の部分だけを2倍にレンダリング、縮小を行った画像をオリジナルに合成すればいいのですが、今回は試しに全体を2倍サイズでレンダリングしてみたものが既に作成済みだったため、上のNode Editorの画面では髪の部分レンダリングはアルファ値のみを使用しています。
posted by mato at 01:16| Comment(2) | Blender | このブログの読者になる | 更新情報をチェックする
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。