Production Level Knowledge & Tips. Updated at every month 1st Monday 7:00 AM JST.

  1. アカデミック
  2. 38 view

[AR][Processing]3Dモデルの描画

背景

昨日でマーカーに立方体を表示させることができたから、今日は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);
}

実行結果

model
カメラとマーカーを使って実行した結果、次のようになった。
相変わらずprocessingは簡単に書ける。

アカデミックの最近記事

  1. How to bring columns not GROUP BY key from ne…

  2. HiveでGROUP BYを伴うサブクエリのネストからGROUP BYのキー以外のカラムを…

  3. How to drop Hive’s External Table

  4. HiveでExternal Tableを削除する方法メモ

  5. [触ってみた]Microsoft Quantum Development Kit

関連記事

PAGE TOP