背景
昨日でマーカーに立方体を表示させることができたから、今日は3Dモデルを描画してみる。
実装
メタセコイア形式の3Dモデルをロード&描画するために
MQOViewerというライブラリを使う。
3Dモデルは
ここからダウンロードしてつかった。
ソースコードは以下のようになった。
import javax.media.opengl.*;
import processing.opengl.*;
import jp.nyatla.nyar4psg.*;
import processing.video.*;
import jp.nyatla.kGLModel.*;
import jp.nyatla.kGLModel.contentprovider.*;
Capture cam;
MultiMarker ar;
int id;
KGLModelData model_data;
ContentProvider content_provider;
void setup() {
size(640, 480, OPENGL);
cam = new Capture(this, width, height);
ar = new MultiMarker(this, width, height, "camera_para.dat", NyAR4PsgConfig.CONFIG_PSG);
id = ar.addARMarker("patt.hiro", 80);
// Load 3D Model
content_provider = new LocalContentProvider(this, dataPath("plant.mqo"));
PGraphicsOpenGL pgl = (PGraphicsOpenGL)g;
GL gl = pgl.beginGL();
model_data = KGLModelData.createGLModelPs(
this, gl, null,
this.content_provider,1.0,
KGLExtensionCheck.IsExtensionSupported(gl,
"GL_ARB_vertex_buffer_object"),
true);
pgl.endGL();
}
void draw() {
if (cam.available() == false) return;
cam.read();
background(0);
ar.drawBackground(cam);
ar.detect(cam);
if (ar.isExistMarker(id)) {
ar.beginTransform(id);
PGraphicsOpenGL pgl = (PGraphicsOpenGL)g;
GL gl = pgl.beginGL();
gl.glTexEnvf(GL.GL_TEXTURE_ENV, GL.GL_TEXTURE_ENV_MODE, GL.GL_MODULATE);
gl.glEnable(GL.GL_CULL_FACE);
gl.glCullFace(GL.GL_FRONT);
// Light Setting
mySetLight(gl, 0, -100, 100);
// Arrange 3D model's direction
gl.glRotatef(90, 1, 0, 0);
gl.glRotatef(180, 0, 1, 0);
model_data.draw();
pgl.endGL();
ar.endTransform();
}
}
// Light Setting
void mySetLight(GL gl, float x, float y, float z) {
float[] light_diffuse = { 0.2, 0.2, 0.2, 1.0 };
float[] light_specular = { 0.3, 0.3, 0.3, 1.0 };
float[] light_ambient = { 0.3, 0.3, 0.3, 0.1 };
float[] light_position = { x, y, z, 0.0 };
gl.glLightfv(gl.GL_LIGHT0, gl.GL_DIFFUSE, light_diffuse, 0);
gl.glLightfv(gl.GL_LIGHT0, gl.GL_SPECULAR, light_specular, 0);
gl.glLightfv(gl.GL_LIGHT0, gl.GL_AMBIENT, light_ambient, 0);
gl.glLightfv(gl.GL_LIGHT0, gl.GL_POSITION, light_position, 0);
gl.glShadeModel(gl.GL_SMOOTH);
gl.glEnable(gl.GL_LIGHT0);
gl.glEnable(gl.GL_LIGHTING);
}
実行結果
カメラとマーカーを使って実行した結果、次のようになった。
相変わらずprocessingは簡単に書ける。