2009年11月29日

イメージライブラリ(ImBuf)への統合

前回の更新からだいぶ時間がたってしまいましたが、この間ずっとvectexをBlenderのイメージライブラリに組み込み直す作業を行っていました。
少し前にBlender2.5 Alpha 0の公開がありましたが、こちらは相変わらずのBlender 2.49bベースとなります。

Linux 64bit

Linux 32bit

Windows 32bit


ソースファイルのパッチ (Blender2.49.2_Vectex_QtSVG_patch.zip)


vectexをイメージライブラリに組み込むことで以前のバージョンと比べて何が変わったのかというと、SVGファイルを開くための操作がPNG、Jpegなどの通常の画像ファイルを開くのと同じになったということです。

これだけだと何のためにこのように変更したのかよくわからないと思いますが、今回の修正でこれまでできなかったことが色々とできるようになりました。
今回は、その辺についての解説をしてみたいと思います。このため今回はプログラムのソースコードの中身の解説はありません。
ソースコードの変更内容については、今後Blender2.5ベースのソースコードに移植していく過程で少しずつ記事にしていこうと思っています。

SVGファイルを開く操作については、前回の更新のものまではTextureパネルで「Vectex」を選択し、表示されるパネルでファイル選択ボタンを押すという形になっていました。
今回のバージョンでも同じように、Textureパネルで「Image」を選択してイメージテクスチャとしてSVGファイルを開くことができます。
pic091129_02.jpg

Blenderには画像ファイルを開く時にサムネール表示でファイルを選択できる機能があり、ファイル選択ボタンをマウスクリックする際にキーボードの「Ctrl」キーを押すことでイメージセレクタが開きます。
今回はこのイメージセレクタでのSVGファイル表示にも対応しています。
ちなみに下の画像で表示しているのはUbuntuのアイコンを保存しているディレクトリを開いている様子です。
UbuntuをはじめとしたLinuxではデスクトップで表示されるアイコンにSVGファイルが使用できるようになっていて、SVGファイルで作成されている多数のアイコンが標準でインストールされています。
もし興味のある方は一度システムのアイコンディレクトリ(/user/share/icons/ など)をのぞいてみてください。
pic091129_03.jpg

このようにSVGファイルをイメージテクスチャとして開くと、レンダリング時にSVGファイルがテクスチャとして適用されます。
SVGファイルをテクスチャとして使用する場合の操作については、これまでのバージョンとほとんど同じです。

●新規に追加されたボタン
イメージテクスチャを作成すると、Imageパネルの横に「Vectex」パネルが表示されます。
今回、新しく追加した機能として固定サイズのビットマップ画像としてSVGファイルを使用できるようにしました。
「UseTileCache」をオンにするとこれまで通り通常のVectexとして解像度計算を行ってタイル画像を作成しますが、このボタンをオフにするとタイル画像の作成を行わなくなり、PNG、Jpegなどの画像ファイルのように固定サイズのビットマップとして使用できるようになります。
pic091129_05.jpg pic091129_06.jpg

このとき作成される画像データのサイズはデフォルトではSVGファイル内に記述されたサイズを使用しますが、これも今回追加した「UseCustmoSize」というボタンをオンにすることで、その横にある「SizeX」「SizeY」に指定した任意のサイズに変更することができます。
pic091129_07.jpg pic091129_08.jpg

●UV/Image EditorでのSVG画像表示
今回、UV/Image EditorでもSVGファイルを表示できるようにソースコードを修正しています。
もともとBlenderのUV/Image Editorには、UV座標にメッシュを展開した画像をSVG画像として保存する機能がありますので、その画像をUV編集時の下絵としてSVGファイルで読み込めたら便利なのではと思っていました。
pic091129_09.jpg pic091129_27.jpg

「UseTileCache」「UseCustomSize」ボタンは、UV/Image Editorの表示にも反映されます。
「UseTileCache」がオンの時は、マウスホイールでのズームのレベルに合わせてタイル画像が作成され、ズームの限界一杯になるまで最適な解像度の絵が表示されます。
「UseTileCache」がオフの時は、PNG、Jpegなどの画像の場合と同様にビットマップでの表示となり、ズームするとピクセルが四角形として表示されます。
このとき、「UseCustomSize」が有効なら指定した解像度のビットマップとして表示されます。
pic091129_10.jpg pic091129_11.jpg

UV/Image Editorでは画像を表示するだけでなく、ペイント機能を使って絵を描くこともできます。
SVGファイルを表示しているときにペイントしたらどうなるのか、ちょっと疑問に思われるかもしれません。
結果から言うと「UseTileCache」ボタンがオンのときにはペイントを行うことはできませんが、「UseTileCache」ボタンをオフにしていればペイントを行うことができます。
pic091129_12.jpg pic091129_13.jpg

