2011年9月11日日曜日

camera_distortion.pyなるものが。

ある日ツイッターで目に止まったこちらのブログのポスト、
記事のタイトルを見てみると


という非常に期待せざるを得ない感じだったのでさっそく訳してみました。
いつものように抄訳かつ適当に意訳だったりメモがわりの補足も含んでいるので
正確な内容を知りたい方はオリジナルの記事を参照してください。

で、以下から訳。



今回の記事は不均等な透視投影によりメッシュを変形させるエフェクトを実装した
BlenderのPythonスクリプトのコンセプトプルーフに関してです。

いわゆるセルアニメではキャラクターがシーンに存在するカメラや視聴者の視点に
近づいた際に、現実にはありえないような極端な変形を伴った絵として描かれることが
あります。例えば、キャラクターが腕を前につきだした時などです。そのときの腕の
大きさは画面に向かって手が伸びてくるような印象を与え、迫力を出すため、写実的な
表現として適切なサイズよりも大きく誇張して描かれることがあります。

今回のスクリプトの目的はこのような誇張のための変形をblenderで実現することです。
このスクリプトの基本的な考え方はカメラとオブジェクトの頂点間の距離に対して、
カメラの焦点距離を変化させてしまうという方法です。

焦点距離はblenderのカメラがもつパラメータの一つです。これは透視投影の際に画像の
アスペクト比を定義するのに用いられています。カメラとオブジェクトの距離を変えずに
焦点距離だけを大きくしたとすると、レンダ結果の画像に写るオブジェクトのサイズは
大きくなります。

今回のスクリプトはシーンに存在するメッシュオブジェクトに対して不均一な透視投影
処理を行うことでオブジェクトを変形させています。この不均一な透視投影のための
変換行列はカメラとメッシュオブジェクトの頂点間の距離から焦点距離を算出する関数と
して定義されています。カメラからオブジェクトの頂点までの距離はそれぞれの頂点ごとに
異なるため、算出される焦点距離も各頂点ごとに異なったものになります。

わかりやすく説明するため、焦点距離が50mmと80mmという二種類の値になったとします。
シーンの遠いエリアを焦点距離50mmのカメラで、その他の近いエリアを焦点距離80mmの
カメラでレンダリングして一枚の画像として出力すると、シーンは均一なパースにならず、
結果としてシーンに存在するオブジェクトは変形して描画されます。

実際にシーンをレンダリングする際には、先ほどの例のように焦点距離の値があまりに違い
すぎると焦点距離が切り替わる部分で出力される画像が滑らかにつながらず、ツギハギの
ような状態になってしまうことが予想されます。

そのためカメラと頂点間の距離から焦点距離を算出する際には下図のように滑らかで
連続した値が得られるように非線形補完を行っています。

[図1. カメラ-頂点間の距離と焦点距離の対応]

グラフの横軸はカメラと頂点間の距離、縦軸は焦点距離です。それぞれの最大値、最小値、
途中の区間で指定している値はデフォーマのパラメータとしてユーザーが定義できます。


以下の画像は不均等透視投影による変形の効果を示すサンプルです。
左端と右端の画像は同じオブジェクトを焦点距離50mmと80mmに設定したカメラで
それぞれレンダリングしたものです。
中央の画像は今回のスクリプトを適用して変形した状態のものです。モデル足元など
カメラから遠い部分は焦点距離50mmでのレンダリング、頭などのカメラに近い部分は
焦点距離80mmでのレンダリングに似た結果になっています。

[図2. 変形のサンプル(左から焦点距離50mm、変形を適用、焦点距離80mm)]

最後に上のサンプルで使用したスクリプトのリストを示します。

使用にあたっての制限事項としては

a. このスクリプトで変形を適用できるのはメッシュオブジェクトに対してのみ
b. シーンにあるメッシュオブジェクトそのものを変形します
 (オリジナルのバックアップのためのコピーなどは作りません)。
 また、オブジェクトを実際に変形させているためアニメーションのレンダリングには
 向きません。
