/* built with Studio Sketchpad:
* https://sketchpad.cc
*
* observe the evolution of this sketch:
* https://studio.sketchpad.cc/sp/pad/view/ro.37kmnnDoE91/rev.4
*
* authors:
* GoToLoop
* license (unless otherwise specified):
* creative commons attribution-share alike 3.0 license.
* https://creativecommons.org/licenses/by-sa/3.0/
*/
// Nature of Code - EXERCISE 1.3 - 3D Bouncing Ball
// Extend the bouncing ball with vectors example into 3D.
// Can you get a sphere to bounce around a box?
// https://forum.processing.org/topic/
// the-nature-of-code-code-solutions-of-the-examples
// studio.processingtogether.com/sp/pad/export/ro.9o1T5z1ghf2s7/latest
final PVector location = new PVector();
final PVector velocity = new PVector(3, 2, 4);
final static int BALL_DIM = 30;
final static int CUBE_DIM = 450, CUBE_RAD = CUBE_DIM >> 1;
int cx, cy;
void setup() {
size(400, 400, P3D);
strokeWeight(2);
cx = width >> 1;
cy = height >> 1;
}
void draw() {
background(-1);
drawCube();
moveSphere();
drawSphere();
}
void drawCube() {
//move cube and ball to center:
translate(cx, cy, -CUBE_DIM);
//rotate cube and ball so it's 3D-ness can be appreciated:
rotateX(-QUARTER_PI);
rotateY(QUARTER_PI);
rotateZ(QUARTER_PI/2);
//draw cube:
noFill();
stroke(0);
box(CUBE_DIM);
}
void moveSphere() {
//move ball:
location.add(velocity);
//detect edges with center at 0,0 and edge minus width of ball:
if ( checkBounce(location.x) ) velocity.x *= -1;
if ( checkBounce(location.y) ) velocity.y *= -1;
if ( checkBounce(location.z) ) velocity.z *= -1;
}
void drawSphere() {
//draw ball, and lights for definition:
translate(location.x, location.y, location.z);
fill(0300);
noStroke();
lights();
sphere(BALL_DIM);
}
static final boolean checkBounce(float coord) {
return coord > CUBE_RAD - BALL_DIM | coord < BALL_DIM - CUBE_RAD;
}