I got it working thanks to Jonathan Feinberg's direction.
Here is an example based on the Hacks code using the Peasy camera. I'll post a more specific example using Peasy lookat features in this thread (http://processing.org/discourse/yabb_beta/YaBB.cgi?board=OpenGL;action=display;num=1234988194;start=15)
The primary change for dealing with a non-static camera using the hacks example is to comment out:
--- draw ---
//buffer.camera(-20, -20, 50, 0, 0, 0, 0, 1, 0);
//a += 0.002;
//if (a > TWO_PI) a -= TWO_PI;
--- mouseclicked ---
// buffer.camera(-20, -20, 50, 0, 0, 0, 0, 1, 0);
// buffer.rotateY(a);
and replace it with:
--- mouseclicked ---
buffer.setMatrix(((PGraphics3D)g).camera);
Quote:/**
picking code based on http://processinghacks.com/hacks:picking
@author nicolas clavaud
*/
import processing.opengl.*;
import peasy.*;
PeasyCam cam;
class Node {
// variables
int id; // id
int x, y, z, w; // position (x, y, z) and width (w)
color c; // color (in scene, not buffer)
// constructor
public Node(int id, int x, int y, int z, int w) {
this.id = id;
this.x = x; this.y = y; this.z = z; this.w = w;
c = color(random(255), 250, 50);
}
// make the color change
public void changeColor() {
int r = (int)red(c);
int g = (int)green(c);
int b = (int)blue(c);
c = color(r, 255 - g, b);
}
// display the Node on screen
public void display(PGraphics ecran) {
ecran.fill(c);
drawNode(ecran);
}
// draw the Node in the buffer
public void drawBuffer(PGraphics buffer) {
color idColor = getColor(id);
buffer.fill(idColor);
drawNode(buffer);
}
private void drawNode(PGraphics g) {
g.pushMatrix();
g.translate(x, y, z);
g.sphere(w);
g.popMatrix();
}
}
PGraphics buffer; // buffer
Node[] Nodes; // Nodes
//float a = 0; // angle to make the scene rotate
void setup() {
// we use OPENGL for display
size(800, 600, OPENGL);
cam = new PeasyCam(this, 100);
cam.setResetOnDoubleClick(false);
cam.setMinimumDistance(50);
cam.setMaximumDistance(5000);
// buffer is created using applet dimensions
buffer = createGraphics(width, height, P3D);
// put Nodes randomly in the scene
Nodes = new Node[10];
for (int i = 0; i < Nodes.length; i++) {
Nodes[i] = new Node(
i, // identifiant
-15 + (int)random(30), // position x
-15 + (int)random(30), // position y
-15 + (int)random(30), // position z
5 + (int)random(15) // taille
);
}
}
void draw() {
background(0);
// camera(-20, -20, 50, 0, 0, 0, 0, 1, 0);
lights();
for (int i = 0; i < Nodes.length; i++) {
Nodes[i].display(this.g);
}
//a += 0.002;
//if (a > TWO_PI) a -= TWO_PI;
}
void mouseClicked() {
// draw the scene in the buffer
buffer.beginDraw();
buffer.background(getColor(-1)); // since background is not an object, its id is -1
buffer.noStroke();
buffer.sphereDetail(10);
buffer.setMatrix(((PGraphics3D)g).camera);
//buffer.camera(-20, -20, 50, 0, 0, 0, 0, 1, 0);
//buffer.rotateY(a);
for (int i = 0; i < Nodes.length; i++) {
Nodes[i].drawBuffer(buffer);
}
buffer.endDraw();
// get the pixel color under the mouse
color pick = buffer.get(mouseX, mouseY);
// get object id
int id = getId(pick);
// if id > 0 (background id = -1)
if (id >= 0) {
// change the Node color
Nodes[id].changeColor();
}
}
// id 0 gives color -2, etc.
color getColor(int id) {
return -(id + 2);
}
// color -2 gives 0, etc.
int getId(color c) {
return -(c + 2);
}