カテゴリー: Blender

Blender, Programming

第1回 Blenderソースコードリーディング 準備:Blender2.6aのコードを読んでみる(1)

引き続き、ドキュメントのある Blender2.6a をベースにコードリーディングを進めます。

Blender 内の動作を確認する

デバッガで動作を確認する

  1. Blender を Debug 版でビルドする
  2. 起動
  3. Visual Studio(VS) で デバッグ/プロセスへアタッチ

これで Blender と VS が接続された。

ブレークポイントを張ってみる

とりあえず適当にブレークポイントを張って、Blender の挙動を確認してみる。
コードをざっと見て bf_blenkernel に mesh.c というのがあったので、そこの add_mesh が Blender でジオメトリを作成するときに呼ばれる関数だろうという目星をつけてブレークポイントを張る。

Space→Add Cube で Cube を作成しようとすると、ブレークポイントで処理が止まって各種情報を確認できるようになる。

call stack を辿っていくと add_primitive_cube_exec() が呼ばれていて、更に呼び出し元を辿ると wm_* 関数群まで戻る。このあたりが GUI のメニュー処理を行っている。
wm_* 内で引き継がれている引数 ot がメニューと実際の処理を紐付けるためのもので、この中にどのメニューの表示内容やメニューが選ばれたときに呼ばれる関数がまとめられている。

このようにして、特定の機能やコードを起点にその周囲の処理の流れを把握することができる。

このときの情報を元に、次にどの方向に進むかを考える。今回の情報だけでも

  • ジオメトリの生成や管理
  • GUI でのイベント処理
  • ot を中心としたイベント、メニュー、処理のテーブル管理
  • テーブル管理のためのアーキテクチャ

といった方向性に進んでいくことができる。

Blender 内の構造を確認する

Blender code layout を見ながらコードのレイアウトを確認する。

横方向の点線でレイヤが分けられていて、矢印でレイヤ間/レイヤ内の依存関係が示されている。

Application startup レイヤ

例として Application startup レイヤの説明をおこなう。Application startup レイヤは blender/source ディレクトリにあり、creator と blenderplayer モジュールから構成されている。この二つのモジュールは依存関係がなく、それぞれは “Editor definitions, drawing, interaction” 以下のレイヤの機能を呼び出している。

モジュールの複雑さ

全てのレイヤは基本的に下のレイヤに依存しているため、上位に行けば行くほど複雑に、逆に下位に行けば行くほどそれぞれのモジュールの機能はシンプルになっていることが想像できる。
図をボヤッと見ていてもどこから手をつけていけばわからないが、タイトル下部に書いてある矢印の図を参考に、下の方から見ていくのがコツ。

Utility Libraries(in own development)レイヤ

Utility Libraries(from external development)レイヤ以下は外部で開発されている共通ライブラリなので今回のコードリーディングの対象にはならない。興味があればそれぞれのライブラリのプロジェクトを調べ、個別に調査をする。

つまり、Blender が抱えるコードで最もシンプルなのはUtility Libraries(in own development)レイヤに所属するものということになるので、まずはここの構造を把握することから始める。

モジュール概観

このレイヤに所属するモジュールをざっと眺めてみる

  • メモリ管理
    • guardedalloc
    • memutil
  • 文字列処理
    • string
  • 数値解析
    • opennnl
  • シーンデータ管理
    • bsp
  • データ処理・ソルバー
    • audaspace
    • boolop
    • decimation
    • elbeem
    • iksolver
    • itasc
    • smoke
    • mikktspace
    • moto
  • システム・GUI
    • container
    • ghost

分類としては色々雑なものの、以上のような感じ。
このように同じレイヤ内でも全く異なる目的だったり、アプリケーション上での位置付けが異なるのものが並列して記述されているので要注意。ただ、このレイヤはあくまでもユーティリティライブラリなので直接 Blender の特定の機能と結びつくものではなく、汎用的な部品の扱いとなる。

また、モジュール一つ一つが VS のプロジェクトとして分けられている。例えば、smoke は bf_intern_smoke プロジェクトになっているので、ここのコードを辿れば Blender で使用している smoke solver の情報を得ることができる。

今回のまとめ

Blender の内部を解析するにあたって、実際の Blender の挙動から処理の流れを追う方法と、コードレイアウトのドキュメントから Blender の構造を把握する方法の二つの方法をおこなった。この二つの方法を用いることで、アプリケーションの構造を把握するための糸口を掴むことができるようになる。