c. ミラーモディファイアを使用している場合は事前に適用してモディファイアスタックから
 削除しておく必要があります。

また透視投影の仕組みを利用しているため、カメラはパースペクティブカメラでないと
適切な結果が得られません。



と、こんなところでしょうか。
まさに前回ふれたPencil+のパース変形モディファイヤ的なスクリプトのようです。
訳の最後にあるように制限がいくつかあるものの非常によさげです。
なんというか、ありがたいというか申し訳ないというか。
ありがたく頂戴しつつ作成中のモデルでテストしてみる感じで。

---------------------------------------------------------------
コメントなどありましたらこちらへ->web拍手

2011年8月22日月曜日

目玉つくった

今作ってるモデルの目玉は現状ボールにテクスチャ貼っただけ。
それだとちょっとつまらないのでトゥーン用モデル向けの目玉を作ってみたり。
bloggerのテストも兼ねて動画あげてみた。

video

これをベースにもうすこしいろいろ仕込んでいきたいところ。

あとは拍手お返事など。

>モデルも線画もシェーディングも良い感じですね。
>Twitterのほうを見ていて疑問に思ったのですが
>perspective geometry modifierとはどういったモディファイアでしょうか?
>透視変換行列を掛けるみたいな機能でしょうか。

ありがとうございますー。
Pencil+のパース変形モディファイヤ的なことができたらなー、とかなり適当に
つぶやいていました。詳細な仕組みや原理などはよく理解していません…。
すみません。

blenderでもラティスなどでモデルを変形させたり、コンポジットノードのレンズ歪み
等で似たような効果が出せないかと試してはいるもののなかなかうまくいかず、
freestyle統合版のシェーダー、もしくはモディファイヤとして実装されたら
それはとってもうれしいなって…という感じです。



というわけで、いろいろとうまいこととっかかりがつかめれば行けそうな気もする
けれどうまくいかず…そんな具合にしばらく試行錯誤してみる感じで。

---------------------------------------------------------------
コメントなどありましたらこちらへ->web拍手

2011年8月18日木曜日

仮想化ソリューションさん続き


体ができてしばらく放置気味だったけど、頭に着手。こんな感じ。



レンダリングはblenderのFreestyle統合版。
最近コードベースが2.59になってよさげ。

眉忘れてたので追加。大事なメガネも忘れちゃいけない。



眉毛とメガネって印象変わるなーと実感する結果にw
髪をそろそろ真面目に作り始めないと終わりが見えない予感。

次のイメージキャラクター的なものも出てきてしまったので
ペースを上げていきたいところ。

---------------------------------------------------------------
コメントなどありましたらこちらへ->web拍手

2011年7月31日日曜日

今のところこんな感じ

前回作り始めたの、とりあえずこんな状態に。
レンダはいつもと同じFreestyle統合版blender(ver. 2.58.1)



というわけで作り始めた某M$の仮想化ソリューションさん(仮称)ですが
作業時間は1日平均30分ほど。で、ここまで2週間くらい。

今までだとこれくらいまで出来上がるのは3週目以降な感じなのでかなり早い予感。
従来は頭部から作り始めていたのを、今回あえて体からつくるようにしたのが
よかったのかも。顔から作るとどうしてもいろいろテストレンダしては、
あまり意味なく悩んで手が止まったりしてしまうので。

あとblenderのToonとFreestyleのコツがなんとなくつかめてきたのか、
イメージする結果に寄せていく際に迷走することが少しは減った気も。

昔、Lightwaveとunrealのサンプルとして見たようなセルシェーディングは
blenderじゃ無理だろなーと思っていたけれど、標準でToonシェーダがついて
Freestyle統合版なんて素敵なものができたおかげで今やかなりいい感じに。

