ForumにMQOの表示方法の質問があったので、スケッチ書きました。MQOファイルをHiroマーカの上に表示します。

Source code
MqoView.java
import javax.media.opengl.*;
import jp.nyatla.kGLModel.KGLException;
import jp.nyatla.kGLModel.KGLExtensionCheck;
import jp.nyatla.kGLModel.KGLModelData;
import jp.nyatla.kGLModel.contentprovider.LocalContentProvider;
import jp.nyatla.nyartoolkit.core.NyARException;
import jp.nyatla.nyartoolkit.jmf.utils.*;
import jp.nyatla.nyartoolkit.jogl.sketch.GlSketch;
import jp.nyatla.nyartoolkit.jogl.utils.*;
import jp.nyatla.nyartoolkit.markersystem.NyARMarkerSystemConfig;
/**
* This program shows a Mqo model.
*/
public class MqoView extends GlSketch
{
private NyARJmfCamera camera;
private NyARGlMarkerSystem nyar;
private NyARGlRender render;
private KGLModelData model_data; // kei add
public void setup(GL gl)throws NyARException
{
this.size(640,480);
NyARMarkerSystemConfig config = new NyARMarkerSystemConfig(640,480);
JmfCaptureDeviceList devlist = new JmfCaptureDeviceList();
JmfCaptureDevice d = devlist.getDevice(0);
d.setCaptureFormat(config.getScreenSize(),30.0f);
this.camera=new NyARJmfCamera(d);//create sensor system
this.nyar=new NyARGlMarkerSystem(config); //create MarkerSystem
this.render=new NyARGlRender(this.nyar);
this.id=this.nyar.addARMarker("data/patt.hiro",16,25,80);
try {
LocalContentProvider content_provider=new LocalContentProvider("data/miku_xx08/miku.mqo");
model_data = KGLModelData.createGLModel(gl,null,content_provider,0.015f, KGLExtensionCheck.IsExtensionSupported(gl,"GL_ARB_vertex_buffer_object"));
} catch (KGLException e) {
e.printStackTrace();
throw new NyARException(e);
}
gl.glEnable(GL.GL_DEPTH_TEST);
this.camera.start();
}
private int id;
public void draw(GL gl)
{
synchronized(this.camera){
try {
this.render.drawBackground(gl, this.camera.getSourceImage());
this.render.loadARProjectionMatrix(gl);
this.nyar.update(this.camera);
if(this.nyar.isExistMarker(this.id)){
// Viewing transformation.
gl.glLoadIdentity();
this.render.loadMarkerMatrix(gl,this.id);
gl.glTranslatef(0.0f,0.0f,0.0f) ;//position
gl.glRotatef(90.0f,1.0f, 0.0f, 0.0f); //OpenGL座標系→ARToolkit座標系
gl.glEnable(GL.GL_CULL_FACE);
gl.glCullFace(GL.GL_FRONT);
model_data.enables(10.0f);
model_data.draw() ;
model_data.disables() ;
}
Thread.sleep(1);
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static void main(String[] args)
{
try {
new MqoView();
} catch (Exception e) {
e.printStackTrace();
}
return;
}
}
解説
MQOの表示には、keiさん作のKGLを若干改変したものを使用しています。
スケッチの重要な部分は2箇所です。
setupでは、MQOファイルを読み込みます。
LocalContentProvider content_provider=new LocalContentProvider("data/miku_xx08/miku.mqo");
model_data = KGLModelData.createGLModel(gl,null,content_provider,0.015f, KGLExtensionCheck.IsExtensionSupported(gl,"GL_ARB_vertex_buffer_object"));
drawでは、読み込んだモデルを表示しています。
if(this.nyar.isExistMarker(this.id)){
// Viewing transformation.
gl.glLoadIdentity();
this.render.loadMarkerMatrix(gl,this.id);
gl.glTranslatef(0.0f,0.0f,0.0f) ;//position
gl.glRotatef(90.0f,1.0f, 0.0f, 0.0f); //OpenGL座標系→ARToolkit座標系
gl.glEnable(GL.GL_CULL_FACE);
gl.glCullFace(GL.GL_FRONT);
model_data.enables(10.0f);
model_data.draw() ;
model_data.disables() ;
}
Setup
projectファイルは MqoModel-20120326.zip からダウンロードできます。実効には、JMF、JOGL、NyARToolkit version 4.xが必要です。あらかじめセットアップして置いてください。
Hiroマーカを撮影すると、プリセットされているミクさんのモデルが表示されます。
3D modelについて
プリセットされている3Dmodelは、三次元CG@七葉 nh0072.zipを編集して使用しています。
English
This sketch shows MQO-model above “Hiro” marker.
Source code
Main program is MqoView.java
Description of source code
MQO library is KGL by kei-san.
The changed parts are below.
- setup – MQO loader codes.
- draw – MQO drawing codes.
Setup
The eclipse project is MqoModel-20120326.zip . The project requires external libraries, JMF ,JOGL, NyARToolkit version 4.x. Please set up these libraries.