使い方メモ-07(カーブ)

Blenderでのカーブの使い方をメモしておく。

作成
「スペース」→「Add」→「Curve」→「Bezier Curve」
角をVECTORにする(カクッとさせる)
「V」キーを押す
角をBEZIERにする(滑らかにする)
「H」キーを押す
頂点の追加
「E」キーを押す
ループ化
「C」キーを押す

Windows用pythonインストール

blenderをインストールするとpython.dllはインストールされるが、それはblenderからしか使えないので、ちょっとしたテストコードを書くには不便。なので、Windowspythonをインストールしてみた。
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

気になる構文

点の多角形内包チェック


ある点が多角形(ポリゴン)の内部にあるかどうかをチェックするアルゴリズムを実装したくてちょっと調べてみました。凸多角形限定のアルゴリズムは以前実装したことがあったのですが、このページ(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)