上の画像の時点ではまだ標準のToonとFreestyleのエッジだけでノードとかは
使ってないので詳細作りこみつつ、その辺も手を加えていく感じで。

---------------------------------------------------------------
コメントなどありましたらこちらへ->web拍手

2011年7月20日水曜日

なんかまたつくりはじめた

こんな感じ。



ツイッターのTLに流れてきたのを見て突発的に作り始めちゃったけど
今月中に終わらせたいところ。
多分Freestyle向けなのは相変わらずだけど、テストも兼ねてノードで
いろいろやってみたい感じで。

---------------------------------------------------------------
コメントなどありましたらこちらへ->web拍手

2011年5月18日水曜日

CUDA対応cyclesなblenderのビルドとちょっとしたベンチ

いろいろ迷いつつどうにかCUDAなCyclesをビルドできるようになったのでメモ。
ついでにCPUとGPUを比較するためのちょっとしたベンチも。


・使用したOSとハードウェア構成

OS:Ubuntu10.04LTS 64bit
CPU:PhenomII X6 1055T
チップセット:785G
GPU:Quadro600

GPUはCUDA対応のものを。ここ2・3年のnvidiaのGPUであれば多分大丈夫。
以下は手元のUbuntuなPCで行った手順を記載していますが、おそらくOSXや、
WindowsのCygwinやMinGWでも同様の流れでできるかと。試してませんが・・。



・CUDA環境の準備

まずはCUDA対応のGPUドライバとSDK、ツールキット等の開発環境の準備。
nvidiaのホームページからダウンロードしてインストール。
ドライバはv270系、SDK・ツールキットはv4.0を選択。

今回使用したのは下記のバージョン。
ドライバ:270.40
SDKとツールキット:ver4.0.13

以上のものがインストールできたら、自分のGPUが対応するCUDAのシェーダーモデルの
バージョンを調べておくとあとで少しばかり楽ができる。
CUDA SDKのサンプルに含まれているdeviceQueryやdeviceQueryDrvを実行して
確認してもOK。



・ビルドの手順

事前にインストールしておくライブラリやビルドの手順はblender.orgの公式Wikiを参考にしていけば
基本的にOK。ただし、Ubuntu10.04ではデフォルトでインストールされるboostのバージョンが
1.40と古いためエラーが出てビルドが通らず・・・それに気づくまでかなり嵌りました。

というわけでより新しいバージョンをソースからビルドしてもいいのですが、ppaでboost1.42が
提供されているのでそれを利用させていただく感じで。

$ sudo add-apt-repository ppa:lucid-bleed/ppa
$ sudo apt-get update


としてaptリポジトリに追加したら、aptitudeでいつものようにインストールすればOK。

あとはOpenImageIOとcyclesなblenderのソースをそれぞれダウンロードしてビルド。
この辺は先ほどの公式wikiに記載のとおり。

CUDA対応でビルドする場合のcmakeのオプションは手元の環境だとこんな感じ。

$ cmake ../blender
-DCMAKE_BUILD_TYPE=Release
-DCYCLES_OIIO=../oiio/dist/linux64
-DCMAKE_EXE_LINKER_FLAGS=-lGLEW
-DCMAKE_EXE_LINKER_FLAGS_RELEASE=-lGLEW
-DWITH_CYCLES_CUDA=ON
-DCUDA_INCLUDES=/usr/local/cuda/include
-DCUDA_LIBRARIES=/usr/local/cuda/lib64


CPUなどのスペックによってはcubinのビルドに時間がかかるので、始めに調べておいた
自分のGPUが対応しているシェーダーモデルのバージョンだけビルドしてもOK。

でcmakeが終わったら、あとはmake、make installすれば完成。



・実行

無事にビルドがエラー無く済んだら
$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:../oiio/dist/linux64/lib
という感じにライブラリのパスを設定して
$ ./bin/blender
で起動。

