ズッキーニのプログラミング実験場

プログラミング + アカデミック + 何か面白いこと。 記載されているものは基本的に私が所属する団体とは関係がありません。

   Jun 10

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

by zuqqhi2 at 2013年6月10日
Pocket

背景

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

Related Posts

  • 2013年6月9日 [AR]NyARToolkitを使ってみる 概要 マーカーベースのARプログラムを作成するためのライブラリとしてARToolKitというものがあるが、 それのProcessing版であるNyARToolkitを使用して簡単なARプログラムを作成してみる。 実装 ここから ライブラリをダウンロードして中身を一 […]
  • 2013年4月27日 [Kinect][Processing][Windows]環境準備 kinect processing windows インストール processingでkinectを扱うためには以下をインストールする必要がある。 OpenNI : Kinectを使うためのライブラリ NITE : […]
  • 2013年6月8日 [Processing]カメラの利用方法 概要 Processing カメラ ProcessingでARプログラムを作成するためにカメラを利用するプログラムを作ってみる。 ソースコード 以下がそのソースコード。 Processingだとものすごく簡単にかけるから便利! […]
  • 2015年1月12日 [Javascript][Three.js][3D]OBJ形式3Dモデルの表示とマウス操作 Target OBJ形式の3Dモデルの表示とそのマウス操作 Environment OSLinux 2.6.32-279.el6.x86_64 #1 SMP Fri Jun 22 12:19:21 UTC 2012 x86_64 x86_64 […]
  • 2013年5月30日 [Javascript][Three.js]マウス操作 前回の記事のindex.htmlに新規部分を追加した以下のmain.jsを読みこませる。 結果は次のようになる。ドラッグで立方体が回転する。 Three.js面白いな。何か作ってみよう。 I make html file which is previous […]
  • 2013年5月29日 [Javascript]Three.jsを触る Three.jsでブラウザ上で3D空間の描画が簡単にできるみたいだ。 threejs.org 簡単に立方体を書いてみる。 以下、ここのまねをして書いてみる。 まずはダウンロード。 ここのbuildディレクトリの中にあるthree.min.jsを使う。 […]
Pocket

You can follow any responses to this entry through the RSS 2.0 feed. Both comments and pings are currently closed.