Processing上でメタセコイア形式データを表示するライブラリ

Processing上でメタセコイア形式データを表示できるライブラリを作成しました。
このライブラリは、A虎氏作成のNyARToolkit(ARToolKit Class Library for Java)の動作サンプルプログラムであるNyARMqoViewerをベースにProcessing上で動作できるようにしたものです。
このライブラリと、同じくA虎氏作成のNyAR4psg(NyARToolkit for proce55ing)を組み合わせることで、Processing環境上でもメタセコイア形式のデータを表示できるようになります。

座標系の制約により、表示するモデルは、Z軸に対して後ろ向きになってしまいます。そんなもんだと思ってご利用ください。実際に表示させて、回転させたりすれば、さほど気にならないと思いますが、OpenGL等から何らか移植する場合は注意が必要です。

NyARToolkitのページはこちら
NyARMqoViewer

読み込めないデータがたまにある等、いろいろ問題がありますがまずは公開したいと思います。

このライブラリの特徴

・Processingのライブラリ形式で、少ない関数でモデルデータのロード・表示が可能
・読み込みファイルは、ローカルハードディスク・ネット上両方に対応。(ver0.4よりZIPファイルにも対応しました)
・右手系・左手系の両方の描画に対応
 →Processingは通常右手系の描画を採用していますが、ARToolkit for Processingは左手系を採用しています。
  引数を変える事で、どちらの用途でも使用できるようになっています。

※既知の問題点
・マテリアルに実体のテクスチャは割り付られておらず、αテクスチャ'のみ'割り付けられている時、読み込みエラーになります。
・Processingのtext描画と併用すると、文字がつぶれる時があります。
     とりあえずの対処方法→メタセコモデルを描画する前に、文字を書いておく。
     修正箇所がわかったので、近々Upします。


[Update][Ver 0.4 Release]ZIP形式のファイルを読み込みできるようになりました。

[Ver 0.3 Release]左手系描画・右手系描画の両方に対応可能にしました。
Processingでは左手系が採用されていますが、NyARToolkit for Processingを採用しています。このため用途に応じて左手系・右手系を使い分けて描画する必要があります。今のところ、NyARToolkit for Processingを利用する時以外は、左手系の描画で対応可能です

[Ver0.2]座標変換の間違いがあり、修正版をUpしました。
メタセコイアやOpenGL, ARToolkitは右手系、Processingはなんと左手系でした。(右手系・左手系はこちらに簡単な説明をいれてあります)
右手系のデータを何も変換せずに表示すると、鏡に映ったようなモデルが表示されてしまいます。orz
これまで、対称なデータばかりで確認していたため、気が付きませんでした。。
サンプルなどを作ってる際に、”はちゅね”が左利きなのを不思議に思ってしらべたら、逆な事を気づきました。大変申し訳ございません。。。


Download

MqoViewer Library for Processing ver 0.4a09/04/15 Up
またコンパイルをJavaSE6でやってしまってました。正しく1.5でコンパイルしなおしました。。。。
MqoViewer Library for Processing ver 0.409/04/13 Up
MqoViewer Library for Processing ver 0.309/03/09 Up
※createGLModelPsの引数が1つ増えています(右手系・左手系対応)
※NyARとは関係がないので、混乱を避けるためにjarファイル名を変更しました。(NyARMQO.jar→MQOLoader.jar)

MqoViewer Library for Processing ver 0.209/02/11 Up
MqoViewer Library for Processing ver 0.1c09/02/05 Up
(動作するサンプルを同梱しました。その他は変更ありません。)

MqoViewer Library for Processing ver 0.1b 09/02/01 Up
MqoViewer Library for Processing ver 0.1
--> 変更履歴

3Dはちゅねがネギを振るサンプルをUpしました。こちらから
製作作品・サンプルプログラムのページこちら

使用しているブログがZIPファイルをおけない関係でファイルをこちらに置いていますが、
更新等の情報に関しては、そちらで更新していきたいと思います。
ブログ
ドキュメンテーションはなかなか時間がなくて追いつかないので、
詳しくはサンプルプログラムの方をを見てください。 web上にもサンプルをUpしました。こちらから

簡単な使い方

Processingのライブラリになっていますので、配布ファイルを展開して、lib/NyARMQO.jarをProcessingのライブラリディレクトリか、Sketchフォルダの下にcodeフォルダを作成して置いてください。
Processingのライブラリディレクトリにおく場合は、jp/nytla/kGLModeフォルダを作成して、その中にNyARMQO.jarをおいてください。(NyARToolkitから派生したため同じようなクラス構成にしてあります)

