強火で進め

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

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


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

前回のエントリーで紹介したサンプルの中にポリゴン情報の出力をするサンプルがあります。

メタセコイアに内蔵しているPythonの使い方 - 強火で進め
http://d.hatena.ne.jp/nakamura001/20090830/1251649752

これを見ていたらちょっと修正するだけで以前作った、ラボバージョンのOperaに搭載されている3D機能向けのポリゴン情報の作成に使えるのでは?と思いちょっと作ってみました。

Operaで3Dが表示できた!! - 強火で進め
http://d.hatena.ne.jp/nakamura001/20081205/1228459964

メタセコイア内蔵のPython用プログラム

プログラムとしてはこんな感じです。何かオブジェクトを作成した後のメタセコイアで実行するとOpera向けのポリゴン情報が出力されます。

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

num = doc.numObject
numObj = 0
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
	MQSystem.println("")
	str = 'var vertices%d = new Array(%d);' % (objNum, numVert)
	MQSystem.println(str)
	for nv in range(0,numVert):
		v = "vertices%d[%d] = " % (objNum, nv)
		v = v + "[%0.3f, %0.3f, %0.3f, 0.000, 0.000];" % (obj.vertex[nv].pos.x,
		obj.vertex[nv].pos.y, obj.vertex[nv].pos.z)
		MQSystem.println(v)
	numFace = obj.numFace
	enableFaceCount = 0
	for nf in range(0,numFace):
		if obj.face[nf].numVertex == 0: continue
		enableFaceCount = enableFaceCount+1
	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] = [" % (objNum, indicesIndex)
		for nfi in range(0,obj.face[nf].numVertex):
			if nfi != 0:  f = f + ', '
			f = f + '%d' % obj.face[nf].index[nfi]
		f = f + "];"
		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)

なお、こちらのプログラムを使用するときにはポリゴンをすべて三角形のものに変更しておく必要があります。これはOperaの3D機能のポリゴンは三角形のみ対応しているためです。

全ポリゴンは三角形化は Ctrl+A ですべてのオブジェクトを選択した後にメニューから 選択部処理 → 四角形面を三角形面化 を選択する事で行えます。

サンプル

今回作成したサンプルではこの出力データをJSファイルに保存してそれをHTMLファイルから呼ぶ形で使いました。ファイル構成はこの様になっています。

ファイル名 内容
models_data.js ポリゴン情報を格納。上記のPythonプログラムで出力されたものをそのまま保存したもの
index.htm 本体

サンプルはこちらで確認できます。
ここではメタセコイアの基本図形の中からパイプ状の形状をしたもの使いました。

サンプル見てもらえました?うーん、はっきり言ってサンプルはかなり残念な感じでしたでしょ。これはポリゴンの色が完全にフラットなものになっているためです。この様になってしまうのはこのOperaの3D機能になんとライトの機能が無いためです。

その辺りはテクスチャ(ライトマップ)でがんばってね。って方針の様です。詳しくはこちらの Lightmapping の項目を参照下さい。

Tim Johansson - Taking the canvas to another dimension
http://my.opera.com/timjoh/blog/2007/11/13/taking-the-canvas-to-another-dimension

これから

もうちょっとがんばって次のバージョンではテクスチャ情報の出力に対応させる予定です。

それが完成すればとりあえず以前作った「はちゅね」くらいのクオリティのものが出力できるようになると思います。

Operaはちゅねミク
http://tsuyobi.heteml.jp/html/opera/miku/