タグ別アーカイブ: 3DCG

Blenderを中心とした3DCGに関する話題。

64ビットLinuxで32ビットアプリを利用する

また久々の更新。

ようやく衝突判定処理の実装が一段落し、リハビリも兼ねて一ヶ月以上触っていなかったBlenderでボチボチモデリングを始めた。

ここ最近、今まで使っていた32ビットCPUに限界を感じ、64ビットCPUのPCに買い換えていたのだが、今までそれで得に問題もなかったのだが、ここで初めて問題が生じた。どうも64ビット版Linux(Ubuntu)のBlenderに問題があるようだ。

具体的に言えば、Weight Paintモードで、ボーンを切り替えるときにすごいタイムラグがかかる。ボーンを選ぶ度に10秒くらい待たされる。これはやってられない。ネットで検索してみてビデオカードが原因だとか書いてあるところもあったが、いろいろ比較調査してみると、どうもビデオカードよりも64ビットLinux版Blenderの特有のバグだという結論に至った。

そこで、問題のなかった32ビットLinux版Blenderに戻したいのだが、やっぱり64ビットLinuxで32ビットのアプリはそのまま動かないのだね。ちょっとググってみたら、ia32-libsというのをいつもの須藤さんでインストールすればイイみたいだ。

sudo apt-get install ia32-libs

この後、再ダウンロードした32ビットLinux版Blenderを実行したら、問題なく起動したし、64ビット版で起きた問題も発生しなかった。幸せ!

(追記:Blender.orgにバグレポート書いたけど、VMはサポート対象外と却下されたピョン。)

inkscape

テクスチャといえば、BlenderのUV/Image EditorでUVsのメニューからExport UV LayoutでSVG形式で保存、inkscapeで編集したあとに、さらにPNGにエクスポートし、そのPNGファイルをBlenderでテクスチャファイルとして使う方法が好きです。

inkscapeとはドローツールで、フリーのドローツールといえばinkscapeが一番大きなシェアを占めている(っぽい)。商業的なドローツールはアドビのイラレストレーター(通称イラレ)が有名どすね。

ドローツールはペイントツールに比べて直感的な即物的な編集は苦手だが、後で色を変えたりサイズを変更したりするのは得意である。質より量的な、デフォルメの効いたモデリングを目指す自分にとってはぜひ使いこなしたいツールです。

けっこうinkscapeは使っているつもりなのだが、きょうはけっこう基本的な小手先テクを知った。ボックス選択はてっきり出来ないと思い込んでたのでうれちい。

ボックス選択 -> マウスドラッグ(左ボタン)で出来る。

コピー元と同じ位置にペースト-> Ctrl+Alt+V

http://inkscape.org/?lang=ja

今日は法線を設定しちゃうぞ

Blenderで編集しているときはきれいに表示されてるのに、JME(jMonkeyEngine)では上手く表示できない。。。そういうのが一番困るわー。そして、起きてしまった、そんな事態。次の絵を見てください。

Screenshot from 2013-06-13 21^%14^%35

これはJMEで表示した、JME用に作り直している剣士である。左目とゴーグルが所々欠けてしまっている。Blenderではちゃんと表示されているのに。まえまえから、D君の頃から、BlenderとJMEに表示の違いがあるのを認識しつつ黙殺して進めてきたが、さすがにコレはありえない。覚悟を決めてこの問題を解決すべく、調査や試行錯誤してみた。

で、結論が「法線(Normals)を調整すること」だ!
まあ、前から法線ってうすうす聞いたことありました。例えば球やなめらかな曲面などをそれらしく見せるのに必要なパラメータのようです。ポリゴンは本来、点と点を結ぶ直線の集合でカクカクしたものだけど、法線というもう一つのパラメータを持たせることで線に膨らみを持たせることが出来る。って感じです。あまり詳しいことは分からんけど。

Blenderで法線を表示して確認するにはメッシュをEditModeにして、3DViewの右端に出るメニュー(Nキーで出る)にNormalsという項目があるので、そこにあるボタンをポチポチして好きなように表示することが出来る。

それで確認すると、なるほどー、左目の法線は右目の法線に比べてずっと短くなってたし、ゴーグルの法線も短かった。

これらの法線の長さを調整するにはWキーを押して出てくるメニューの「Flip Normals」でできる。こうして修正して、再度JMEで表示したのがこれ。

Screenshot from 2013-06-13 21^%55^%35