引き続き、Blender Architecture を参考にしながら Blender の論理的な構造を探っていく。

Blender

第1回 Blenderソースコードリーディング 準備:Blenderをビルドする

酔っ払った夜中のツイートの流れでウッカリ全世界が熱望してきた“第1回 Blenderソースコードリーディング”というのをやることになったので、まずは準備として Blender のビルド環境を用意したメモを残します。

参加者の皆さんは当日コードのチェックアウトをしているとそれだけで一日おわってしまうので、この記事を参考にひとまずビルドして Blender が実行できるようになるまでは環境を整えておくと当日ダッシュで濃~い話ができるんじゃないかなと思います。

今回はまず入り口からということで比較的内部のドキュメントがまとまっている 2.6 のコードを参考にするために環境を構築してみました。Windows7/VS2008 で用意しています。

コードの取得

clone

https://developer.blender.org/diffusion/B/

存在するドキュメントは 2.6 の時のものなので、この頃のコードを用いて環境を構築する。リポジトリを見ると 2.6 の次に Bug fix 版として 2.6a があったので、そちらを使用することにする。

git clone git://git.blender.org/blender.git
cd blender
git submodule update --init --recursive
git submodule foreach git checkout master
git submodule foreach git pull --rebase origin master

リリース時につけられる tag もここで確認できるので、必要なバージョンのコードを抽出する際は参考にする。

コードのチェックアウトはものすごく時間がかかるので注意。

git.exe clone      --progress -v  "git://git.blender.org/blender.git" "D:\chiyama\Documents\Projects\OpenSource\blender\blender"

Cloning into 'D:\chiyama\Documents\Projects\OpenSource\blender\blender'...
remote: Counting objects: 797630, done.
Receiving objects: 100% (797630/797630), 249.43 MiB | 78.00 KiB/s, done.
Resolving deltas: 100% (698733/698733), done.
remote: Compressing objects: 100% (98387/98387), done.
remote: Total 797630 (delta 698733), reused 794130 (delta 695726)
Checking connectivity... done.
Checking out files: 100% (7749/7749), done.

Success (10762719 ms @ 2014/10/13 16:25:46)

約三時間(!!)

Blender 2.6a のコードを取得

clone 後、v2.6a タグのついた部分をチェックアウト。

https://developer.blender.org/diffusion/B/browse/master/;v2.60a

※今回は clone してから checkout してしまったので二度手間になってしまった。 git clone -b (branch name) というのがあるようなのでそちらを使った方が楽かも。

外部ライブラリを取得する

http://wiki.blender.org/index.php/Dev:Doc/Building_Blender/Windows/msvc/CMake

VS2008 を使ってビルドするので以下を実行

svn checkout https://svn.blender.org/svnroot/bf-blender/trunk/lib/win64 ../lib/win64

チェックアウト先は (リポジトリ)/../lib/win64 と、リポジトリと並列な場所にする必要がある

最新のものでは Python のバージョンが異なるので、これも当時のものを使用する必要がある。リポジトリを見ると Rev.60366 が該当するリビジョンらしい(ので、チェックアウト時にリビジョンを指定する方がよい)。

ビルド

ソースコードから Blender をビルドする

http://wiki.blender.org/index.php/Dev:JA/Doc/Building_Blender

ビルドシステムは SCons と CMake が選べる。私は CMake を選択。
あと、Building Blender on Windowsを見ると SCons から CMake に 移行してるっぽい?

プロジェクト生成

CMake GUI で VS2008 用プロジェクトを生成。バイナリ出力先は (リポジトリ)/../build に設定。インストール先も指定できるが、2.6a のタグ付きのところから持ってきたせいか、これは使用されないっぽい。

WITH_INTERNATIONAL がオンになっているとLibIntl for Windowsが必要っぽい。本質とは関係ないしメンドイので今回はオフ。

最後のリンクでも OpenEXR 関係のライブラリが無いと言われてコケるので、プロジェクトの設定を修正。CMakeLists.txt のここ?

if(WITH_IMAGE_OPENEXR)
        if(MSVC90)
                set(MSVC_LIB _vs2008)
                set(MSVC_INC)
        elseif(MSVC10)
                set(MSVC_LIB _vs2010)
                set(MSVC_INC _vs2010)
        else()
                set(MSVC_LIB msvc)
                set(MSVC_INC)
        endif()
        set(OPENEXR ${LIBDIR}/openexr)

