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

Impressão de cheques pelo sistema

            // 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.3f, 0.6f, 0.2f),
                    new Point3f(-0.3f, -0.3f, 0.2f),
                    new Point3f(0.6f, -0.3f, -0.3f), 
                    new Point3f(0.6f, 0.6f, -0.3f));
                    
                ...  
                // Criar um objeto do Polígono da sombra
                Shape3D shadow = new SimpleShadow((GeometryArray) plane.getGeometry(),
                    direction, new Color3f(0.2f, 0.2f, 0.2f), -0.5f);
                // Adicionar o objeto do Polígono da sombra na cena
                scene.addChild(shadow);  
                
                ...
            }