# [Java3D] Keine Darstellung trotz Geometrie und Licht



## egrath (5. Jun 2007)

Hallo,

ich bin gerade dabei meine ersten Gehversuche mit Java3D zu wagen. Dabei bin ich auf ein problem gestossen bei dem ich trotz intensiver Suche nicht darauf gekommen bin warum es nicht funktioniert.

Bei untenstehendem Code wird nichts angezeigt. Obwohl ich den Scenegraph (wahrscheinlich) richtig aufgebaut habe (Geometrie, Licht, View, alles vorhanden). 


```
import java.applet.Applet;
import java.awt.Color;
import java.awt.BorderLayout;
import java.awt.GraphicsConfiguration;
import com.sun.j3d.utils.applet.MainFrame;
import com.sun.j3d.utils.universe.*;
import com.sun.j3d.utils.geometry.*;
import javax.media.j3d.*;
import javax.vecmath.*;
import com.sun.j3d.utils.image.*;

public class Uni
extends Applet
{
        private SimpleUniverse universe_ = null;

        public Uni()
        {
        }

        public void init()
        {
                setLayout( new BorderLayout() );

                GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration();

                Canvas3D canvas = new Canvas3D( config );
                add( "Center", canvas );
                universe_ = new SimpleUniverse( canvas );
                universe_.getViewingPlatform().setNominalViewingTransform();
                universe_.addBranchGraph( createSceneGraph() );
        }

        public void destroy()
        {
                universe_.cleanup();
        }

        private BranchGroup createSceneGraph()
        {
                BranchGroup rootBranchGroup = new BranchGroup();

                Appearance ap = new Appearance();
                ap.setMaterial( new Material() );
                Shape3D shape = new Shape3D( createGeometry(), ap );

                Transform3D tr = new Transform3D();
                tr.setScale( 0.25 );
                TransformGroup tg = new TransformGroup( tr );
                tg.addChild( shape );

                PointLight light = new PointLight( new Color3f( Color.green ), new Point3f( 3f, 3f, 3f ), new Point3f( 0, 0, 0 ));
                AmbientLight light2 = new AmbientLight( new Color3f( Color.red ));

                rootBranchGroup.addChild( light );
                rootBranchGroup.addChild( light2 );
                rootBranchGroup.addChild( tg );

                rootBranchGroup.compile();

                return rootBranchGroup;
        }

        private Geometry createGeometry()
        {
                IndexedTriangleArray ita = new IndexedTriangleArray( 4, TriangleArray.COORDINATES | TriangleArray.NORMALS, 12 );

                ita.setCoordinate( 0, new Point3f( 1f, 1f, 1f ));
                ita.setCoordinate( 1, new Point3f( 1f, -1f, -1f ));
                ita.setCoordinate( 2, new Point3f( -1f, 1f, -1f ));
                ita.setCoordinate( 3, new Point3f( -1f, -1f, 1f ));

                int[] coords = { 0, 1, 2, 0, 3, 1, 1, 3, 2, 2, 3, 0 };
                float n = ( float ) ( 1.0 / Math.sqrt( 3 ));
                ita.setNormal( 0, new Vector3f( n, n, -n ));
                ita.setNormal( 1, new Vector3f( n, -n, n ));
                ita.setNormal( 2, new Vector3f( -n, -n, -n ));
                ita.setNormal( 3, new Vector3f( -n, n, n ));

                int[] norms = { 0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3 };
                ita.setCoordinateIndices( 0, coords );
                ita.setNormalIndices( 0, norms );

                return ita;
        }

        public static void main( String[] args )
        {
                new MainFrame( new Uni(), 400, 400 );
        }
}
```

Könnte sich das bitte kurz mal jemand durchsehen und mir einen Tipp geben?

Danke und Grüsse,
   Egon


----------



## merlin2 (5. Jun 2007)

Sehe ich es richtig, dass du Normalen selbst berechnest? So empfehlenswert scheint mir das nicht, ich bin aber kein Experte.


----------



## egrath (5. Jun 2007)

Hallo,

ja die normalen Berechne ich selbst. Ist aber nur für Lehrzwecke, in späterer Zukunft wenn ich in der Materie mal Sattelfest sein sollte werde ich dies eh einer API überlassen ;-)

Kann es sein das meine Normalenberechnung nen hau hat?

Danke und Grüsse,
   Egon


----------



## merlin2 (5. Jun 2007)

Nimm NormalGenerator und teste es, dann wirst du es wissen.


----------



## egrath (5. Jun 2007)

Hallo,

anscheinend hat es nichts mit den Normalen zu tun. Ich habe die createGeometry Methode mal so erweitert dass die Normalen über die von dir erwähnte Klasse generiert werden:


```
private Geometry createGeometry()
        {
                IndexedTriangleArray ita = new IndexedTriangleArray( 4, TriangleArray.COORDINATES | TriangleArray.NORMALS, 12 );

                ita.setCoordinate( 0, new Point3f( 1f, 1f, 1f ));
                ita.setCoordinate( 1, new Point3f( 1f, -1f, -1f ));
                ita.setCoordinate( 2, new Point3f( -1f, 1f, -1f ));
                ita.setCoordinate( 3, new Point3f( -1f, -1f, 1f ));

                int[] coords = { 0, 1, 2, 0, 3, 1, 1, 3, 2, 2, 3, 0 };
                ita.setCoordinateIndices( 0, coords );

		NormalGenerator normGen = new NormalGenerator();
		GeometryInfo geoInfo = new GeometryInfo( ita );
		normGen.generateNormals( geoInfo );

                return geoInfo.getGeometryArray();
        }
```

Leider hat es keinen erfolg gebracht.

Grüsse,
   Egon


----------



## merlin2 (6. Jun 2007)

Bist du sicher, dass deine Koordinaten korrekt sind?
Am Licht kann es nicht liegen, da Appearance() eine selbstleuchtende Appearance erzeugt.
Vielleicht solltest du die Position und Blickrichtung der Kamera überprüfen.


----------



## egrath (6. Jun 2007)

Hallo,

an der Kamera liegt es nicht, ich hab als Test kein TriangleArray genommen sondern ein IndexedLineArray um nur die Kontur anzeigen zu lassen -> Geometrie wird als Wireframe dargestellt.

Ich glaub ich werd das mal ruhen lassen und mich tiefer in die Materie einarbeiten vielleicht versteh ich es dann.

Danke auf jeden Fall für deine Hilfe!

Grüsse, Egon


----------

