3Dボールキャッチ

Processingではカメラの位置をかえるだけで3Dの表現が可能になります。
以下はFisicaを使ってボールが上から落ちてくるだけのシンプルなスケッチです。
BallCatch3D0

import fisica.*;

FWorld world;

void setup() {
  size(600, 600, P3D);
  Fisica.init(this);
  world = new FWorld();
  world.setEdges();
  world.remove(world.bottom);
  for (int y = 0; y < 9; y++) {
    for (int x = 0; x < 10 + y % 2; x++) {
      FCircle c = new FCircle(5);
      c.setPosition(x * 50 + 75 - y % 2 * 25, y * 50 + 75);
      c.setStatic(true);
      c.setFill(0);
      world.add(c);
    }
  }
  noStroke();
  textSize(50);
  textAlign(CENTER);
}

void draw() {
  background(220);

  world.step();
  world.draw();  
  if (frameCount % 100 == 0) {
    FCircle c = new FCircle(20);
    c.setName("ball");
    c.setPosition(random(width), 0);
    c.setFill(255, 0, 0);
    c.setNoStroke();
    world.add(c);
  }
}

100フレーム毎にFCircleオブジェクトを作成し、worldに追加しています。setupでウインドウサイズを設定するときにsize(600, 600, P3D);としていることに注目してください。
P3Dオプションを指定してsizeを呼ぶことで、camera関数でカメラの位置や向きを設定できるようになります。
camera(位置x, 位置y, 位置z, 対象x, 対象y, 対象z, 0, 1, 0);
たったこれだけで3Dになります。

左右キーで視点を移動し、ボールをキャッチしたときに点数が加算されるように修正してみました。
BallCatch3D1

import fisica.*;

FWorld world;
float pos = 125, speed = 0;
int score = 0;

void setup() {
  size(600, 600, P3D);
  Fisica.init(this);
  world = new FWorld();
  world.setEdges();
  world.remove(world.bottom);
  for (int y = 0; y < 9; y++) {
    for (int x = 0; x < 10 + y % 2; x++) {
      FCircle c = new FCircle(5);
      c.setPosition(x * 50 + 75 - y % 2 * 25, y * 50 + 75);
      c.setStatic(true);
      c.setFill(0);
      world.add(c);
    }
  }
  noStroke();
  textSize(50);
  textAlign(CENTER);
}

void draw() {
  background(220);

  if (keyPressed) {
    if (keyCode == RIGHT) {
      speed += 1;
    }
    if (keyCode == LEFT) {
      speed -= 1;
    }
  }
  pos += speed;
  speed *= 0.95;

  camera(width/2 + pos, height, 100, width/2 + pos, 0, 0, 0, 1, 0);
  world.step();
  world.draw();  
  if (frameCount % 100 == 0) {
    FCircle c = new FCircle(20);
    c.setName("ball");
    c.setPosition(random(width), 0);
    c.setNoFill();
    c.setNoStroke();
    world.add(c);
  }

  ArrayList bodies = world.getBodies();
  for (int i = 0; i < bodies.size(); i++) {
    FBody body = (FBody)bodies.get(i);
    if (body.getName() == "ball" && body instanceof FCircle) {
      FCircle c = (FCircle)body;
      float x = c.getX(), y = c.getY(), s = c.getSize();
      pushMatrix();
      translate(x, y, 0);
      fill(255, 0, 0);
      sphere(s/2);
      popMatrix();
      if (550 < y && y < 600 && abs(x - (pos+300)) < 100) {        
        score++;
      }
      if (y > 600) {
        world.remove(body);
      }
    }
  }

  camera(width/2, height/2, 600, width/2, height/2, 0, 0, 1, 0);
  fill(0, 0, 255);
  text("SCORE:" + score, width/2, 100);
}

これだけで下方向から俯瞰するように描画されますが、2Dを横から見ているだけなので今一つ立体感がありません。そこで、3Dでボールを描画するために、world.getBodies()で物理世界のオブジェクトをすべて取得し、そのオブジェクトがFCircleのインスタンスであったときに、その場所とサイズを指定して、sphere関数でボールを3Dで描画しています。