※ここでの解説は「有料版のメタセコイア」と「ラボ版のOpera]を使用しています。
※ラボ版のOperaはこちらからDLできます。
前回のエントリーでは「Operaのライト機能が無い環境+メタセコイアからのテクスチャ情報の出力無し」という事もあり、かなり残念なクオリティの出力でした。
メタセコイアのPythonでOpera向けの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で動作を確認。