ペイントした結果をPNG、Jpegなどのビットマップ画像として保存することができますが、SVGファイルとして保存することはできません。
ビットマップ画像として保存する場合、「UseCustomSize」でサイズを指定していればその解像度で保存されます。
注意が必要なのは、Vectexパネルで「UseCustomSize」をオン/オフしたり、画像サイズを変更したり、Base Colorを変更したり...というような操作をするとペイントした結果が破棄されてしまうことです。
もしSVG画像を元にしてにペイント画像を作成したい場合は、まずPNG、Jpegなどの画像データとして保存してからペイント操作を行うのが安全です。

●3D Viewでのテクスチャ表示
SVGファイルをビットマップ画像として使用する機能を追加することで、3D Viewでのテクスチャ表示にSVGファイルを表示できるようになりました。
このビットマップ画像は、GLSLマテリアル表示を行う場合にも使用されます。
pic091129_14.jpg pic091129_15.jpg

ただ、この3D Viewでのテクスチャ表示にはVectexのタイルキャッシュの機能は反映されません。
「UseTileCache」ボタンがオン/オフのどちらになっていても、表示される内容は同じです。
「UseCustomSize」ボタンの機能は有効なので、3D Viewでの表示で解像度が不足してピクセル表示が目立つようであれば、Vectexパネルで画像サイズを大きく変更することでテクスチャ表示を改善することができます。
pic091129_16.jpg pic091129_17.jpg

●3D Viewでの下絵としてSVG画像を表示

3D View表示ではモデリングを行う際に、下絵として画像ファイルを背景に表示することができます。
今回、SVGファイルを下絵として使用できるようにしました。
pic091129_18.jpg

「UseTileCache」「UseCustomSize」ボタンを使用したときのビュー上での表示の違いはUV/Image Editorと同じです。
3D Viewの下絵表示がUV/Image Editorと若干違うのは、最大ズームレベルがより高い状態にまで拡大できることです。
試してみたところVectexのタイル画像作成機能を最大ズームレベルまで行うと、メモリの限界に到達してしまうのか、Blenderがクラッシュしてしまいました。
クラッシュするズームレベルはLinux、WindowsなどのOSの違い、64bit、32bitの違いなどによって若干違うようですが、最大で2の20乗(画像サイズ 1048576 x 1048576 相当)までに制限することにしました。

もし、この限界近くまでズームするような場合、マウス操作に対する反応がかなり悪くなる可能性があります。
これは、Vectexの作成するタイル画像の枚数が非常に多くなるためです。
メモリの使用量がVectexパネルで指定されている「Mem Max」の値を超えていると、作成済みのタイル画像を削除する処理も加わるため、さらに負荷が重くなります。
もし、メモリに余裕があるなら「Mem Max」の値を大きくする(「0」を指定した場合は無制限)ことで、下絵表示を行っている3D ViewやUV/Image Editorでの操作をより快適に行うことができるようになると思います。

●ノードエディタ
SVGファイルを開く方法はここまでに書いたもの以外にもまだあり、ノードエディタとシークエンスエディタでも使用することができます。
ノードエディタには、マテリアルノード、コンポジットノード、テクスチャノードの3つの種類があります。
このうち、ノードエディタ上でイメージノードを使う際に、SVGファイルを使用することができます。
イメージノードを使うことができるのはコンポジットノードとテクスチャノードのみで、マテリアルノードでは使用できません。
pic091129_28.jpg

また、イメージノードを使う以外にSVGファイルを使用したイメージテクスチャをテクスチャノードとして使用することもできます。
テクスチャノードはマテリアルノード、コンポジットノード、テクスチャノードのすべてで使用可能です。
pic091129_29.jpg

ちょっと分かりにくいかもしれませんが、イメージノードとしてSVGファイルを使用した場合と、テクスチャノードとしてSVGファイルを使用した場合とでは、Vectexの機能のうち使えるものと使えないものとが違ってきます。

○マテリアルノード
マテリアルノードではイメージノードは作成できないため、テクスチャノードのみとなります。
あらかじめイメージテクスチャを作成しておき、SVGファイルを開いておきます。
ノードエディタのメニューから「Add」-「Input」-「Texture」を実行してテクスチャノードを作成し、作成しておいたSVGファイルのテクスチャを選択します。
同じようにノードエディタのメニューから「Add」-「Input」-「Geometry」を実行してジオメトリノードを作成し、出力の部分でGlobal/Local/View/Orco/UVのうちいずれかのマッピング座標系とテクスチャノードの「Normal」の入力を接続します。
このようにしてSVGファイルを使用する場合、イメージテクスチャのVectexパネルのボタンを操作することでタイルキャッシュのオン/オフやビットマップ画像として使用する場合のサイズ変更などを行うことが可能です。
pic091129_19.jpg