ここのバージョン判別部分をゴッソリ削って

if(WITH_IMAGE_OPENEXR)
        set(OPENEXR ${LIBDIR}/openexr)

こうする。

コード修正

OpenEXR のパス周りで幾つかエラーが出るので修正する。

3>..\..\..\..\..\..\blender\source\blender\imbuf\intern\openexr\openexr_api.cpp(66) : fatal error C1083: include ファイルを開けません。'half.h': No such file or directory
>..\..\..\..\..\..\blender\source\blender\imbuf\intern\openexr\openexr_api.cpp(67) : fatal error C1083: include ファイルを開けません。'IlmImf/ImfVersion.h': No such file or directory

何故か IlmImf ディレクトリが指定されているので、 OpenEXR にかきかえる

インストール

INSTALL プロジェクトがあるので、これをビルドするとインストールされる。
インストール後、 blender.exe を実行して Blender が起動すれば成功。

Blender, CG, コンピュータ

オープンソースソフトウェアの醍醐味

最近はエイプリルフールが世間にガッツリ定着してしまって、どこもかしこも嘘だらけでつまんないので逆張りしてガチネタで攻めます。天邪鬼天邪鬼。

ここ一、二年、一般的な CG 屋さん達からも Blender が注目を集めてきていています。最近はそこに Softimage の開発終了のニュースがあったために更に注目を浴びることになっています。

それはそれでいいことですが、Blender を使うということに対して何かいろいろ的外れな言及が多い(というか、そればっか)ので一度自分の意見をまとめてみました。


一番違和感を覚えるのが “無料=お金がかからない” という紹介です。これはもう完全に的外れです。タダだから使うというのは、情熱と時間が有り余って、でもお金がない学生さんならともかく、いい大人(しかもプロ)がそれ基準でものごとを決めるのは “本気!?” と思ってしまいます。正直、発想が貧乏臭いです。

