2009年6月22日月曜日

Exporter

Blenderで作ったモデルデータのエクスポートですが、最初から全部やるのはアレなので、とりあえず頂点データだけエクスポートしてみます。

その前に、データのフォーマットを決めなければなりません。扱いを簡単にするために次のような簡単なテキスト形式にします。
V x座標1 y座標1 z座標1
V x座標2 y座標2 z座標2
:

1桁目のVは頂点データを表す識別子です。今は頂点データだけですが、のちのち追加していくつもりです。

頂点データをエクスポートする関数は次のようになります。

def write(filename):
sce = Scene.getCurrent(); # 現在のシーン
obj = sce.objects.active # 選択中のオブジェクト
if not obj or obj.type != 'Mesh':
# 選択中のオブジェクトがメッシュ型でなければエラー表示して中止
Draw.PupMenu('not an mesh object')
return

mesh = obj.getData(mesh=True) # メッシュデータを取得
out = file(filename, "w") # ファイルを開く
for v in mesh.verts: # 頂点の数だけ繰り返し
out.write("V %f %f %f¥n" % (v.co.x, v.co.y, v.co.z))

出力ファイル名を選択する画面を開くために次の呼び出しを追加します。

Blender.Window.FileSelector(write, "Export")

最初の引数のwriteがファイル選択後に呼び出す関数(上でつくったやつ)で、2番目の引数は選択ボタンのラベルです。
あと、スクリプトの最初の方に、スクリプトのメニューグループや名前、インポートするモジュール名なんかを書いておく必要があります。

#!BPY
# -*- coding: utf-8 -*-
"""
Name: 'MyModel'
Blender: 248
Group: 'Export'
Tooltip: 'MyModel exporter'
"""
import bpy
import Blender
from Blender import *
:

このスクリプトをスクリプト用のフォルダに保存して、Scripts Windowで「Scripts」→「Update Menus」とやると、スクリプトがメニューに反映(上の場合、Exportメニューに)されて実行できるようになります。(詳しくはBlenderのチュートリアルやらのページに書いてあります)

で、昨日のデータをエクスポートした結果が次です。
V -0.230893 1.000000 -1.000000
V -0.230893 -1.000000 -1.000000
V 12.300001 -0.572064 -1.000000
V 12.299997 0.572064 -1.000000
V -0.230895 0.999999 1.000000
V -0.230890 -1.000001 1.000000
V 12.300003 -0.572064 1.000000
V 12.299999 0.572064 1.000000
V 5.017009 0.752617 -1.000000
V 5.636728 0.752617 -1.000000
V 5.017009 -0.752617 -1.000000
V 5.636729 -0.752617 -1.000000
V 5.017009 0.752617 1.000000
V 5.636729 0.752617 1.000000
V 5.017009 -0.752618 1.000000
V 5.636729 -0.752617 1.000000

このデータをプログラムで読み込んで表示してやればいいわけです。座標データをコード中に書かなくて済むので、これができるだけでも助かりますね...先は長いですが。

0 件のコメント: