Initial Commit
This commit is contained in:
@@ -0,0 +1,114 @@
|
||||
|
||||
// Custom Cube Class
|
||||
|
||||
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;
|
||||
|
||||
// colors for faces of cube
|
||||
color[] quadBG = new color[6];
|
||||
|
||||
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);
|
||||
//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);
|
||||
//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);
|
||||
//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);
|
||||
//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);
|
||||
//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);
|
||||
}
|
||||
|
||||
// Cube shape itself
|
||||
void drawCube() {
|
||||
// Draw cube
|
||||
for (int i=0; i<6; i++) {
|
||||
fill(quadBG[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();
|
||||
}
|
||||
}
|
||||
|
||||
// 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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,50 @@
|
||||
/**
|
||||
* Cubes Contained Within a Cube
|
||||
* by Ira Greenberg.
|
||||
*
|
||||
* Collision detection against all
|
||||
* outer cube's surfaces.
|
||||
*/
|
||||
|
||||
// 20 little internal cubes
|
||||
Cube[] cubies = new Cube[20];
|
||||
|
||||
// Size of outer cube
|
||||
float bounds = 300;
|
||||
|
||||
void setup() {
|
||||
size(640, 360, P3D);
|
||||
|
||||
for (int i = 0; i < cubies.length; i++) {
|
||||
// Cubies are randomly sized
|
||||
float cubieSize = random(5, 15);
|
||||
cubies[i] = new Cube(cubieSize, cubieSize, cubieSize);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void draw() {
|
||||
background(50);
|
||||
lights();
|
||||
|
||||
// Center in display window
|
||||
translate(width/2, height/2, -130);
|
||||
|
||||
// Rotate everything, including external large cube
|
||||
rotateX(frameCount * 0.001);
|
||||
rotateY(frameCount * 0.002);
|
||||
rotateZ(frameCount * 0.001);
|
||||
stroke(255);
|
||||
|
||||
|
||||
// Outer transparent cube, just using box() method
|
||||
noFill();
|
||||
box(bounds);
|
||||
|
||||
// Move and rotate cubies
|
||||
for (Cube c : cubies) {
|
||||
c.update();
|
||||
c.display();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user