らんだむな記憶

blogというものを体験してみようか!的なー

Blender with python

Minecraftでキノコ型のオブジェクトを作りたいとかいう話が出てきた。

最近のノリからは、Illustratorか何かでBézierでオブジェクトのシェイプを書いて、グリッドとの交差からブロックで近似する、ということを3D的に行えばいいじゃないかとかそんなことを考えた。
円筒座標系みたいな感じで、$\theta$を固定して$(r,z)-$平面内でBézierを考えて、後から$\theta$を回す感じでいけるんじゃないかな。ともかくシェイプを$z$軸で回転させる場合に、Minecraftのボックス(立方体だと思うのだが)の重心がその回転体の内部に入る場合はボックスを配置とすればボックスで近似された回転体の原型が浮かび上がると思う。

原理的には大して難しくもないのだが、Bézierの便利なエディタを知らんな。グリッドが表示できてかつデータ自体はXMLベースで管理できると良い。エディタ上でハンドルを直観的に補正して、XML上で細かい調整をしてエディタで検査するみたいな。Photshopの場合、高いやつじゃないとパスが使えないし、psdデータじゃコントロールポイントをテキストエディタで編集できん。GIMPはどうなんだろ。SVGを経由させたらまぁ、テキストベースの編集と両立できるけどコンバートかますのが手間だなぁ。
最近聞くInkscapeはできるのかな?InkscapeでDesign- XMLエディターで編集するを見ると、SVGベースみたいだから、一応目的は達成できるかも。

オブジェクト内にボックスの重心、要は点が入るかについてはRay casting algorithm(Point in polygon - Wikipedia)が使える。レアケースの考慮を無視すれば、ある点から無限遠に伸びる半直線とオブジェクトとの交差回数が奇数回から内部にあって、偶数回なら外部にあるという判定法だ。Bézierとの交差を厳密に判定するのはBezier clipping - Wikipediaとかそういうのをやれば良いのだろうけど、そんな面倒なことしなくても、例えばアンカーポイント間が十分短ければ、アンカーポイント同士を線分で結んでポリゴンを形成し、このポリゴンの内外判定をすればぼちぼち十分だろう。直線同士の交差については連立方程式で厳密に即座に解ける。

と、まぁ、大雑把な理屈はこんなもんだとして、結果をレンダリングしたい。となると、3Dレンダラが必要かな。3ds Max, Mayaとかゲーム業界で使われているそういうのは高いしということで、全然関係ないことで入れてたBlender(blender.org - Home of the Blender project - Free and Open 3D Creation Software)で良かろう。

後は、プログラムで判定したボックスの情報をBlenderに流し込めば良いが、Blenderpythonバインディングされているので、ロジックを実装して、Blenderスクリプティングウィンドウで実行すれば良いはず。rinkak | Marketplace with 3D Printed Productsでも色々やっているね。
それにしても最近の高機能ソフトはよくpython bindingしている。Blenderpython v3のようだが、別のやつだとpython v2だったり色々。IronPythonよりもねっとりバインドしてるね!
ともかく、ちょっとソフトによりけりなので、「これからはpython v3だよ!」とか言わずに、v2/v3両方ともできたほうが便利かもね。或いは、ソフトがOSSなら自分でビルドすれば好みの処理系が使えたりもするようだ。

さて、まぁ、理屈上はできそうなのだが、実行するのが面倒くさい。どこかに全部転がってないかなぁ...。プログラミングは嫌いなんだ...

MinecraftBlenderの連携などは、【Minecraft】外部ソフトウェアによる3Dレンダリングの方法について Part1:このさきれむのブロマガ - ブロマガなどによると海外ではやるやつがおるようで、ゲームのためにそこまでやる神経というかなんというか恐れ戦くばかり。
まぁ、プログラミング+CG(アニメ)+ゲームといったら3種の神器みたいなもんだから、国内でもコアな方々は普通にやってるかもしれない...。若いってイイネ!