/* 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; }