Criando sombras com Java 3D

Há duas coisas básicas para simular (ou falsificar) sombras: computar onde as sombras estão, e criar a geometria (ou texturas) para servir como sombra.

Um polígono especificado sem propriedades materiais pode ser usado como um polígono da sombra, chamado de colored shadow polygon.

Este programa ilustra como simular a sombra de um polígono.

fig01dicaJ3d.JPG

// Define a classe do Polygon da sombra
public class SimpleShadow extends Shape3D {

      SimpleShadow(GeometryArray geom, Vector3f direction, Color3f col,
        float height) {

      int vCount = geom.getVertexCount();
      QuadArray poly = new QuadArray(vCount, GeometryArray.COORDINATES
          | GeometryArray.COLOR_3);

      int v;
      Point3f vertex = new Point3f();
      Point3f shadow = new Point3f();
      for (v = 0; v < vCount; v++) {
        geom.getCoordinate(v, vertex);
        shadow.set(vertex.x + (vertex.y - height) * direction.x,
            height + 0.0001f, vertex.z + 
            (vertex.y - height) * direction.y);

        poly.setCoordinate(v, shadow);
        poly.setColor(v, col);
      }

      this.setGeometry(poly);
    }
}

public BranchGroup createScene(){
    ...
    
    // Este é o objeto que tem a sombra
    Shape3D plane = new LitQuad(new Point3f(-0.3f0.6f0.2f),
        new Point3f(-0.3f, -0.3f0.2f),
        new Point3f(0.6f, -0.3f, -0.3f), 
        new Point3f(0.6f0.6f, -0.3f));
        
    ...  
    // Criar um objeto do Polígono da sombra
    Shape3D shadow = new SimpleShadow((GeometryArray) plane.getGeometry(),
        direction, new Color3f(0.2f0.2f0.2f), -0.5f);
    // Adicionar o objeto do Polígono da sombra na cena
    scene.addChild(shadow);  
    
    ...
}