2013年5月15日水曜日

Blender Pythonスクリプト挑戦 2

結局便利ツールでは仕様を満足できなかったので、さらにPythonスクリプトをいじることになってしまった。
それに関して情報をまとめておこうと思う。

mathutils.Matrixを使うべし
頂点を回転させたい場合、bpy.ops.transform.rotateを使うべきではない。

回転行列を用意し、頂点座標に掛けてやる方がよっぽど楽である。
ただしmathutils.Matrixで生成される回転行列はDirectXのものとは転置の関係にあるので注意。
頂点に対して左から掛けていかなければいけないので、感覚にあわないかもしれない。

bmeshを使うべし
かどうかはちょっと確証がないが、extra_mesh_toolsではbmeshを生成し、編集してから再度通常のメッシュに落としこむという操作をしていた。

個人的に今回のスクリプトで動作が確認できたというだけの話である。

2013年3月14日木曜日

Blender ビルド CMake備忘録


以前 BlenderをTortoiseSVNで落としてきて、CMakeでVisualC++2008用のプロジェクトを作るという作業を行ったが、このブログにメモを残していなかったことに気が付いた。
ソースが2.64なので更新したくもあるが、我慢する。

・TortoiseSVNでBlenderSVN/blenderを更新
・画像のようにCMakeを設定→Generate

でうまくいくはずだ。

2013年1月28日月曜日

Blender 法線マップ備忘録

Blenderではハイポリゴンモデルを元に法線マップを生成することが可能だが、必要になるときにはいつも方法を忘れているので、活用法と共に記しておく。
ただどうも他で紹介される方法や、昔上手くいった方法と異なる気がするので、一手法と考えて頂きたい。

準備手順

  • ローポリゴンモデル、ハイポリゴンモデル両方を用意する。
  • 位置は必ず同位置に合わせる。
  • ローポリゴンモデルをUV展開する。
Bake手順

  • 生成用の画像を用意し、ローポリゴンモデルに登録する
  • ハイ→ローの順で選択する。
  • Properties/Render/BakeでBakeModeにNormals、Normal SpaceにTangentを指定、Selected to Activeにチェックを入れBakeを押す。
さて、ここでハイポリゴンモデルはUV展開する必要はない。全く無関係なオブジェクトを指定しても問題なく生成される。

Bake手順2をよく忘れるので注意しなければならないなと

2013年1月2日水曜日

Unity メッシュ考察

メッシュの動的修正について色々と試していたら、プリミティブのCubeを書き換えてしまった。
以下にそれを修正したコードを記載する。

立方体のメッシュの情報のうち、ポリゴンの張りかたを指定する配列 triangles を書き換えてしまった。
verticesとuvsも上書きしてしまったが、配列の長さが違っていたため、幸運にも上書きされずに済んだ。
trianglesの長さには制限がないということが分かる。
もともとの長さは36だが、実験したところ36より大きい数でも問題なく入った。

MeshFilter mesh_filter = _target.gameObject.GetComponent<MeshFilter>() as MeshFilter;

Mesh mesh = mesh_filter.sharedMesh;

mesh.name = "Cube";
mesh.triangles = new int[36] {
0,2,1,1,2,3,
4,6,5,5,6,7,
8,10,9,9,10,11,
15,13,14,15,14,12,
19,17,18,19,18,16,
23,21,22,23,22,20};

MonoBehaviour.print(mesh.vertexCount);
MonoBehaviour.print(mesh.vertices.Length);

mesh.RecalculateNormals();

2012年12月5日水曜日

Blender 外部エディタでpythonスクリプト編集

 Blender2.63で少しスクリプトをいじってみた。

 Blenderには組み込みのテキストエディターがあり、そのまま実行もできるのだが、カーソルがエディタのウィンドウ上にある時だけ入力が可能というような使用なので、ちょっと使いづらかったりする。
 それにどうやら入力補完には対応していないらしい。となれば外部エディタを使うという選択肢もあるだろう。

 Blenderではスクリプトの書かれたテキストファイルも、内部データとして保存している。そのため外部のエディタから編集するためには「Save as」で保存する必要がある。このとき拡張子を付けなければテキストファイルになってしまう。使用する外部エディタにPython編集モードがあるのならば、この段階で「.py」を付加する方が便利だ。

 (追記)それなりにスクリプトを記述したが、内部データに保存するなら組み込みのテキストエディターで我慢できるが、どうせ外部に保存するならVim等でいじりたい。微妙なラインである。

2012年11月21日水曜日

Blender Pythonスクリプト挑戦

Blenderに関しては極力C++でいじりたかったので、先にコードを丸ごとTortoiseSVNで落としてきたのだが、早急に作らなければならないモデルが出てきたので、急遽Pythonスクリプトを利用することになった。

色々なブログで入門編を見ていた限り、blender&pythonは夢のような世界だろうなと想像していたのだが、踏み込んでみて少々面食らうことになる。

良いのか悪いのか、まだそんな判断を下せるほど習熟していないので、詳しい言及は避けるが..

今回記しておきたいのは、再びPythonスクリプトを組む羽目になったときのための、アタック方法だ。

まず、いつのバージョンからかは定かではないが、少なくともBlender2.63以降にはPythonコンソールのReportボタンが無く、同様の情報はInfoウィンドウに羅列される。

bpy.ops以下のオペレーターはアクティブなオブジェクト、もしくは頂点に対して適用される。

bpy.contextはアクティブなオブジェクトやオペレーターを格納している。
ちなみにbpy.context.objectの書き換えは不可能。
スクリプトからアクティブなオブジェクトを切り替える方法は未だ不明。
選択に関してはオブジェクトのselect変数で切り替えられるが、新たに選択してもアクティブなオブジェクトにはならない。

@todo:vertex_group

@todo:モード切替

bpy.dataはデータ一般を格納している。
bpy.context.object.data.verticesとbpy.data.['該当名'].meshes.verticesは同一の模様

基本的には、まず3DViewで手動で操作し、Infoに現れたレポートをコピーすることで目的のコードを得られるが、特にbpy.context.transform内の操作についてはコンソール(Pythonコンソールではなく)に「convertViewVec: called in an invalid context」と表示される。意味は謎

bpy.context.transform.rotateによって回転をかけることができるが、OBJECTモードではオブジェクトの中心点、EDITモードでは頂点の中心(Pivot Point)周りでしか回転できない。

Pythonの変数はみんなポインタのようなものだ。という説明を見たが、容易にblender自体をクラッシュさせられることから考えても、Pythonの変数はみんなvoid*だと言ってしまっていいのだと思う。

結局目的の操作がcontribというものに含まれるmesh_extra_toolsで解決できてしまいそうなので、今回は挫折することになりそうだ。そのツールの中ではbpy.opsなどは使わずに頂点情報を直接いじっているような気がする。(ちらっと見ただけ)

ここから落とせる https://svn.blender.org/svnroot/bf-extensions/

2012年10月19日金曜日

映画 ロボジー

矢口史靖監督作品 ロボジーを鑑賞。


 この手の映画は恐らく映画館に行っても声を出して笑ってしまうので、自宅で見る他ない。ニュー潮風が自分の手でレンズを調整したシーンは爆笑であった。まぁ、アトムも自分のお腹を手で開閉するわけで、そうおかしい話では無いのかもしれないのだが。

 しかし、やはりSEが重要なのだなと実感。人々がどんどんと騙されていく展開にリアリティがあったのは、観客もそれがロボだと感じられたからなのだろう。そしてそう感じられたのは、やはり歩き出した時のSEに、おおっと思わせられたからだ。(私の場合は