final float ZERO_X_ROT = PI - 0.4; final float ZERO_Z_ROT = PI/2 + 0.4; float xmag = ZERO_X_ROT, zmag = ZERO_Z_ROT; float newXmag = ZERO_X_ROT, newZmag = ZERO_Z_ROT; float rx,rz; float xpos, ypos; float px,py; boolean rdragged = false, pdragged = false; void beginCamera() { push(); if (mousePressed) { if (keyPressed) { println("_"+key+"_"); updateCameraPos(); } else { updateCameraRot(); } } else { xpos = width/2; ypos = height*0.9; newZmag = ZERO_X_ROT; newXmag = ZERO_Z_ROT; pdragged = false; rdragged = false; } float diff = xmag-newXmag; if (abs(diff) > 0.01) xmag -= diff/4.0; diff = zmag-newZmag; if (abs(diff) > 0.01) zmag -= diff/4.0; translate(xpos, ypos, -10); rotateX(-xmag); rotateZ(-zmag); scale(8); ortho(-1,1,-1,1,-1,1); } void endCamera() { pop(); } void updateCameraPos() { if (pdragged) { xpos = px - (pmouseX - mouseX); ypos = py - (pmouseY - mouseY); px = xpos; py = ypos; } else { px = xpos; py = ypos; pdragged = true; } } void updateCameraRot() { if (rdragged) { newXmag = rx - (pmouseY - mouseY)/float(height) * TWO_PI; newZmag = rz + (pmouseX - mouseX)/float(width) * TWO_PI; rx = newXmag; rz = newZmag; } else { rx = xmag; rz = zmag; rdragged = true; } }