mirror of
https://github.com/processing/processing4.git
synced 2026-01-29 11:21:06 +01:00
118 lines
2.6 KiB
Plaintext
118 lines
2.6 KiB
Plaintext
/**
|
|
* Cubes Contained Within a Cube
|
|
* by Ira Greenberg.
|
|
*
|
|
* 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];
|
|
|
|
// 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
|
|
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);
|
|
|
|
// 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);
|
|
}
|
|
|
|
// Instantiate external large cube
|
|
stage = new Cube(bounds, bounds, bounds);
|
|
}
|
|
|
|
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();
|
|
|
|
// 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;
|
|
}
|
|
}
|
|
}
|
|
|