うーん、Good!
なんか、法線問題って3D初心者がよく巡り合う問題のようですな。

JMEにおけるBlenderの制限#3

ということで、ヨガファイアさん問題が落着したところで残りの懸案を片付ける。

まずは、Blenderで作ったShapeKey/DriversのアニメーションがJME(jMonkeyEngine)で動くかという確認。
けつろん。。。できませんでした!!!

いや、、おそらく出来ないだろうなーと思ってましたのよ。JMEのドキュメントを読んでもメッシュのアニメーションは不可で、ボーンのアニメーションのみサポートって書いてあったし。でもShapeKeyとは直接書いてなかったし、ShapeKeyのアニメーションでもボーンを使うといえば使うし、すこしは望みを残していたのですが、、。やっぱりだめでした!!!

ShapeKeyのアニメーションって便利で、Blenderでも最後の手段だと思ってたので、ぜひサポートして欲しい。どっかのトピックで開発者が熱意を持ってサポートしたいみたいに書いてたのをどこかで読んだ覚えがあるけど。

ShapeKeyはあきらめて次はBlenderのChildOf拘束をJMEでどう実現するかの検討。簡単に言えばChildOf拘束とは2つのボーン同士を親子関係に設定するというもの。前にBlenderで剣士を作ったとき、キャラクターに剣オブジェクトを持たせるのにこのChildOf拘束を利用した。(ここの動画が参考になった。)

JMEではBoneというクラスにaddChildというメソッドがあるので、Blenderで手のボーンに装備スロット的なボーンを追加し、そこに剣のボーンをJMEでaddChildすればよい。実際のコードはこんなかんじになった。

126: Spatial node_ = assetManager.loadModel(“dist/Models/D08_20130527.mesh.j3o”);
127: rootNode.attachChild(node_);
128: AnimControl ctrl_ = node_.getControl(AnimControl.class);
129: AnimChannel ch_ = ctrl_.createChannel();
130: Bone bone_ = ctrl_.getSkeleton().getBone( “hand.equip.R” );
131:
132: Spatial node1_ = assetManager.loadModel(“dist/Models/D08_Excalibur20130527.mesh.j3o”);
133: rootNode.attachChild(node1_);
134: AnimControl ctrl1_ = node1_.getControl(AnimControl.class);
135: Bone bone1_ = ctrl1_.getSkeleton().getBone( “main” );
136:
137: bone_.addChild( bone1_ );

