|
Author |
Topic: transparency display order (Read 343 times) |
|
Mark Hill
|
transparency display order
« on: Oct 26th, 2004, 1:49pm » |
|
Hi, I'm new to processing and have encountered a problem I can't solve. I need some help with this as my graphics programming is pretty thin and very outdated. Using the alpha channel to display semi-transparent cubes highlights the need for a method to display cube facets according to their current orientation, otherwise the normal display order affects how the transparency will work. Here's some basic code that highlights the problem (it uses a webcam) The screen rotation affects the display order making certain frontal planes opaque when they should be semi-transparent in order to reveal the hidden facets (the cubes need to be drawn from the back in my estimation). Does anyone have a way of producing a display order buffer for each plane? Thanks in advance. Mark. code... float cubeScale=40; float xmag, ymag = 0; float newXmag, newYmag = 0; int nNode = 1; Node[] node = new Node[nNode]; float rotY, rotX; int vDimX= 200; int vDimY= 200; void setup() { size(600,600); noStroke(); beginVideo(vDimX, vDimY, 25); float j= 0; //-1; float k= 0; //-1; float l= 0; //-1; for (int i=0;i<nNode;i++) { node[i] = new Node(j, k, l); if(j++>= 1) {j=-1; if(k++>=1) {k=-1; l++;}} } } void mouseDragged() { newXmag = mouseX/float(width) * TWO_PI; newYmag = mouseY/float(height) * TWO_PI; } void loop() { background(0); translate(width/2,height/2, 0); float diff = xmag-newXmag; if (abs(diff) > 0.01) { xmag -= diff/4.0; } diff = ymag-newYmag; if (abs(diff) > 0.01) { ymag -= diff/4.0; } rotateX(-ymag); rotateY(-xmag); int i= (int)random(0, nNode); int j= (int)random(0, 6); node[i].updateFacet(node[i].facets[j]); for (int k= 0; k< nNode; k++) { node[k].draw(); } if(cubeScale <100) {cubeScale+=0.25;} } class Node { float xpos= 0; float ypos= 0; float zpos= 0; BImage[] facets; Node(float x, float y, float z) { xpos = x*100; ypos = y*100; zpos = z*100; facets = new BImage[6]; for(int i=0; i<6; i++) { facets[i] = new BImage(vDimX, vDimY); } } void updateFacet(BImage facet) { for(int i=0; i<facet.width*facet.height; i++) { facet.pixels[i]= video.pixels[i]; } } void draw() { push(); translate(xpos,ypos,zpos); scale(cubeScale); fill(128, 128, 0, 210); beginShape(QUADS); texture(facets[0]); vertex(-1, 1, 1, -vDimX, vDimY); vertex( 1, 1, 1, vDimX, vDimY); vertex( 1, -1, 1, vDimX, -vDimY); vertex(-1, -1, 1, -vDimX, -vDimY); endShape(); fill(128, 210); beginShape(QUADS); texture(facets[1]); vertex( 1, 1, 1, -vDimX, vDimY); vertex( 1, 1, -1, vDimX, vDimY); vertex( 1, -1, -1, vDimX, -vDimY); vertex( 1, -1, 1, -vDimX, -vDimY); endShape(); beginShape(QUADS); texture(facets[2]); vertex( 1, 1, -1, -vDimX, vDimY); vertex(-1, 1, -1, vDimX, vDimY); vertex(-1, -1, -1, vDimX, -vDimY); vertex( 1, -1, -1, -vDimX, -vDimY); endShape(); beginShape(QUADS); texture(facets[3]); vertex(-1, 1, -1, -vDimX, vDimY); vertex(-1, 1, 1, vDimX, vDimY); vertex(-1, -1, 1, vDimX, -vDimY); vertex(-1, -1, -1, -vDimX, -vDimY); endShape(); beginShape(QUADS); texture(facets[4]); vertex(-1, 1, -1, -vDimX, vDimY); vertex( 1, 1, -1, vDimX, vDimY); vertex( 1, 1, 1, vDimX, -vDimY); vertex(-1, 1, 1, -vDimX, -vDimY); endShape(); beginShape(QUADS); texture(facets[5]); vertex(-1, -1, -1, -vDimX, vDimY); vertex( 1, -1, -1, vDimX, vDimY); vertex( 1, -1, 1, vDimX, -vDimY); vertex(-1, -1, 1, -vDimX, -vDimY); endShape(); pop(); } }
|
|
|
|
|