○テクスチャノード
テクスチャノードでは、イメージノードとテクスチャノードの両方を使用できます。
SVGファイルを使用したイメージテクスチャをテクスチャノードで使用する場合は、Vectexのタイルキャッシュ機能を使用することができます。
また、スケールノードを使用して絵の一部分を拡大すると、その拡大率に合ったレンダリング結果を得ることができます。
一方、テクスチャノードの中でイメージノードとしてSVGファイルを使用する場合は、Vectexのタイルキャッシュは効果がありません。
イメージノードのビットマップのサイズを「UseCustomSize」で変更することは可能です。
pic091129_20.jpg pic091129_21.jpg

○コンポジットノード
コンポジットノードではイメージノードとテクスチャノードの両方を使用できます。
ただし、コンポジットノードではVectexのタイルキャッシュは効果がありません。
テクスチャノードを使用するとレンダリング画面一杯に絵が引き伸ばされる状態になります。
もし、解像度が足りずにピクセルの四角形が目立つようなら、「UseCustomSize」を有効にしてビットマップの解像度を上げてください。
イメージノードを使用すると、レンダリング画面の中央にビットマップの解像度で絵が表示される状態になります。
この場合も、表示される絵が小さすぎる場合は「UseCustomSize」を有効にしてSVGファイルのイメージサイズを大きくしてください。
pic091129_22.jpg pic091129_23.jpg

●シークエンスエディタ
シークエンスエディタでは、イメージストリップとしてSVGファイルを使用することができます。
シークエンスエディタのメニューから「Add」-「Images」を実行することで、イメージストリップを作成できます。
ちょっと注意が必要なのは、これまでに説明したすべての方法についてはSVGファイルの設定を変更する際に、Buttons Windowのモードが「Shading(F5)」「Texture Buttons(F6)」の状態で表示されるVectexパネルを使用していましたが、シークエンスエディタで開いた場合にはこの方法ではイメージのデータにアクセスできないということです。
シークエンスエディタでは代わりにButtons Windowのモードを「Shene(F10)」「Sequence Buttons」の状態にしたときにシークエンスエディタ専用のVextexパネルが表示されます。
見ていただくとわかりますが、イメージテクスチャで表示されるVectexパネルと比べて使用できる機能が少なくなっています。
pic091129_24.jpg

シークエンスエディタでのVectexの機能は、基本的にはノードエディタの場合のコンポジットノードと同じような感じで、ビットマップデータとしてSVGファイルのサイズが変更できる程度のものになっています。
ただし、実験的にトランスフォームエフェクトを使用したときにだけタイルキャッシュ機能を使えるようにしてみました。
pic091129_25.jpg

なぜ実験的なのかといえば、タイルキャッシュが使えるのはある条件が満たされている場合に限られるためです。
その条件というのは、以下のようなものです。
トランスフォームエフェクトはSVGファイルのイメージストリップに対して直接適用する必要があります。
イメージストリップに何らかのエフェクトを適用した結果に対してトランスフォームエフェクトを適用した場合、タイルキャッシュは無効になります。
シークエンスエディタではトランスフォームエフェクトを含めてエフェクトをかけた結果に対してさらにエフェクトをかけるという操作を何重にも繰り返すことが可能ですが、タイルキャッシュを使えるのはSVGファイルのイメージストリップに直接適用されたトランスフォームエフェクトのみに限定されます。

●その他
今回の更新で追加された機能は、以上のような感じです。
そして、これは機能の追加とは違った話になりますが、今回の更新ではSVGファイルの描画に使用しているライブラリQtSVGのプログラミング上での扱いが変わっています。
具体的には、ダイナミックローディングという方法を使うことで、もしQtがインストールされていないPC上でBlenderを起動した場合でも、Vectexの機能が使用できなくなるだけで通常のBlenderとして使うことができるようにしています。

ただし、QtのようにC++で書かれているライブラリを直接C言語で書かれたBlenderでダイナミックに読み込むことはできません。
そのため、VectexのソースコードのうちQtに依存する部分だけを分離して、Blenderの実行ファイルの置かれている場所にある「Plugins」フォルダの中に置いてあります。
Linuxではlibqtsvg_vectex.so、Windowsではqtsvg_vectex.dllというファイル名になっています。
pic091129_26.jpg
posted by mato at 21:49| Comment(13) | Blender Vectex | このブログの読者になる | 更新情報をチェックする
×

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