いつものblenderが起動したらレンダラを"Blender Render"から"Cycles"に変更して、
プロパティウィンドウの"Render"タブに以下のようなレンダリングデバイスを選択する項目が
表示されているか確認




上の図のようにCPUとGPUが選べるようになっていればCUDAに対応したCyclesが
正しくビルドされてblenderから利用できる状態になっている。

ちなみに何か問題があってうまく行ってないと下の図のような感じ。




ここまで無事に完了したら先程のライブラリパスの設定を
~/.bashrcに書いたり、起動用のシェルスクリプトを作成しておくとよさげ。



・CPUとGPUでベンチ

で、せっかくビルドが完成したのでGPUでのレンダがどれだけ早いかちょっとテスト。
下図のデフォルトのシーンをパス256、解像度1280x720に設定してCPUとGPUでレンダ



その結果、およそCPUで2分だったものがGPUで1分30秒という具合に。
解像度やシーンを替えてレンダしてみましたが、やはり平均で25%ほどGPUの方が早い感じです。

ところで、今回使用したGPUのQuadro600のGPUコアはGF108相当。
GeforceでいえばGT430相当のローエンドなスペックです。
それでもドライバの最適化等によりOpenGLアプリでディスプレイデバイスとしての
利用であればGeforceのハイエンドモデル以上(Nvidiaの発表によればGTX580以上)の
フレームレートが出るというのが面白いところ。

しかし、CUDAやOpenCLなどGPGPU用途での演算能力としてはコアが持っているシェーダー数と
動作クロックに準じたものとなり、コアが同等なGeforceローエンド相当の性能しかでません。
ひとつ上のQuadro2000でもコアはGF106相当なのでミドルレンジのGeforce GTS450程度です。

そんなGPUでもこれだけの差が付くのであれば、安価に購入できるミドルレンジのGeforceを
GPGPU用に追加するというのもよさそうです。GTS450の2倍のシェーダーを備えるGTX560Tiでも
20k円なのでCyclesだけでなくLuxRender等でのレンダも考えるとコストパフォーマンスの点で
かなり魅力的です。


Cycles自体もまだ開発の初期なので、これから効率が改善されていく可能性も十分にあります。
また現状インテグレータはパストレーサーのみですが、それ以外のアルゴリズムを実装する
予定もあるそうなのでそれによってもレンダリングの高速化が期待できるかと思います。

ただ、Cyclesのプロジェクトの予定としては今後1〜2年の間に既存のblender内蔵レンダラを
置き換えられるものにするのが目標とのことなので、しばらく気長に追いかけてくのがよさそうです。



---------------------------------------------------------------
コメントなどありましたらこちらへ->web拍手

2011年5月17日火曜日

Face Bone Toolを使ってみた

前回製作中だったやつ一応完成。レンダリングはいつもどおりblender2.57系Freestyle統合版。



最初は男性素体つくろうかなっていうのと、モーション練習用になんかキャラクタデータ欲しいなと思い
作り始めたもの。ただ作ってくうちにのっぺらぼうはつまらないので顔つくって、せっかくだから髪も・・
という具合になっていってこんな感じに。

今までは口を作るのが苦手でテクスチャで済ませていたけれど今回とりあえずモデリングできた。
時間もこれくらいなら以前に比べるとそれほどかけずにできるようになってきたのもよさげ。


で、せっかくなので顔の表情をつけてみたくなったのでFace Bone Toolを試してみたり。
2.56で動作するらしいけど、2.57ではどうだろう?と思いつつ試してみたらたまにエラーが出たりする。
けれどめげずにしばらくいじってたらこんな感じにボーンとウェイトのセットアップが自動で完了してた。



とりあえずちょっと表情をいじってみた。



おもしろい。これがボタン数回押すだけでセットアップ完了するなんてありがたすぎます。
ちゃんと位置やサイズの調整をすれば適切な場所にボーンが追加できそうなので調べていく感じで。


---------------------------------------------------------------
コメントなどありましたらこちらへ->web拍手