(訂正:APIドキュメントを読み直したら、ユーザコードからBone#addChildは使うなと書いてあった。修正版はこちら)

126行目でD君のオブジェクト、132行目で聖剣エクスカリバーのオブジェクトを読み出し、AnimControlを介してボーンにアクセス、137行目で親子関係を作っている。
ちょっと怪しい動きをしているが、ひとまず期待する実行結果が得られた。

Screenshot from 2013-06-10 00^%35^%03

手抜きレンガ棒(?)じゃないよ!エクスカリバーだよ!

ちなみにBlenderで聖剣エクスカリバーを作っているときに気づいたこと。このエクスカリバーに埋め込んでいるボーンの数は一個のみである。メッシュとボーンを紐付けするときに<Ctrl-P>を押して出てくるメニューに”Armature Deform”と”Bone”という選択肢が出てくるが、”Armature Deform”の方を選択すること。”Bone”を選ぶとBlenderでは問題なく動作するが、JMEではスケルトン情報を取得できず、AnimControlのヌルポが発生する。(Ogreにエクスポートする時点で.skeleton.xmlが出力されない。)

あと、実際に作ったモデルをJMEのみで使う目的ならば、BlenderでChildOf拘束を設定しておく必要はない。でもChildOf拘束を設定しておけばポーズやアニメーションで実際の位置を確認できるので便利である。剣オブジェクトをモデリング時の初期位置に戻したければChildOf拘束のinfluenceを0に設定すればよい。

JMEにおけるBlenderの制限#2

引き続き、キャラクターの腕の太さと長さを設定できるボーン構成をJME(jMonkeyEngine)で実現する課題。(ヨガファイアさん問題と勝手に命名した)

結論から言って、Blenderで設定するStretchTo拘束が犯人だった。この拘束のあるボーンにはメッシュのウェイトを割り振っていなかったので、とくにメッシュに影響が出ると思っていなかったのだが、y軸方向のみのスケール変更をしているせいか、あちこちのボーンに影響が出て、結果、メッシュがおかしな動きをしているようだった。

まとめると、
– 腕の太さの設定はボーンの移動で行うこと。
– IKの影響下にあるボーンのスケール変更は正常に動作する。
– StretchTo拘束は使用しないこと。
となる。

この方針に従い、以下の絵のようにボーンを組んだ。Screenshot from 2013-06-08 23^%09^%51

黄色になっている細長い前腕ボーンにIKが設定されており、細長い無色の上腕ボーンがIKの影響を受ける。IKのアーム操作をしたいときは水色に選択されているボーンを動かす。

この前腕ボーン、上腕ボーンにはそれぞれ十字型に並べられた緑色のボーン4つが付属する。この十字のボーンにメッシュのウェイトが設定されており、これを動かすことで腕の太さを変えることが出来る。

前腕ボーン、上腕ボーン自体にはメッシュのウェイトが設定されていないが、ボーンをスケール変更することで親子関係にある十字ボーンが連動するので、メッシュの腕の長さを変えることが出来る。十字ボーンの数や位置は適当だが、少なくとも肘関節辺りに一つは置いておかないと、ちょっと変な動きになる。

以上、けっこう悩んだ割に、出来上がりはごくシンプルなボーン構成となった。

今回の結論に至る実験で使われたファイルはこちらにアップロードされている。
メモ書き的に各blendファイルの特徴をまとめてみた。

d01_20130527.blend、d02_20130527.blend、d03_20130527.blend
基本的な機能を確認したファイル。これでJMEのスケール変更に関する問題が見つかった。

d04_20130527.blend
ボーンの移動でスケール変更するようにしたもの。上手く動かなかった。

d05_20130527.blend
d04_20130527.blendをベースに、IK拘束とStretchTo拘束を削除したもの。狙った動きになったはなったが、IKを削除したことで、少々操作しにくくなっている。

d06_20130527.blend
d04_20130527.blendをベースに、StretchTo拘束のみを削除したもの。狙った動きになり、IK操作で操作しやすい。

JMEにおけるBlenderの制限

先日、Blenderで作ったモデル、D君でいろいろ実験している。
とりあえず、JME(jMonkeyEngine)でD君を表示できるようになったが、その次がアニメーションだ。
いろいろ試した結果、以下のことが分かった。

(1)組んだモデルをコマンドラインでOgreにエクスポートするとき、Blenderでの編集完了時は必ずObjectModeにして対象のメッシュとボーンを選択して終了すること。それをしないとJMEでテクスチャ読み込みとスケルトン読み込みに失敗する。
(2)BlenderのActionEditorで組んだアニメーションはNLAEditorで登録しておかないと、JMEから参照することが出来ない。
(3)異なるメッシュからテクスチャファイルの共有は出来ない。
(4)IKのボーン拘束は使えるようだ。今のところ違和感はない。
(5)meshのOriginは一番下の位置に設定すること。Armatureは完全な木構造にし、rootのボーン(親を設定しないボーン)は2つ以上あってはならない。rootのボーンはmeshのoriginと同様に一番下の位置に設定すること。(公式ドキュメントより。)
(6)ボーンのスケール変更はx,y,z軸、3方向にすべて等倍変更のみ出来る。StretchToやScaleLimitによるx方向のみ拡大とかそういうのは出来ない。

この中で(6)が特に問題だ。これによって、のヨガファイアさん問題で苦労して組んだボーンがJMEでは動かなくなってしまうからだ。キャラクターの腕の太さと長さを個別に設定できるというボーン構成なのだが。

対策として、ボーンのスケール変更でメッシュを直接スケール変更せず、ボーンの移動によってメッシュのスケール変更できるようにBlenderで組んでみたが、BlenderとJMEで明らかに動きが違う、、。
もうちょっと工夫が必要なのかもしれない。

まだやっていない確認リスト、おぼえがき。
– ShapeKey/Driverによるアニメーションは利用できるか。
– ChildOf拘束を利用するには

blendからOgreをコマンドラインで変換

まさか出来ると思ってなかったので、出来るのを知ったらちょっと感動しちゃったよ。

以下のBlender公式Wikiを参考にして、BlenderのblendファイルからOgre形式のエクスポートをコマンドラインでできるようになりました。
Wavefront OBJ Import/Export

blend2ogre.pyという、こんな感じ(最新版)のpythonファイルを作って、以下のようにタイプすればよい。

blender foobar.blend –background –python blend2ogre.py — foobar.mesh.xml

pythonなんて初めて組んだよ!まあ、ほとんどコピペだけど。
細かいパラメータを指定した方がいいのかもしれないなー。そのへんはoioi。

なお、この操作は、先日のプラグインblender2ogreがBlenderにインストールされていることが前提になる。
http://code.google.com/p/blender2ogre/

これでblendからOgreに変換でき、Ogreからj3oに変換できるようになったので、blendからj3oの変換が完全にコマンドラインで出来るようになった!うれぴ~~。

 

ミスターOgre

いや、オーガさんですけど。

現在もJME(jMonkeyEngine)のドキュメントを読んでいるところではあるが、その中で一番気になるのは、やはりBlenderのファイルを読み込む機能だ。これが出来なければ、何も始まらない。

ここらへんを読んでいると、予想してはいたけど、JMEで読むためにはBlenderの編集でそれなりの制約があるようだ。
http://jmonkeyengine.org/wiki/doku.php/jme3:external:blender

まず、JMEではBlenderがまんま出力するblendファイルを読むことは出来ない。BlenderでOgreXML形式でエクスポートし、JMEでさらに最適化された専用のファイルに変換しなければならない。

(訂正。どうもblendファイルのまま読み込めるクラスが用意されているようだ。あと、OgreXML形式のまま読み込むこともできる。)

OgreXMLにエクスポートするBlenderのアドオンはとりあえず、blender2ogreというのを入れてみた。
http://code.google.com/p/blender2ogre/

このアドオンを利用するにはogreのコマンドラインツールをインストールしておく必要がある。(Ubuntuではsudo apt-get install ogre-tools で可能)

まだあまり検証してないけど。明日はテスト用に作ったモデルを使っていろいろ検証するぞ。

Screenshot from 2013-05-29 00:05:58
これがテスト用モデル。どーも、ども。

 

 

今回のボーン構成のまとめ

とりあえず、swordman20130514.blendにおける左腕部分のボーン構成をまとめてみた。

memo_armature

これで何が出来るかというと、

(1)upper_arm.ctrl.Lとforearm.ctrl.Lボーンのスケールを変えることで上腕、前腕の長さを決めることが出来る。

(2)upper_arm.width.Lとforearm.width.Lボーンのスケールを変えることで上腕、前腕の太さを決めることが出来る。

(3)arm.ik.Lを操作することでIK的なアーム操作が出来る。

(4)shoulder.Lを操作することで肩の位置を任意に決めることが出来る。

仕組み的なポイントとしては、

– meshにウェイト配分するボーンはchest.L、shoulder.L、upper_arm.L、forearm.L、wrist.Lのみ。他のxxx.width.Lやxxx.ctrl.L、arm.ik.Lはウェイト配分しない。

– xxx.Lからxxx.ctrl.LへCopyRotationしているが、これをしないとxxx.Lがぐるんぐるん回ってしまうぞ。

– 他のボーンのスケール操作の影響を受けたくないボーンにはRelationsカテゴリにあるInherit ScaleをOFFにしておくこと。

– StretchTo拘束はいずれもVolumeをNoneに設定している。これでY方向のみをサイズ変更ができる。CopyScale拘束ではXとZのみをコピーしている。

今回一番苦労したのは腕の太さと長さを個別に設定でき、かつIK操作ができることを目指したことだ。CopyScaleとIKのボーン拘束はとことん相性が悪く、IKの影響下にあるボーン(xxx.ctrl.L)にCopyScaleを適用すると変な形に変形しまくって暴走する。IKの影響下にあるボーンはポーズモード時に素直にSキーでスケール変更した方が良い。

また、肩が自由に動かせるのもなにげに大事。二頭身キャラである程度強引にポーズを見せるには肩の位置も動かしたほうがしっくり来ることがある。

(今回はgitでblog20130522のタグをきっておきました。)

ヨガガガ

ようやく、思い通りのボーン組みが完成できた。
で、昨日の日記の訂正。

ポーズモードでのCtrl+Alt+Sでスケール変更してもポーズにまったく反映されない。Sキーのみでスケール変更すること。

StretchToボーン拘束は、やっぱり必要だった。

今回のボーン構成は、いずれまとめたいと思う。で、今は腕や足を自由に伸ばしてポーズをとっていろいろ試してみてるのだが、いまのところまだシックリこないなぁ、、。