1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 |
Ball3D[] balls; static final int numBalls = 50; float fl = 250; float vpX = 0; float vpY = 0; void setup() { size(960, 540); frameRate(30); initialize(); } void initialize() { smooth(); vpX = width/2; vpY = height/2; balls = new Ball3D[numBalls]; for(int i=0; i<numBalls; i++) { balls[i] = new Ball3D(5.0); balls[i].xpos = random(200) - 100; balls[i].ypos = random(200) - 100; balls[i].zpos = random(200) - 100; balls[i].setFillColor(color(0)); } } void draw() { background(255); float angleX = (mouseY - vpY) * 0.001; float angleY = (mouseX - vpX) * 0.001; for(int i=0; i<numBalls; i++) { Ball3D ball = balls[i]; rotateX(ball, angleX); rotateY(ball, angleY); doPerspective(ball); } for(int i = 1; i < numBalls; i++) { line(balls[i-1].x, balls[i-1].y, balls[i].x, balls[i].y); } for(int i=0; i<numBalls; i++) { balls[i].update(); } } void rotateX(Ball3D ball, float angleX) { float cosX = cos(angleX); float sinX = sin(angleX); float y1 = ball.ypos * cosX - ball.zpos * sinX; float z1 = ball.zpos * cosX + ball.ypos * sinX; ball.ypos = y1; ball.zpos = z1; } void rotateY(Ball3D ball, float angleY) { float cosY = cos(angleY); float sinY = sin(angleY); float x1 = ball.xpos * cosY - ball.zpos * sinY; float z1 = ball.zpos * cosY + ball.xpos * sinY; ball.xpos = x1; ball.zpos = z1; } void doPerspective(Ball3D ball) { if(ball.zpos > -fl) { float scale = fl / (fl + ball.zpos); ball.scaleX = ball.scaleY = scale; ball.x = vpX + ball.xpos * scale; ball.y = vpY + ball.ypos * scale; ball.visible = true; }else{ ball.visible = false; } } void sortZ() { for(int i=0; i<numBalls - 1; i++) { for(int j=numBalls-1; j>i; j--) { if(balls[j].zpos > balls[j-1].zpos) { Ball3D t = balls[j]; balls[j] = balls[j-1]; balls[j-1] = t; } } } for(int i=0; i<numBalls; i++) { Ball3D ball = balls[i]; ball.update(); } } //////////////////////////////// class Ball3D extends Sprite { float radius; float xpos = 0; float ypos = 0; float zpos = 0; float vx = 0; float vy = 0; float vz = 0; float mass = 1; Ball3D(float radius){ super(); this.radius = radius; } void draw(){ if(dist(mouseX, mouseY, x, y) < radius) { isRollOver = true; }else{ isRollOver = false; } ellipse(0, 0, radius*2, radius*2); } } //////////////////////////////// class Sprite extends Object { float x, y; float scaleX, scaleY; float width, height; float rotation; boolean visible; color strokeColor; color fillColor; Boolean isStroke; Boolean isFill; Boolean isRollOver; Boolean locked; float xoff, yoff; Sprite() { super(); scaleX = 1.0; scaleY = 1.0; strokeColor = color(0); fillColor = color(0); isStroke = false; isFill = false; isRollOver = false; locked = false; visible = true; } void update() { if(! visible) return; pushMatrix(); if(locked){ x = mouseX - xoff; y = mouseY - yoff; } translate(x, y); scale(scaleX, scaleY); rotate(rotation * PI / 180.0); if(isStroke) stroke(strokeColor); if(isFill) fill(fillColor); draw(); popMatrix(); } void setStrokeColor(color strokeColor) { this.strokeColor = strokeColor; isStroke = true; } void setFillColor(color fillColor) { this.fillColor = fillColor; isFill = true; } void startDrag() { if(isRollOver){ locked = true; xoff = mouseX - x; yoff = mouseY - y; } } void stopDrag() { locked = false; } void draw() {} } //////////////////////////////// class Point extends Object { float x, y; Point(float x, float y) { super(); this.x = x; this.y = y; } } //////////////////////////////// class Object { Object() {} } |