From 0e31b2e402fc5f7f72cef58d2975d3dd6d1c46b7 Mon Sep 17 00:00:00 2001 From: Daniel Shiffman Date: Mon, 18 Mar 2013 15:23:11 -0400 Subject: [PATCH] reworked Cubes example with OOP and PVector --- .../Topics/Motion/CubesWithinCube/Cube.pde | 128 ++++++++++++------ .../CubesWithinCube/CubesWithinCube.pde | 101 +++----------- 2 files changed, 102 insertions(+), 127 deletions(-) diff --git a/java/examples/Topics/Motion/CubesWithinCube/Cube.pde b/java/examples/Topics/Motion/CubesWithinCube/Cube.pde index 271792623..190722770 100644 --- a/java/examples/Topics/Motion/CubesWithinCube/Cube.pde +++ b/java/examples/Topics/Motion/CubesWithinCube/Cube.pde @@ -1,72 +1,114 @@ // Custom Cube Class -class Cube{ +class Cube { + // Position, velocity vectors + PVector position; + PVector velocity; + // Also using PVector to hold rotation values for 3 axes + PVector rotation; + + // Vertices of the cube PVector[] vertices = new PVector[24]; + // width, height, depth float w, h, d; - // Default constructor - Cube(){ } + // colors for faces of cube + color[] quadBG = new color[6]; - // Constructor 2 Cube(float w, float h, float d) { this.w = w; this.h = h; this.d = d; + + // Colors are hardcoded + quadBG[0] = color(0); + quadBG[1] = color(51); + quadBG[2] = color(102); + quadBG[3] = color(153); + quadBG[4] = color(204); + quadBG[5] = color(255); + + // Start in center + position = new PVector(); + // Random velocity vector + velocity = PVector.random3D(); + // Random rotation + rotation = new PVector(random(40, 100), random(40, 100), random(40, 100)); // cube composed of 6 quads //front - vertices[0] = new PVector(-w/2,-h/2,d/2); - vertices[1] = new PVector(w/2,-h/2,d/2); - vertices[2] = new PVector(w/2,h/2,d/2); - vertices[3] = new PVector(-w/2,h/2,d/2); + vertices[0] = new PVector(-w/2, -h/2, d/2); + vertices[1] = new PVector(w/2, -h/2, d/2); + vertices[2] = new PVector(w/2, h/2, d/2); + vertices[3] = new PVector(-w/2, h/2, d/2); //left - vertices[4] = new PVector(-w/2,-h/2,d/2); - vertices[5] = new PVector(-w/2,-h/2,-d/2); - vertices[6] = new PVector(-w/2,h/2,-d/2); - vertices[7] = new PVector(-w/2,h/2,d/2); + vertices[4] = new PVector(-w/2, -h/2, d/2); + vertices[5] = new PVector(-w/2, -h/2, -d/2); + vertices[6] = new PVector(-w/2, h/2, -d/2); + vertices[7] = new PVector(-w/2, h/2, d/2); //right - vertices[8] = new PVector(w/2,-h/2,d/2); - vertices[9] = new PVector(w/2,-h/2,-d/2); - vertices[10] = new PVector(w/2,h/2,-d/2); - vertices[11] = new PVector(w/2,h/2,d/2); + vertices[8] = new PVector(w/2, -h/2, d/2); + vertices[9] = new PVector(w/2, -h/2, -d/2); + vertices[10] = new PVector(w/2, h/2, -d/2); + vertices[11] = new PVector(w/2, h/2, d/2); //back - vertices[12] = new PVector(-w/2,-h/2,-d/2); - vertices[13] = new PVector(w/2,-h/2,-d/2); - vertices[14] = new PVector(w/2,h/2,-d/2); - vertices[15] = new PVector(-w/2,h/2,-d/2); + vertices[12] = new PVector(-w/2, -h/2, -d/2); + vertices[13] = new PVector(w/2, -h/2, -d/2); + vertices[14] = new PVector(w/2, h/2, -d/2); + vertices[15] = new PVector(-w/2, h/2, -d/2); //top - vertices[16] = new PVector(-w/2,-h/2,d/2); - vertices[17] = new PVector(-w/2,-h/2,-d/2); - vertices[18] = new PVector(w/2,-h/2,-d/2); - vertices[19] = new PVector(w/2,-h/2,d/2); + vertices[16] = new PVector(-w/2, -h/2, d/2); + vertices[17] = new PVector(-w/2, -h/2, -d/2); + vertices[18] = new PVector(w/2, -h/2, -d/2); + vertices[19] = new PVector(w/2, -h/2, d/2); //bottom - vertices[20] = new PVector(-w/2,h/2,d/2); - vertices[21] = new PVector(-w/2,h/2,-d/2); - vertices[22] = new PVector(w/2,h/2,-d/2); - vertices[23] = new PVector(w/2,h/2,d/2); - } - void create(){ + vertices[20] = new PVector(-w/2, h/2, d/2); + vertices[21] = new PVector(-w/2, h/2, -d/2); + vertices[22] = new PVector(w/2, h/2, -d/2); + vertices[23] = new PVector(w/2, h/2, d/2); + } + + // Cube shape itself + void drawCube() { // Draw cube - for (int i=0; i<6; i++){ - beginShape(QUADS); - for (int j=0; j<4; j++){ - vertex(vertices[j+4*i].x, vertices[j+4*i].y, vertices[j+4*i].z); - } - endShape(); - } - } - void create(color[]quadBG){ - // Draw cube - for (int i=0; i<6; i++){ + for (int i=0; i<6; i++) { fill(quadBG[i]); beginShape(QUADS); - for (int j=0; j<4; j++){ + for (int j=0; j<4; j++) { vertex(vertices[j+4*i].x, vertices[j+4*i].y, vertices[j+4*i].z); } endShape(); } } + + // Update location + void update() { + position.add(velocity); + + // Check wall collisions + if (position.x > bounds/2 || position.x < -bounds/2) { + velocity.x*=-1; + } + if (position.y > bounds/2 || position.y < -bounds/2) { + velocity.y*=-1; + } + if (position.z > bounds/2 || position.z < -bounds/2) { + velocity.z*=-1; + } + } + + + // Display method + void display() { + pushMatrix(); + translate(position.x, position.y, position.z); + rotateX(frameCount*PI/rotation.x); + rotateY(frameCount*PI/rotation.y); + rotateZ(frameCount*PI/rotation.z); + noStroke(); + drawCube(); // Farm out shape to another method + popMatrix(); + } } - diff --git a/java/examples/Topics/Motion/CubesWithinCube/CubesWithinCube.pde b/java/examples/Topics/Motion/CubesWithinCube/CubesWithinCube.pde index b20420fcc..2259ecd5f 100644 --- a/java/examples/Topics/Motion/CubesWithinCube/CubesWithinCube.pde +++ b/java/examples/Topics/Motion/CubesWithinCube/CubesWithinCube.pde @@ -4,114 +4,47 @@ * * Collision detection against all * outer cube's surfaces. - * Uses the Point3D and Cube classes. */ -Cube stage; // external large cube -int cubies = 20; -Cube[]c = new Cube[cubies]; // internal little cubes -color[][]quadBG = new color[cubies][6]; +// 20 little internal cubes +Cube[] cubies = new Cube[20]; -// Controls cubie's movement -float[]x = new float[cubies]; -float[]y = new float[cubies]; -float[]z = new float[cubies]; -float[]xSpeed = new float[cubies]; -float[]ySpeed = new float[cubies]; -float[]zSpeed = new float[cubies]; - -// Controls cubie's rotation -float[]xRot = new float[cubies]; -float[]yRot = new float[cubies]; -float[]zRot = new float[cubies]; - -// Size of external cube +// Size of outer cube float bounds = 300; void setup() { size(640, 360, P3D); - - for (int i = 0; i < cubies; i++){ - // Each cube face has a random color component - float colorShift = random(-75, 75); - quadBG[i][0] = color(0); - quadBG[i][1] = color(51); - quadBG[i][2] = color(102); - quadBG[i][3] = color(153); - quadBG[i][4] = color(204); - quadBG[i][5] = color(255); + for (int i = 0; i < cubies.length; i++) { // Cubies are randomly sized float cubieSize = random(5, 15); - c[i] = new Cube(cubieSize, cubieSize, cubieSize); - - // Initialize cubie's position, speed and rotation - x[i] = 0; - y[i] = 0; - z[i] = 0; - - xSpeed[i] = random(-1, 1); - ySpeed[i] = random(-1, 1); - zSpeed[i] = random(-1, 1); - - xRot[i] = random(40, 100); - yRot[i] = random(40, 100); - zRot[i] = random(40, 100); + cubies[i] = new Cube(cubieSize, cubieSize, cubieSize); } - - // Instantiate external large cube - stage = new Cube(bounds, bounds, bounds); + } -void draw(){ +void draw() { background(50); lights(); - + // Center in display window translate(width/2, height/2, -130); - - // Outer transparent cube - noFill(); - + // Rotate everything, including external large cube rotateX(frameCount * 0.001); rotateY(frameCount * 0.002); rotateZ(frameCount * 0.001); stroke(255); - - // Draw external large cube - stage.create(); + + + // Outer transparent cube, just using box() method + noFill(); + box(bounds); // Move and rotate cubies - for (int i = 0; i < cubies; i++){ - pushMatrix(); - translate(x[i], y[i], z[i]); - rotateX(frameCount*PI/xRot[i]); - rotateY(frameCount*PI/yRot[i]); - rotateX(frameCount*PI/zRot[i]); - noStroke(); - c[i].create(quadBG[i]); - x[i] += xSpeed[i]; - y[i] += ySpeed[i]; - z[i] += zSpeed[i]; - popMatrix(); - - // Draw lines connecting cubbies - stroke(0); - if (i < cubies-1){ - line(x[i], y[i], z[i], x[i+1], y[i+1], z[i+1]); - } - - // Check wall collisions - if (x[i] > bounds/2 || x[i] < -bounds/2){ - xSpeed[i]*=-1; - } - if (y[i] > bounds/2 || y[i] < -bounds/2){ - ySpeed[i]*=-1; - } - if (z[i] > bounds/2 || z[i] < -bounds/2){ - zSpeed[i]*=-1; - } + for (Cube c : cubies) { + c.update(); + c.display(); } }