使い方メモ-07(カーブ)
Windows用pythonインストール
blenderをインストールするとpython.dllはインストールされるが、それはblenderからしか使えないので、ちょっとしたテストコードを書くには不便。なので、Windows用pythonをインストールしてみた。
http://www.python.jp/Zope/download/pythoncoreからmsiをダウンロードしてインストール。インストール先ディレクトリは、デフォルトではバージョン番号が付くのだが、なんかそれは気持ち悪いので、C:\python にしておく。
そのディレクトリ(自分の場合は"C:\python")にパスを通せばインストール完了。
コマンドラインで試してみる。
> python Python 2.5 (r25:51908, Sep 19 2006, 09:52:17) [MSC v.1310 32 bit (Intel)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> exit Use exit() or Ctrl-Z plus Return to exit >>> exit() >
あー、そうか、関数には括弧がいるよね。rubyスタイルがいつの間にか身に染みています・・。
あと、スクリプトファイルのダブルクリックではテキストエディタで開いてほしいので、フォルダ オプションで関連付けをxyzzyに変更しておく。
リスト周りのテスト
とりあえずリスト周りをチェックしながら文法に慣れてみる。
# test python import types print "=== test python : list ===" ## The list. list = [ 1.0, 1.2, 0.0 ] print type(list) #=> <type 'list'> print len(list) #=> 3 print list #=> [1.0, 1.2, 0.0] ## The lists in the list. listlist = [ list, [3.0, 4.0], "abc" ] print type(listlist) #=> <type 'list'> print len(listlist) #=> 3 print listlist #=> [[1.0, 1.2, 0.0], [3.0, 4.0], 'abc'] print type(listlist[0]) #=> <type 'list'> print len(listlist[0]) #=> 3 print listlist[0] #=> [1.0, 1.2, 0.0] print type(listlist[0][1]) #=> <type 'float'> print listlist[0][1] #=> 1.2 ## traverse the lists. for vv in listlist: if type(vv) == types.ListType: print type(vv), vv, len(vv) for v in vv: print " %s\t%s" % (type(v), v) else: print type(vv), vv # for文以下は以下のように出力されます. #<type 'list'> [1.0, 1.2, 0.0] 3 # <type 'float'> 1.0 # <type 'float'> 1.2 # <type 'float'> 0.0 #<type 'list'> [3.0, 4.0] 2 # <type 'float'> 3.0 # <type 'float'> 4.0 #<type 'str'> abc
気になる構文
- print文に変数を渡すのがちょっと癖がある。
- type()で取得した型と比較する値が面倒。調べないと分からないよ。
点の多角形内包チェック
ある点が多角形(ポリゴン)の内部にあるかどうかをチェックするアルゴリズムを実装したくてちょっと調べてみました。凸多角形限定のアルゴリズムは以前実装したことがあったのですが、このページ(http://bal4u.dip.jp/mt/program/archives/2004/11/_ph.html)を見たら限定でなくても結構簡単に実装できるみたいなので、C++的に書き直しながら内部を把握してみました。
ちなみに、高速化を考え、線上は外側とみなすようにしてあります。
(追記)これ、原理的には穴が開いている多角形でも対応可能なのですが、ただ与えられた頂点配列の処理のしかたがそこまで対応できていませんね。しかし、それぞれの閉じた多角形の頂点配列を分けて処理するというか、頂点配列の中に区切りヒントでも埋め込むか、そんな感じで簡単に対応できそうです。
BlenderでPythonプラグイン#3(Curveのポイントを取得)
XY平面に置いたカーブの頂点を取得したいー、と思って書いたのが次のスクリプト。BPyMeshではうまく取れないので、構造を調べつつ、追ってみました。
import Blender from Blender import * print "=== CURVE DATA EXPORTER ===" # process for each objects selected. for obj in Blender.Object.GetSelected(): if obj.getType() == 'Curve': obj_pos = obj.getLocation() # pos of the curve. curvedata = obj.data for curnurb in curvedata: for point in curnurb: cx = point.pt[0]+obj_pos[0] cy = point.pt[1]+obj_pos[1] print str(cx), str(cy)