2008/09/03

Flight404のソースコードを読み解く part3

エミッタを表示させる

前回は前準備の段階で終わったので、次はパーティクルを放出させるエミッタを表示してみる。エミッタはマウスに追随するようにばね運動をする。_gl.pdeは前回と変わっていないので省略する。コードは以下。

Particle2.pde

import toxi.geom.*;
import processing.opengl.*;
import javax.media.opengl.*;

// Settings about OPENGL
PGraphicsOpenGL pgl;
GL gl;

// Settings about Emitter
Emitter emitter;

// Settings about images
PImage particleImg;
PImage emitterImg;

void setup(){
size( 600, 600, OPENGL );
colorMode( RGB, 1.0);

hint( ENABLE_OPENGL_4X_SMOOTH );

pgl = (PGraphicsOpenGL) g;
gl = pgl.gl;
gl.setSwapInterval(1);

initGL();

particleImg = loadImage( "particle.png" );
emitterImg = loadImage( "emitter.png");

emitter = new Emitter();
}

void draw(){
background( 0.0 );
perspective( PI/3.0, (float)width/(float)height, 1, 5000 );

gl.glDepthMask(false);
gl.glEnable( GL.GL_BLEND );
gl.glBlendFunc( GL.GL_SRC_ALPHA, GL.GL_ONE );

pgl.beginGL();
emitter.exist();
pgl.endGL();
}

emitter.pde

class Emitter {
Vec3D loc;
Vec3D vel;
Vec3D velToMouse;

color myColor;

Emitter(){
loc = new Vec3D();
vel = new Vec3D();
velToMouse = new Vec3D();

myColor = color( 1, 1, 1 );
}

void exist(){
setVelToMouse();
findVelocity();
setPosition();

//rendering Emitter
gl.glEnable( GL.GL_TEXTURE_2D ); //Enable texture mapping
render();
gl.glDisable( GL.GL_TEXTURE_2D );
}

void setVelToMouse(){
velToMouse.set( mouseX - loc.x, mouseY - loc.y, 0 );
}

void findVelocity(){
vel.interpolateToSelf( velToMouse, 0.2 );
}

void setPosition(){
loc.addSelf( vel );
}

void render(){
pgl.bindTexture( emitterImg );
renderImage( loc, 200, myColor, 1.0 );
}
}

Particle2.pdeについては、Emitterクラスと画像の初期化、並びにemitter.exist()メソッドを付け加えただけ。主な処理はemitter.pdeで行っている。

実際のレンダリングはrender()が担当している。まずbindTexture()で貼り付けるテクスチャを指定して、_gl.pdeで定義したrenderImage()で描画している。その他のメソッドではエミッタの位置をマウスに追随させるようにしている。

interpolateToSelf()はtoxi.geom.Vec3Dで定義されている、自身のベクトルを他のベクトルに置き換えるメソッド。要はvelToMouseを0.2倍したベクトルに置き換えているだけ。この処理によって、エミッタはマウスの周辺でばね運動のような動きをする。

おーし次からが本番だ。

0 件のコメント: