強火で進め

このブログではプログラム関連の記事を中心に書いてます。

メタセコイアのPythonでOpera向けの3Dデータを出力(テクスチャ1枚対応版)


※ここでの解説は「有料版のメタセコイア」と「ラボ版のOpera]を使用しています。
※ラボ版のOperaこちらからDLできます。

前回のエントリーでは「Operaのライト機能が無い環境+メタセコイアからのテクスチャ情報の出力無し」という事もあり、かなり残念なクオリティの出力でした。

メタセコイアPythonOpera向けの3Dデータを出力(テクスチャ未対応版) - 強火で進め
http://d.hatena.ne.jp/nakamura001/20090830/1251652408

さすがにこのままだと残念すぎるのでとりえずテクスチャ1枚対応(アルファは未対応)してみました。
サンプルはこちらで確認できます。

メタセコイア内蔵のPython用のプログラムは以下の様になっています。
(2009/09/02 モデルによっては正しく表示されなかったバグを修正)

MQSystem.clearLog()
doc = MQSystem.getDocument()

num = doc.numObject
numObj = 0
v_list = []
for n in range(0,num):
	obj = doc.object[n]
	if obj is None: continue
	numObj = numObj + 1
str = 'var models_data = new Array(%d);' % numObj
MQSystem.println(str)
for n in range(0,num):
	obj = doc.object[n]
	if obj is None: continue
	objNum = n+1
	numVert = obj.numVertex
	uv_list = {}
	numFace = obj.numFace
	enableFaceCount = 0
	for nf in range(0,numFace):
		for nfi in range(0,obj.face[nf].numVertex):
			uv_list[obj.face[nf].index[nfi]] = obj.face[nf].coord[nfi]
		if obj.face[nf].numVertex == 0: continue
		enableFaceCount = enableFaceCount+1
	for nv in range(0,numVert):
		v_list.append(obj.vertex[nv].pos)
	vuv_list = []
	for nf in range(0,numFace):
		if obj.face[nf].numVertex == 0: continue
		for nfi in range(0,obj.face[nf].numVertex):
			vuv_list.append({'v':v_list[obj.face[nf].index[nfi]], 'uv':obj.face[nf].coord[nfi]})
	str = 'var vertices%d = new Array(%d);' % (objNum, numVert)
	MQSystem.println(str)
	for nvuv in range(0, len(vuv_list)):
		vuv = vuv_list[nvuv]
		v = "vertices%d[%d] = " % (objNum, nvuv)
		v = v + "[%0.3f, %0.3f, %0.3f, %0.3f, %0.3f];" % (vuv['v'].x, vuv['v'].y, vuv['v'].z, vuv['uv'].u, vuv['uv'].v)
		MQSystem.println(v)
		
	MQSystem.println("")
	str = 'var indices%d = new Array(%d);' % (objNum, enableFaceCount)
	MQSystem.println(str)
	indicesIndex = 0
	for nf in range(0,numFace):
		if obj.face[nf].numVertex == 0: continue
		f = "indices%d[%d] = [%d, %d, %d];" % (objNum, indicesIndex, indicesIndex*3, indicesIndex*3+1, indicesIndex*3+2)
		MQSystem.println(f)
		indicesIndex = indicesIndex+1

	MQSystem.println("")
	str = "models_data[%d] = new Array(2);" % n
	MQSystem.println(str)
	str = "models_data[%d]['vertices'] = vertices%d;" % (n, objNum)
	MQSystem.println(str)
	str = "models_data[%d]['indices'] = indices%d;" % (n, objNum)
	MQSystem.println(str)

ファイル構成は以下の様になっています。

ファイル名 内容
models_data.js ポリゴン情報を格納。上記のPythonプログラムで出力されたものをそのまま保存したもの
texture.png テクスチャファイル
index.htm メインのHTML

もし、良ければみなさんもメタセコイアのデータをOpera向けに出力してみてください。その場合の手順は以下の様になります。

1. メタセコイアでモデルを作成。
※テクスチャは1枚のみ使用可能です。テクスチャのファイル名は texture.png として下さい。
※曲面のモデルには対応していません。ポリゴンで作成するか出力プログラムを実行する前に「曲面・ミラーのフリーズ」を実行して下さい。
2. Ctrl+A ですべてのオブジェクトを選択した後にメニューから 選択部処理 → 四角形面を三角形面化 を選択し、全ポリゴンを三角形化。
3. 今回、紹介したPythonプログラムをスクリプトエディタに張り付け、実行。
4. 出力されたデータをエディタなどにコピペし、 models_data.js というファイル名で保存。使用したテクスチャも同じディレクトリにコピーする。
5. サンプルのページの index.htm を 4. と同じディレクトリに保存し、そのディレクトリをサーバにアップする。
6. 3Dに対応しているOperaで動作を確認。