生徒作品 - 3Dブロック崩し

高校生の生徒さんが1コマの授業時間で作成した作品です。3Dのブロック崩しです。
3dblock

Fisica(Processing用の物理エンジン)と3Dを組み合わせて作成しました。ある程度Fisicaを使いこなせるようになったので、

生徒さんのソースコードをそのまま以下に引用します。

import fisica.*;
FWorld world;
FBox paddle;
FCircle ball;
int score=0;

void setup() {
  size(600, 600, P3D);
  noStroke();
  textAlign(CENTER);
  textSize(50);
  Fisica.init(this);
  world=new FWorld();
  world.setGravity(0, 0);
  world.setEdges(0, 0, width, height);
  world.remove(world.bottom);

  for (int i=0; i<8; i++) {
    for (int j=0; j<5; j++) {
      FBox box=new FBox( 60, 20);
      box.setFill(j*50, j, 150);
      box.setPosition(i*70+50, 30*j+30);
      box.setStatic(true);
      box.setFriction(0);
      box.setRestitution(1);
      box.setName("block");
      world.add(box);
    }
  }

  paddle=new FBox(70, 30);
  paddle.setStatic(true);
  paddle.setFriction(0);
  paddle.setRestitution(1);
  paddle.setFill(30,140,180);
  paddle.setName("paddle");
  world.add(paddle);

  ball=new FCircle(20);
  ball.addForce(10000,20000);
  ball.setDamping(0);
  ball.setPosition(width/2, height/2);
  ball.setName("ball");
  ball.setFriction(0);
  ball.setRestitution(1);
  world.add(ball);
}

void draw() {
  background(0);
  
  camera(width/2+width/2-mouseX,800+height/2-mouseY,500,width/2,height/2,0,0,1,0);
  
  paddle.setPosition(mouseX, 550);
  //world.draw();
  if(ball.getY()>=height){
    fill(255,0,0);
    pushMatrix();
    camera(width/2,height/2,500,width/2,height/2,0,0,1,0);
    text("GameOver",width/2,height/2);
    popMatrix();
  }
  
  pushMatrix();
  fill(0,200,0);
  camera(width/2,height/2,500,width/2,height/2,0,0,1,0);
  text("Score:"+score,500,100);
  popMatrix();
  world.step();
  
  ArrayList<FBody>bodies=world.getBodies();
  for(FBody b:bodies){
    if(b.getName()=="ball"){
      
      ArrayList<FContact>contacts=b.getContacts();
      for(FContact c:contacts){
        if(c.getBody1().getName()=="block"){
          world.remove(c.getBody1());
          score+=1;
        }
        if(c.getBody2().getName()=="block"){
          world.remove(c.getBody2());
          score+=1;
        }
      }
    }
    if (b instanceof FBox){
      draw3DBox((FBox)b);
    }
    if(b instanceof FCircle){
      draw3DCircle((FCircle)b);
    }
  }
}

void draw3DBox(FBox b){
  pushMatrix();
  fill(b.getFillColor());
  stroke(100);
  translate(b.getX(),b.getY());
  box(b.getWidth(),b.getHeight(),40);
  popMatrix();
}

void draw3DCircle(FCircle c){
  pushMatrix();
  fill(c.getFillColor());
  noStroke();
  translate(c.getX(),c.getY());
  sphere(c.getSize());
  popMatrix();
}