クラスのインポート
import javax.media.opengl.*; 
import processing.opengl.*;

import jp.nyatla.kGLModel.*;
import jp.nyatla.kGLModel.contentprovider.*;
//下記のクラスを使用します。
KGLModelData model_data = new KGLModelData;
ContentProvider content_provider = new ContentProvider;
あとは、
content_provider = new LocalContentProvider(this, "d:\\MQOData\\hoge.mqo");
content_provider = new HttpContentProvider(this, "http://127.0.0.1/hoge.mqo");
の様に、場所を特定してコンテンツプロバイダを作成して頂き、
  PGraphicsOpenGL pgl = (PGraphicsOpenGL) g;  
  GL gl = pgl.beginGL();  
   model_data = KGLModelData.createGLModelPs(this, gl,null,this.content_provider,0.015f,
	        	    KGLExtensionCheck.IsExtensionSupported(gl,"GL_ARB_vertex_buffer_object"),true) ;
	        	     // 最後の引数:true:左手系マッピング、false:右手系マッピング
  pgl.endGL();
の様に、モデルデータクラスにロードをしてください。
※Ver 0.3より関数の引数が変更になりました(1つ増えました) この際、OpenGLのハンドラを渡してあげる必要があります。
あとは、
  model_data.enables(1.0f) ;  //引数は倍率
  model_data.draw() ;
  model_data.disables() ;
で呼び出すことが可能です。同じくOpenGLを利用するので、
GL gl = pgl.beginGL(); 〜 pgl.endGL();で囲んでやる必要があります。
このあたりは、Processingの公式ページにあるReference/library/openglあたりを参考にしてください。
Processing上で、pure Open GLを使う方法が書かれています。
Ver0.4で、ZIP圧縮されたファイルの読み込みがサポートされました。
content_provider = new LocalZipContentProvider(this, "d:\\MQOData\\hoge.zip", "hoge.mqo");
content_provider = new HttpZipContentProvider(this, "http://127.0.0.1/hoge.zip","hoge.mqo");
※素材ファイルも同じZIP書庫に含めてください。

Http...の方は、コンストラクタ作成時にZIPファイルをメモリに読み込んだあとは、 メモリ上のデータにアクセスしてターゲットのファイルを処理します。 ターゲットのファイルにアクセスする度にhttp通信を行わなくてすむため、webでの公開時のロード時間が短縮できます。 同じZIP書庫に含まれている別のMQO形式データを読み込みたい場合は、コンストラクタを再び呼び出すのではなく、changeEntry(filename)を用いることで、メモリ上に展開されているZIPファイルをそのまま利用する事が可能です。 ex) content_provider.changeEntry("hoge2.mqo");

Processing言語でライブラリすべてをカバーしようと思ったのですが、Processingでは高度なモデルの扱いは手にあまるのと、Processing自体も所詮Javaということもあり、ネイティブ対応にこだわるよりも割り切ってオーバーラップだけをする事にしました。
※取り急ぎ暫定的にページを立ち上げましたので、今後変更がいろいろ可能性があります。

3Dにおける、右手系と左手系

X軸、Y軸、Z軸の直交方向の違いを指します。 世の中には2つの系統が存在します。
右手系(右手の親指をX軸、人差し指をY軸、中指をZ軸。いずれも指先に向かって+方向)
採用システム・アプリ:OpenGL,Maya,メタセコイア,Blender,SGI出身のアプリケーション全般などなど
左手系(左手の親指をX軸、人差し指をY軸、中指をZ軸。いずれも指先に向かって+方向)
採用システム・アプリ:DirectX, Processingなどなど
こちらのページが分かりやすいかと思います。
「実践 3Dプログラミングの集い」Lecture 6: OpenGL / DirectXにおける3D基礎概念の対比

[変更履歴]

0.1b/0.1c > 0.2 2009/2/11
Processingの右手座標への変換ルーチンの正常化。座標系が異なるため、完全にはメタセコイアとの同じにはなりません。Z軸に対して後ろ向きになります。
0.1 > 0.1b 2009/2/1
ライブラリのコンパイラをJre6を使っており、一部の環境のProcessingでは動作しないことが判明したので、  1.5でコンパイルをやり直しました。

Author: Reco
Contact: fprintf@yahoo.co.jp (@は小文字に直してください。)
ブログの方にコメントを戴いても結構です。
ブログ
RECO-MEMO"

Counter