はっきり断言しておくと、Blender を使うことでお金がかからないとか安く作品を作ることができるということは全くありません。自分達が割くリソースの内容と、その投入先が市販ソフトウェアを使う場合と異なるというだけです。そもそもソフトウェア代なんて人件費に比べたら誤差みたいなもので、それが高いというのは(ry

繰り返すと、投資の質と投資先が異なるというだけです。

市販ソフトウェアは既にある程度実績があって商品としてパッケージングされたものをお金を払って使うものです。それに対し、オープンソースソフトウェア(特に発展途上なもの)はそこにあるものを自分の力で使えるようにするという努力が必要になります。

例えて言うなら、市販ソフトウェアを使うのがコンビニ弁当を買って食べるということだとするとオープンソースソフトウェアは山や海に行って、自分で食材を集めて調理するようなものです。材料そのものにはお金はかからないかもしれないですが、そのかわりに現地に行く労力や食材を育てたり狩りをするためのスキルが必要になります。

そのためのスキルを身につけるには相応以上のコストを払う必要があります。Blender を使おうかと言っている人で、そういったコストを払う覚悟がある人はどれくらいいるんでしょうか?かなり疑問です。

また、無料だからという理由で飛びつくのも、それを吹聴するのも自分の首を締める行為にしかなりません。無料で制作ができる=自分たちの仕事をするためにかかるコストが安いですよというメッセージに受け取られ、結果的に映像制作をするということの価値を下げることに繋がります。それがみんなが求めている未来なのでしょうか?

大事なのは、”無料だから使う”ではなく、”使いたい使い方があるから使う”、そういう発想で道具を選ぶことです。これは極々当たり前のことですね。でも、”無料”の二文字の前にはそういう判断ができなくなる人が多いようです。

そして、Blender を始めとしたオープンソースツールを使用すること、ひいてはオープンソースソフトウェアのコミュニティに参加することの醍醐味はもっと別のところにあります。

開発力があればオープンソースソフトの開発に携って、自分達の力でソフトウェアをより良くすることができます。これは最もコアなかかわり方と言えます。

開発力が無い人は指をくわえて見ているだけか?というとそんなことはありません。
自分たちが欲しいと思ったら、自分で足りない部分を補っていけばいいのです。日本語マニュアルが欲しかったら自分が翻訳してみる、アーティストであれば自分の作った作品を公開してみる。これもコミュニティに参加するためのアプローチの一つです。
極端な話、インストールが難しいソフトウェアであればインストールマニュアルを作るというのも貴重な(そして、とても感謝される)貢献になります。

こういった、自分ができるアクションを起こすことで世界中の Blender チームの一員になるとができ、また、世界中の Blender チームを自分たちの一員にできるのです。そうなれば、世界中の開発者、研究者、アーティストと協力して新しい価値を生み出すことができるようになります。

そのためのコストは決して小さいものではありませんが、それ以上に得られるものがあります。

「ウチは CG をつくる会社だから関係ないよ」という意見もあるかもしれません。でも、考えてください。コミュニティの一員になることで、特定のベンダの呪縛から逃れることができます。SIGGRAPH で発表された、あの会社の使っていた技術がすぐに手元に届きます。しかも、開発者と直にディスカッションできます。自分が欲しいと思った表現方法を提案して賛同者を募ることもできますし、資金援助することで自分達が使っているツールを直接的により良くすることもできます。

これらの可能性を、今掛けているのと同等かそれ以下のコストで実現できる可能性を秘めているのが Blender であり、オープンソースコミュニティなのです。

無料だから使うっていう貧乏臭い発想より、こっちの方が断然ワクワクしませんか?

自分たちの手で未来を切り拓きましょうよ。

Blender, CG

Blender新春緊急オフ会 in Tokyo

2/27日に Blender オフ会があったので参加してきました。Blender の開発や映像制作に勢力的に活躍されているMatt氏やBlender本の著者、トニー氏がいたので、飲んだ勢いに任せていろいろ聞いてみました。

思い出せたことを殴り書きしている状態なので見にくいです。すみません。あと、追加で思い出したことがあれば随時付け加えて行きたいと思います。

・アクティブな開発者は?
-大体10人だけど、他にもいろいろいて全体で4〜50名くらい

・何でZUpなの?
-歴史。BlenderはAmigaのソフトを真似して作ってて、それがZUpだった
-変えるのは難しい

・プラグインシステムほしーよー
-(私)ビルド/起動/テスト/リビルドのサイクルを早めたい。アプリの再起動はストレスフル
-ただの機能で、それ自体は何もしないからプライオリティは低い
-全体コンパイルしても早いから十分
-起動も2秒だから十分!!
-(私)モジュールとして配布したいよー
-Blenderは無料でオープンソースだからそのまま配ればいいじゃん

もうちょっと説得力のあるネタ(と英語力)を用意しないとダメかー

・GPL
-(私)BlenderがGPLなので、プロプライエタリなツールを作りづらい
-(私)また、コードの公開/非公開で差別化できない
→例えば、sendmail は最新版はお金を支払った企業に対してのみ公開、オープンソース版は古いバージョン
-内々で使うには別に問題ないよね?
→”内々”にもよる。協力企業だった場合は?とか結構微妙。ソースコードを公開するのに抵抗がある人たちもいる(特にスーツの人たち)
-ソースはただのソースなんだから公開しちゃえばいいじゃん
→それは同意。ただ、そうは思わない人たちもたくさんいる

これはプラグインシステムとも関係してくるところで、母艦になるソフトがGPLでもプラグインという形態だと別のライセンスを取る事もできるため、ビジネスには使いやすいという側面もある・・・と言いたかったけど十分説面できずorz

・Blenderの普及について
-結局、どこかがサポートを担保しないと普及しないんじゃないか
-Blenderは無料なのが強い。学生はお金がないのでBlenderで勉強して、仕事でも Blender を使ってくれる(これについては私は否定的。商用版でも学生版は安いし、 Blender では職は得られない)
-Matt氏の周りでは、最初は一部だけBlenderを使っていたが最終的には全員がBlenderを使って仕事をするようになったらしい

・その他
-Blender for RenderManは?
→今はメンテナンスされてない。が、2.5になると格段にそういうツールを作りやすくなる(だからガンバレ!!ってこと?w)
-日本語対応
→開発者の中に日本語のことが判る人がいない。ただ、問題はわかっている。助けて!!
→(私)日本語対応は結構メンドクサイ。コードを書くのは簡単だけど、その恩恵を受けない開発者に意義を説いて浸透させるのが大変。私だって普段はマルチバイト対応しない。メンドクサイもん(笑

その他にも私が今後考えている(Blenderとはあまり関係ない)プランの説明とかベジマイト信じられない!→納豆の方こそ→I Agree!! とかそんな話をしました。

通常の会話もかなり厳しいのに、ライセンスの話とかビジネスモデルの話をするのは大変ですよ。。。もっと英語を勉強しないとなぁ。

Blender, CG

Blender2.5 Alpha1


数年ぶりに Blender を触ってみようかなと思い立って WBS+ さんのところのチュートリアルなどを見ながらボチボチ触っています。

Blender ってオープンソースのソフトには珍しいくらいドキュメントが充実していて、使い始めるためのとっかかりがたくさんあるのが素晴らしいです。これで、アノ独特すぎる UI がもっと普通なら、ものすごい勢いで普及してもおかしくないんですけどね。。。

久しぶりに使ってみても、独特の UI には慣れ辛いです。それと、初めて知ったんですが Blender って、座標系が 3ds max と同じ ZUp なんですね。これはかなり嫌な感じです(笑。CAD 出身でもないのに、何でこんな座標系を採用したのか・・・謎すぎます。

その Blender ですが、これまでの 2.4 系から大幅に UI を改良した 2.5系のアルファ版の開発が進んでいます。公式ビルドとしては Alpha0 が配布されていますが、svn 版は Alpha1 になっているようなので、svn 版を独自にビルドすることにしてみました。

いろいろとドキュメントを探していると Building Blender というものを発見しました。しかも、このページは 2.5 系列まできちんとサポートしていて、私もほぼここの記述の通りに作業するだけでビルドができました。素晴らしい!!

自宅環境は Mac なので 2.5/Mac を参考にして

  1. ソースコード取得
  2. 外部ライブラリ郡取得
  3. SCons でビルド

という手順と、あとは私の環境に合わせたちょっとした調整で完了。朝と夜にわけたものの、思い立ってから数時間の作業で自前ビルドの Blender を使うことができるようになりました。この規模のソフトウェアがこれだけ楽にビルドできるのは驚きです。

特に助かったのが、2 の外部ライブラリの部分です。普通はこれだけでかなりの時間を割かれる(そして挫折するw)ところを、Blenderチームは必要なものを自分たちでまとめて管理していてくれて、svn サーバーからチェックアウトするだけで全部揃うようにしてくれています。

独特すぎる UI や座標系などがあってこのまま自分のメインツールにするのはちょっと躊躇してしまう Blender ですが、自分で改良できるのは大きな魅力です。頑張れば UI をゴッソリ入れ替えて Maya っぽくできちゃうかもしれないですしね(笑

そんな妄想も膨らませながら、もうちょっと触ってみたいと思います。

Blender, CG, Programming

Blender一人読書会

CGソフトの内部構造が知りたかったので、Blenderのソースを読んでみました。ドキュメントを色々探したところ、blender.org – Architecture がBlenderの内部構造解説の決定版ぽいです。

ここを読めばアナタも Blender Master!! …というわけにはいかないですが、解析のための大きな手掛かりになります。
特にページ下部にあるソースコードの構造図はものすごく参考になります。この手の解説は古すぎて最新版では全く参考にならないことが多いのですが、私が見た限りこの図の通りの構造になっているようです。

あとは、Adding new Space Window のように、機能を追加する際の手順を解説してあるドキュメントを参考にするとデータや関数の相互関係の理解がしやすいです。で、これを読んでわかったんですが Blender って機能拡張しようとするとかなり厄介です。ソースコードのあちこちに依存関係が散らばっていて、それを把握するだけでも一仕事です。最近であればきちんとクラス化して、必要な部分を埋めていくだけで機能拡張できるようなアーキテクチャにするんでしょうがBlenderは定数定義、新関数の定義の嵐で目が潰れそうですwww

このあたりまで目を通せれば当初の目的は大体達成できたので、これぐらいでやめておきます。

Blender は思っていた以上にドキュメントが充実していて、比較的簡単にソースコードを読むことができたのはうれしい誤算でした。オープンソースの統合型3DCGソフトなんて他にないので、とても助かります。

ただ、内部の構造が余りにもスパゲティすぎるのが困りものです。ガイドがないと手も足も出ません(苦笑。
アーキテクチャも柔軟性に欠けるし、コアから書きなおしたほうがいいんじゃないか?というのが正直な感想です。


(追記)Hackers Guideに、実際にコードを書く時の情報がまとまってます。