/* ToDo: - pmouseX/Y doesn't work correctly during pause. PApplet has dmouse & emouse. pmouse is set each time thru the draw loop so should probably be set whenever loop() is called. */ class Nav { float cameraX0, cameraY0, cameraZ0, targetX0, targetY0, targetZ0; PApplet parent0; Camera camera1; Camera camera2; Nav(PApplet parent, float cameraX, float cameraY, float cameraZ, float targetX, float targetY, float targetZ) { cameraX0 = cameraX; cameraY0 = cameraY; cameraZ0 = cameraZ; targetX0 = targetX; targetY0 = targetY; targetZ0 = targetZ; parent0 = parent; reset(); } void setTransform() { setTransform(true); } void setTransform(boolean checkMouse) { if (checkMouse && mousePressed) { float dx = mouseX - pmouseX, dy = mouseY - pmouseY; mousepause = true; if (keyPressed && key==CODED) { switch(keyCode) { case SHIFT: camera1.zoom(radians(dy) / 2); break; case ALT: camera1.track(-dx, -dy); break; /* case CONTROL: reset(); break; */ } } else { camera1.tumble(radians(-dx), radians(-dy)); } } else { mousepause = false; } camera1.feed(); } void showAxes(float axisLength, PFont font) { //pushMatrix(); stroke(0,255,0); line(0,0,0,axisLength,0,0); line(0,0,0,0,axisLength,0); line(0,0,0,0,0,axisLength); //PFont font = loadFont("AlBayan-24.vlw"); //textAlign(LEFT); textSize(4); fill(0,255,0,100); billboard.BeginBillboard(axisLength*1.125,0,0); text("X",0,0,0); billboard.EndBillboard(); billboard.BeginBillboard(0,axisLength*1.125,0); text("Y",0,0,0); billboard.EndBillboard(); billboard.BeginBillboard(0,0,axisLength*1.125); text("Z",0,0,0); billboard.EndBillboard(); //popMatrix(); } void reset() { camera1 = new Camera(parent0, cameraX0, cameraY0, cameraZ0, targetX0, targetY0, targetZ0); camera2 = new Camera(parent0); //camera2.look(PI,0); } } class BillBoard { //from http://processing.org/discourse/yabb_beta/YaBB.cgi?board=Contribution_3DOpenGL;action=display;num=1116313488 //see http://campbellhoge.us/cchoge/billboard/ PGraphics3D m_engine; PMatrix m_inv; // From setup() call billboard = new Billboard( (PGraphics3)(this.g)); BillBoard( PGraphics3D engine ) { m_engine = engine; } // x, y, and z are the local coordinates of the object // you want to billboard void BeginBillboard( float x, float y, float z ) { m_inv = m_engine.cameraInv; float[] in = new float[4]; float[] out = new float[4]; in[0] = x; in[1] = y; in[2] = z; in[3] = 1; m_engine.camera.mult( in,out ); pushMatrix(); applyMatrix( m_inv.m00, m_inv.m01, m_inv.m02, m_inv.m03, m_inv.m10, m_inv.m11, m_inv.m12, m_inv.m13, m_inv.m20, m_inv.m21, m_inv.m22, m_inv.m23, m_inv.m30, m_inv.m31, m_inv.m32, m_inv.m33 ); translate( out[0], out[1], out[2] ); } void EndBillboard() { popMatrix(); } }