3D-Grafik verschiedene Texturen auf einen Würfel mappen

Martin591995

Mitglied
Hallo,
ich habe folgendes Problem:
Ich möchte auf einer Box auf jeder seite eine andere Texture abbilden.
Ich habe es bis jetzt nur geschafft sie auf einer Seite anzuzeigen.

Könnte mir jemand vielleicht einen Rat geben oder einen Link auf eine helfende Website?

wie immer, danke für alle Antworten

MFG

Martin

(die Box habe ich mittels eines QuadArrays erstellt)
 
Moin,

also die einfachste Möglichkeit ist, dass du wenn du deine Bilder lädst, du alle in eine große Textur packst und dann mittels den Texturecoordinates in dem Quadarray immer nur einen Teil der "großen" Texture anzeigst, die genau dem Teilbild für die Seite entspricht. Wenn du nur einen Würfel hast, in das die einfachste Variante.

Wenn du eine Texture öfters anzeigen willst, dann ist es einfacher für jede Texture ein Quadarray zu erstellen.

Oder wenn dir das beides nicht passt, dann könntest du noch mit einem TextureUnitState array arbeiten. Aber das ist ein bisschen komplizierter. Das ist eher angebracht, wenn du mehrere Texturen auf einem Quad anzeigen möchtest. Falls es dich interessiert: hier.

Lieben Gruß
 
Erstmal danke für die Antwort.
Ich glaube es ist hilfreich wenn ich mein Vorhaben etwas genauer vorstelle:
ich will mir eine Welt erschaffen, die nur aus Blöcken besteht. (wie, vllt. kennt es jemand: Minecraft)

wie du es gesagt hast geht es auch, aber gibt es nicht eine Möglichkeit, eine Textur um den Würfel herumzufalten? (wie du sagtest: mit einer großen Textur)
 
Hi,
sry war mit Klausuren beschäftigt. Also ich hab leider keine Code Beispiel, aber das ganze funktioniert mit TexCoordGeneration. Hier der Link zur 3D Api. Für Tutorials einfach mal bei google schauen.

Lg
 
Danke erstmal!!!
Hat jemand vielleicht ein Code Beispiel? (Tutorials sind im Internet rar (wenn ich mich irre verbessert mich))

(Anwendungsbeispiel ist angehängt)
 

Anhänge

  • img.jpg
    img.jpg
    21,4 KB · Aufrufe: 33
Zuletzt bearbeitet:
Hier:
Java:
import java.awt.Color;
import java.awt.GraphicsConfiguration;

import javax.media.j3d.Appearance;
import javax.media.j3d.Background;
import javax.media.j3d.BoundingBox;
import javax.media.j3d.BoundingSphere;
import javax.media.j3d.BranchGroup;
import javax.media.j3d.Canvas3D;
import javax.media.j3d.ImageComponent2D;
import javax.media.j3d.IndexedQuadArray;
import javax.media.j3d.QuadArray;
import javax.media.j3d.Shape3D;
import javax.media.j3d.Texture;
import javax.media.j3d.Texture2D;
import javax.media.j3d.TextureAttributes;
import javax.media.j3d.Transform3D;
import javax.media.j3d.TransformGroup;
import javax.swing.JFrame;
import javax.vecmath.Color3f;
import javax.vecmath.Point3d;

import com.sun.j3d.utils.behaviors.mouse.MouseRotate;
import com.sun.j3d.utils.behaviors.mouse.MouseTranslate;
import com.sun.j3d.utils.behaviors.mouse.MouseZoom;
import com.sun.j3d.utils.image.TextureLoader;
import com.sun.j3d.utils.universe.SimpleUniverse;

public class Welt extends JFrame {

	public Welt(String title) {
		super(title);

		// AnzeigeInfos holen (Farbtiefe, usw...
		GraphicsConfiguration config = SimpleUniverse
				.getPreferredConfiguration();

		// ein neues Canvas mit den AnzeigeInfos erzeugen und dem Frame
		// hinzufügen
		Canvas3D canvas3d = new Canvas3D(config);
		add(canvas3d);

		// ein neues Universum im Canvas erzeugen und eine Betrachtungsebene
		// erzeugen
		SimpleUniverse universe = new SimpleUniverse(canvas3d);
		universe.getViewingPlatform().setNominalViewingTransform();

		// neue Transform Informationen
		Transform3D transform3d = new Transform3D();

		// neue Transformgruppe
		TransformGroup transroot = new TransformGroup(transform3d);

		float[] verts = {
				// front face
				1.0f, -1.0f, 1.0f, 1.0f, 1.0f, 1.0f, -1.0f,
				1.0f,
				1.0f,
				-1.0f,
				-1.0f,
				1.0f,
				// back face
				-1.0f, -1.0f, -1.0f, -1.0f, 1.0f, -1.0f, 1.0f, 1.0f,
				-1.0f,
				1.0f,
				-1.0f,
				-1.0f,
				// right face
				1.0f, -1.0f, -1.0f, 1.0f, 1.0f, -1.0f, 1.0f, 1.0f, 1.0f,
				1.0f,
				-1.0f,
				1.0f,
				// left face
				-1.0f, -1.0f, 1.0f, -1.0f, 1.0f, 1.0f, -1.0f, 1.0f, -1.0f,
				-1.0f, -1.0f,
				-1.0f,
				// top face
				1.0f, 1.0f, 1.0f, 1.0f, 1.0f, -1.0f, -1.0f, 1.0f, -1.0f, -1.0f,
				1.0f, 1.0f,
				// bottom face
				-1.0f, -1.0f, 1.0f, -1.0f, -1.0f, -1.0f, 1.0f, -1.0f, -1.0f,
				1.0f, -1.0f, 1.0f, };
		QuadArray q = new QuadArray(24, IndexedQuadArray.COORDINATES
				| IndexedQuadArray.TEXTURE_COORDINATE_2);
		q.setCoordinates(0, verts);

		Shape3D s = new Shape3D(q, texture("data\\Brick.jpg"));

		transroot.addChild(s);

		Background b = new Background();
		b.setColor(new Color3f(Color.green));
		BoundingSphere worldBounds = new BoundingSphere(new Point3d(0.0, 0.0,
				0.0), // Center
				1000.0); // Extent

		// Set the background color and its application bounds
		b.setCapability(Background.ALLOW_COLOR_WRITE);
		b.setApplicationBounds(worldBounds);

		BoundingBox boundBox = new BoundingBox(new Point3d(-10, -10, -10),
				new Point3d(10, 10, 10));

		// Muss gesetzt werden um das Betrachten mit der Maus zu erlauben
		transroot.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
		transroot.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);

		// rotieren mit der linken Maustaste
		MouseRotate behavior = new MouseRotate(transroot);
		behavior.setSchedulingBounds(boundBox);
		transroot.addChild(behavior);

		// zoomen mit der mitleren Maustaste
		MouseZoom mouseBeh2 = new MouseZoom(transroot);
		mouseBeh2.setSchedulingBounds(boundBox);
		transroot.addChild(mouseBeh2);

		// verschieben mit der rechten Maustaste
		MouseTranslate mouseBeh3 = new MouseTranslate(transroot);
		mouseBeh3.setSchedulingBounds(boundBox);
		transroot.addChild(mouseBeh3);

		// neue Branchgruppe
		BranchGroup branchgroup = new BranchGroup();

		// Transformgruppe an Branchgruppe hängen
		transroot.addChild(b);
		branchgroup.addChild(transroot);

		// ... an das Universum hängen
		universe.addBranchGraph(branchgroup);

		// Bounds inherhalb derer das Behaviour gelten soll

	}

	public Appearance texture(String s) {
		Appearance appear = new Appearance();
		appear.setCapability(TextureAttributes.ALLOW_MODE_WRITE);
		TextureLoader loader = new TextureLoader(s, null);
		ImageComponent2D myImage = loader.getImage();
		Texture2D myTex = new Texture2D(Texture.BASE_LEVEL, Texture.RGBA,
				myImage.getWidth(), myImage.getHeight());
		myTex.setImage(0, myImage);
		myTex.setEnable(true);
		myTex.setBoundaryModeS(Texture.WRAP);
		myTex.setBoundaryModeT(Texture.WRAP);
		appear.setTexture(myTex);
		return (appear);
	}

	public static void main(String args[]) {
		Welt beispiel = new Welt("Beispiel");
		beispiel.setSize(600, 400);
		beispiel.setVisible(true);
		beispiel.setDefaultCloseOperation(EXIT_ON_CLOSE);
		beispiel.setExtendedState(MAXIMIZED_BOTH);
	}
}
 
Bin gerade nicht sicher, ob du es überhaupt versucht hast.

In dem Beispiel sind die Texturkoordinaten für ein paar Punkte angegeben, so das unterschiedliche Ausschnitte der Textur auf die Flächen gezeichnet werden. Nicht die richtigen, aber unterschiedliche. Damit die richtigen Ausschnitte gezeichnet werden, müßte man die Koordinaten der Punkte in dem QuadArray nachvollziehen, und die Texturkoordinaten passend wählen. Dazu gäbe es sicher übersichtlichere Methoden als den float-Array (auch wenn man ihn mal nach Punkten formatiert *räusper*).

Java:
import java.awt.*;
import java.io.*;
import java.awt.image.*;
import java.awt.GraphicsConfiguration;
import javax.imageio.*;

import javax.media.j3d.Appearance;
import javax.media.j3d.Background;
import javax.media.j3d.BoundingBox;
import javax.media.j3d.BoundingSphere;
import javax.media.j3d.BranchGroup;
import javax.media.j3d.Canvas3D;
import javax.media.j3d.ImageComponent2D;
import javax.media.j3d.IndexedQuadArray;
import javax.media.j3d.QuadArray;
import javax.media.j3d.Shape3D;
import javax.media.j3d.Texture;
import javax.media.j3d.Texture2D;
import javax.media.j3d.TextureAttributes;
import javax.media.j3d.Transform3D;
import javax.media.j3d.TransformGroup;
import javax.swing.JFrame;
import javax.vecmath.*;
import javax.vecmath.Point3d;

import com.sun.j3d.utils.behaviors.mouse.MouseRotate;
import com.sun.j3d.utils.behaviors.mouse.MouseTranslate;
import com.sun.j3d.utils.behaviors.mouse.MouseZoom;
import com.sun.j3d.utils.image.TextureLoader;
import com.sun.j3d.utils.universe.SimpleUniverse;

public class Welt extends JFrame {

    public Welt(String title) {
        super(title);

        // AnzeigeInfos holen (Farbtiefe, usw...
        GraphicsConfiguration config = SimpleUniverse
                .getPreferredConfiguration();

        // ein neues Canvas mit den AnzeigeInfos erzeugen und dem Frame
        // hinzufügen
        Canvas3D canvas3d = new Canvas3D(config);
        add(canvas3d);

        // ein neues Universum im Canvas erzeugen und eine Betrachtungsebene
        // erzeugen
        SimpleUniverse universe = new SimpleUniverse(canvas3d);
        universe.getViewingPlatform().setNominalViewingTransform();

        // neue Transform Informationen
        Transform3D transform3d = new Transform3D();

        // neue Transformgruppe
        TransformGroup transroot = new TransformGroup(transform3d);

        float[] verts =
        {
                // front face
                 1.0f, -1.0f,  1.0f,
                 1.0f,  1.0f,  1.0f,
                -1.0f,  1.0f,  1.0f,
                -1.0f, -1.0f,  1.0f,

                // back face
                -1.0f, -1.0f, -1.0f,
                -1.0f,  1.0f, -1.0f,
                 1.0f,  1.0f, -1.0f,
                 1.0f, -1.0f, -1.0f,

                // right face
                 1.0f, -1.0f, -1.0f,
                 1.0f,  1.0f, -1.0f,
                 1.0f,  1.0f,  1.0f,
                 1.0f, -1.0f,  1.0f,

                // left face
                -1.0f, -1.0f,  1.0f,
                -1.0f,  1.0f,  1.0f,
                -1.0f,  1.0f, -1.0f,
                -1.0f, -1.0f, -1.0f,

                // top face
                 1.0f, 1.0f,  1.0f,
                 1.0f, 1.0f, -1.0f,
                -1.0f, 1.0f, -1.0f,
                -1.0f, 1.0f,  1.0f,

                // bottom face
                -1.0f, -1.0f,  1.0f,
                -1.0f, -1.0f, -1.0f,
                 1.0f, -1.0f, -1.0f,
                 1.0f, -1.0f, 1.0f,
        };
        QuadArray q = new QuadArray(24, IndexedQuadArray.COORDINATES
                | IndexedQuadArray.TEXTURE_COORDINATE_2);
        q.setCoordinates(0, verts);

        q.setTextureCoordinate ( 0, new Point2f(0.0f,0.0f));
        q.setTextureCoordinate ( 1, new Point2f(1.0f,0.0f));
        q.setTextureCoordinate ( 2, new Point2f(1.0f,1.0f));
        q.setTextureCoordinate ( 3, new Point2f(0.0f,1.0f));

        q.setTextureCoordinate ( 4, new Point2f(0.2f,0.0f));
        q.setTextureCoordinate ( 5, new Point2f(0.5f,0.0f));
        q.setTextureCoordinate ( 6, new Point2f(0.5f,0.3f));
        q.setTextureCoordinate ( 7, new Point2f(0.2f,0.3f));

        q.setTextureCoordinate ( 8, new Point2f(0.6f,0.3f));
        q.setTextureCoordinate ( 9, new Point2f(0.9f,0.3f));
        q.setTextureCoordinate (10, new Point2f(0.9f,0.9f));
        q.setTextureCoordinate (11, new Point2f(0.6f,0.9f));

        Shape3D s = new Shape3D(q, texture("img.jpg"));

        transroot.addChild(s);

        Background b = new Background();
        b.setColor(new Color3f(Color.green));
        BoundingSphere worldBounds = new BoundingSphere(new Point3d(0.0, 0.0,
                0.0), // Center
                1000.0); // Extent

        // Set the background color and its application bounds
        b.setCapability(Background.ALLOW_COLOR_WRITE);
        b.setApplicationBounds(worldBounds);

        BoundingBox boundBox = new BoundingBox(new Point3d(-10, -10, -10),
                new Point3d(10, 10, 10));

        // Muss gesetzt werden um das Betrachten mit der Maus zu erlauben
        transroot.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
        transroot.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);

        // rotieren mit der linken Maustaste
        MouseRotate behavior = new MouseRotate(transroot);
        behavior.setSchedulingBounds(boundBox);
        transroot.addChild(behavior);

        // zoomen mit der mitleren Maustaste
        MouseZoom mouseBeh2 = new MouseZoom(transroot);
        mouseBeh2.setSchedulingBounds(boundBox);
        transroot.addChild(mouseBeh2);

        // verschieben mit der rechten Maustaste
        MouseTranslate mouseBeh3 = new MouseTranslate(transroot);
        mouseBeh3.setSchedulingBounds(boundBox);
        transroot.addChild(mouseBeh3);

        // neue Branchgruppe
        BranchGroup branchgroup = new BranchGroup();

        // Transformgruppe an Branchgruppe hängen
        transroot.addChild(b);
        branchgroup.addChild(transroot);

        // ... an das Universum hängen
        universe.addBranchGraph(branchgroup);

        // Bounds inherhalb derer das Behaviour gelten soll

    }

    public Appearance texture(String s) {
        Appearance appear = new Appearance();
        appear.setCapability(TextureAttributes.ALLOW_MODE_WRITE);
        BufferedImage bi = null;
        try
        {
            bi = ImageIO.read(new File(s));
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        TextureLoader loader = new TextureLoader(bi);
        ImageComponent2D myImage = loader.getImage();
        Texture2D myTex = new Texture2D(Texture.BASE_LEVEL, Texture.RGBA,
                myImage.getWidth(), myImage.getHeight());
        myTex.setImage(0, myImage);
        myTex.setEnable(true);
        myTex.setBoundaryModeS(Texture.WRAP);
        myTex.setBoundaryModeT(Texture.WRAP);
        appear.setTexture(myTex);
        return (appear);
    }

    public static void main(String args[]) {
        Welt beispiel = new Welt("Beispiel");
        beispiel.setSize(600, 400);
        beispiel.setVisible(true);
        beispiel.setDefaultCloseOperation(EXIT_ON_CLOSE);
        //beispiel.setExtendedState(MAXIMIZED_BOTH);
    }
}
 
Super! Ich glaub das ist schon die richtige Fährte! :applaus::toll:

Ich hab mal deine gehasten floats in Points3f umgewandelt :bae::
Java:
		Point3f[] verts = {
				// front face
				new Point3f(1.0f, -1.0f,  1.0f),
				new Point3f(1.0f,  1.0f,  1.0f),
				new Point3f(-1.0f,  1.0f,  1.0f),
				new Point3f(-1.0f,  -1.0f,  1.0f),
				// back face
				new Point3f(-1.0f, -1.0f, -1.0f),
				new Point3f(-1.0f, 1.0f, -1.0f),
				new Point3f(1.0f,  1.0f, -1.0f),
				new Point3f(1.0f,  -1.0f,  -1.0f),
				// right face
				new Point3f(1.0f,  -1.0f, -1.0f),
				new Point3f(1.0f,  1.0f, -1.0f),
				new Point3f(1.0f,  1.0f,  1.0f),
				new Point3f(1.0f, -1.0f,  1.0f),
				// left face
				new Point3f(-1.0f, -1.0f,  1.0f),
				new Point3f(-1.0f,  1.0f,  1.0f),
				new Point3f(-1.0f,  1.0f, -1.0f),
				new Point3f(-1.0f,  -1.0f, -1.0f),
				// top face
				new Point3f(1.0f,  1.0f, 1.0f),
				new Point3f(1.0f,  1.0f, -1.0f),
				new Point3f(-1.0f,  1.0f, -1.0f),
				new Point3f(-1.0f,  1.0f,  1.0f),
				// bottom face
				new Point3f(-1.0f, -1.0f,  1.0f),
				new Point3f(-1.0f, -1.0f,  -1.0f),
				new Point3f(1.0f, -1.0f, -1.0f),
				new Point3f(1.0f, -1.0f,  1.0f),};

Nur müsstest du mir jetz noch einen tieferen Einblick in setTextureCoordinate geben! :bahnhof:
Das mit den Ausschnitten der Textur hat sich ganz vielversprechend angehört.
 
Das ist kein Stück besser :autsch:

Aber mal ausführlicher: Was die dort angegebenen Punkte an sich bedeuten, ist ja klar: Das sind die Eckpunte der Seitenflächen. Insgesamt 24 Stück. Ziemlich unübersichtlich, dafür, das so ein Würfel im Schnitt nur ca. 7.9 Ecken hat. Sich die Eckpunkte einmal zu definieren, und dort dann nur noch einzusetzen, macht das ganze schonmal überschaubarer. Im Beispiel sind die Eckpunkte "Boolsch" durchnummeriert:
Punkt 0=000 : vorne, unten, links
Punkt 1=001 : vorne, unten, rechts
Punkt 2=010 : vorne, oben, links
Punkt 3=011 : vorne, oben, rechts
Punkt 4=100 : hinten, unten, links
Punkt 5=101 : hinten, unten, rechts
Punkt 6=110 : hinten, oben, links
Punkt 7=111 : hinten, oben, rechts

Das kann man sich dann mal Aufmalen (!) (hilft, wirklich...). Bei den "verts" muss man dann nur noch die passenden Indizes angeben: Alle Flächen im Gegenuhrzeigersinn durchnummeriert.

Bei den Texturkoordinaten läuft das dann so ähnlich: Man definiert die Koordinaten, die den gewünschten Ausschnitt der Texture beschreiben. Die Texturkoordinaten sind Werte zwischen 0 und 1, die beschreiben, WO auf der Textur man sich befinden. Texturkoordinaten von
(0,0) (0.5, 0) (0.5, 1) (0,1)
würden z.B. die Linke hälfte der Textur beschreiben.

Man kann sich also zwei Sätze von Koordinaten definieren, die den gewünschten Ausschnitt beschreiben - in diesem Fall ziemlich krumme Werte, weil du die Texturen so willkürlich in eine große gepackt hast.... Die Texturkoordinaten für den gesamten Würfel entstehen dann wieder dadurch, dass man sich von diesen Koordinaten für jede Seite die passenden rauspickt.

Wenn es nur zwei Texturen sein sollen, ist das mit dem "Kombinieren in EINE Textur" vielleicht noch vertretbar. Dann solltest du aber die Textur genau aus zwei Hälften bestehen lassen. Wie unpraktikabel das bei komplexteren Anwendungen ist, ist klar: Stell' dir vor du hast drei extrem Hochaufgelöste Texturen A,B,C mit 1000x1000 Pixels, und willst drei Objekte rendern: Eins mit den Texturen A,B, eins mit B,C, und eins mit A,C :autsch: Für solche Fälle gibt's dann auch in Java3D Möglichkeiten, die ich mir aber auch erst (aufwändiger als diese Lösung jetzt) erarbeiten müßte.

Und machmal frage ich mich, warum ich das alles hier mache, und finde keine Antwort.


Java:
import java.awt.*;
import java.io.*;
import java.awt.image.*;
import java.awt.GraphicsConfiguration;
import javax.imageio.*;

import javax.media.j3d.Appearance;
import javax.media.j3d.Background;
import javax.media.j3d.BoundingBox;
import javax.media.j3d.BoundingSphere;
import javax.media.j3d.BranchGroup;
import javax.media.j3d.Canvas3D;
import javax.media.j3d.ImageComponent2D;
import javax.media.j3d.IndexedQuadArray;
import javax.media.j3d.QuadArray;
import javax.media.j3d.Shape3D;
import javax.media.j3d.Texture;
import javax.media.j3d.Texture2D;
import javax.media.j3d.TextureAttributes;
import javax.media.j3d.Transform3D;
import javax.media.j3d.TransformGroup;
import javax.swing.JFrame;
import javax.vecmath.*;
import javax.vecmath.Point3d;

import com.sun.j3d.utils.behaviors.mouse.MouseRotate;
import com.sun.j3d.utils.behaviors.mouse.MouseTranslate;
import com.sun.j3d.utils.behaviors.mouse.MouseZoom;
import com.sun.j3d.utils.image.TextureLoader;
import com.sun.j3d.utils.universe.SimpleUniverse;

public class Welt extends JFrame {

    public Welt(String title) {
        super(title);

        // AnzeigeInfos holen (Farbtiefe, usw...
        GraphicsConfiguration config = SimpleUniverse
                .getPreferredConfiguration();

        // ein neues Canvas mit den AnzeigeInfos erzeugen und dem Frame
        // hinzufügen
        Canvas3D canvas3d = new Canvas3D(config);
        add(canvas3d);

        // ein neues Universum im Canvas erzeugen und eine Betrachtungsebene
        // erzeugen
        SimpleUniverse universe = new SimpleUniverse(canvas3d);
        universe.getViewingPlatform().setNominalViewingTransform();

        // neue Transform Informationen
        Transform3D transform3d = new Transform3D();

        // neue Transformgruppe
        TransformGroup transroot = new TransformGroup(transform3d);

        Point3f points[] =
        {
            new Point3f(-1,-1,-1),
            new Point3f(-1,-1, 1),
            new Point3f(-1, 1,-1),
            new Point3f(-1, 1, 1),
            new Point3f( 1,-1,-1),
            new Point3f( 1,-1, 1),
            new Point3f( 1, 1,-1),
            new Point3f( 1, 1, 1),
        };


        Point3f verts[] =
        {
            points[0], points[1], points[3], points[2], // front face
            points[5], points[4], points[6], points[7], // back face
            points[1], points[5], points[7], points[3], // right face
            points[4], points[0], points[2], points[6], // left face
            points[2], points[3], points[7], points[6], // top face
            points[4], points[5], points[1], points[0], // bottom face
        };

        QuadArray q = new QuadArray(24, IndexedQuadArray.COORDINATES
                | IndexedQuadArray.TEXTURE_COORDINATE_2);
        q.setCoordinates(0, verts);

        TexCoord2f tex0[] =
        {
            new TexCoord2f(0.33f,0.50f),
            new TexCoord2f(0.60f,0.50f),
            new TexCoord2f(0.60f,0.75f),
            new TexCoord2f(0.33f,0.75f),
        };

        TexCoord2f tex1[] =
        {
            new TexCoord2f(0.33f,0.75f),
            new TexCoord2f(0.60f,0.75f),
            new TexCoord2f(0.60f,1.00f),
            new TexCoord2f(0.33f,1.00f),
        };
        
        TexCoord2f tex[] =
        {
            tex0[0], tex0[1], tex0[2], tex0[3],
            tex0[0], tex0[1], tex0[2], tex0[3],
            tex1[0], tex1[1], tex1[2], tex1[3],
            tex0[0], tex0[1], tex0[2], tex0[3],
            tex0[0], tex0[1], tex0[2], tex0[3],
            tex1[0], tex1[1], tex1[2], tex1[3],
        };
        q.setTextureCoordinates(0, 0, tex);


        Shape3D s = new Shape3D(q, texture("img.jpg"));

        transroot.addChild(s);

        Background b = new Background();
        b.setColor(new Color3f(Color.green));
        BoundingSphere worldBounds = new BoundingSphere(new Point3d(0.0, 0.0,
                0.0), // Center
                1000.0); // Extent

        // Set the background color and its application bounds
        b.setCapability(Background.ALLOW_COLOR_WRITE);
        b.setApplicationBounds(worldBounds);

        BoundingBox boundBox = new BoundingBox(new Point3d(-10, -10, -10),
                new Point3d(10, 10, 10));

        // Muss gesetzt werden um das Betrachten mit der Maus zu erlauben
        transroot.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
        transroot.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);

        // rotieren mit der linken Maustaste
        MouseRotate behavior = new MouseRotate(transroot);
        behavior.setSchedulingBounds(boundBox);
        transroot.addChild(behavior);

        // zoomen mit der mitleren Maustaste
        MouseZoom mouseBeh2 = new MouseZoom(transroot);
        mouseBeh2.setSchedulingBounds(boundBox);
        transroot.addChild(mouseBeh2);

        // verschieben mit der rechten Maustaste
        MouseTranslate mouseBeh3 = new MouseTranslate(transroot);
        mouseBeh3.setSchedulingBounds(boundBox);
        transroot.addChild(mouseBeh3);

        // neue Branchgruppe
        BranchGroup branchgroup = new BranchGroup();

        // Transformgruppe an Branchgruppe hängen
        transroot.addChild(b);
        branchgroup.addChild(transroot);

        // ... an das Universum hängen
        universe.addBranchGraph(branchgroup);

        // Bounds inherhalb derer das Behaviour gelten soll

    }

    public Appearance texture(String s) {
        Appearance appear = new Appearance();
        appear.setCapability(TextureAttributes.ALLOW_MODE_WRITE);
        BufferedImage bi = null;
        try
        {
            bi = ImageIO.read(new File(s));
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        TextureLoader loader = new TextureLoader(bi);
        ImageComponent2D myImage = loader.getImage();
        Texture2D myTex = new Texture2D(Texture.BASE_LEVEL, Texture.RGBA,
                myImage.getWidth(), myImage.getHeight());
        myTex.setImage(0, myImage);
        myTex.setEnable(true);
        myTex.setBoundaryModeS(Texture.WRAP);
        myTex.setBoundaryModeT(Texture.WRAP);
        appear.setTexture(myTex);
        return (appear);
    }

    public static void main(String args[]) {
        Welt beispiel = new Welt("Beispiel");
        beispiel.setSize(600, 400);
        beispiel.setVisible(true);
        beispiel.setDefaultCloseOperation(EXIT_ON_CLOSE);
        //beispiel.setExtendedState(MAXIMIZED_BOTH);
    }
}
 
wisst ihr, wie ihr euren Code 20 Zeilen kürzer machen könnt?

Java:
 import javax.media.j3d.*;

...und für jeden der im nachinein rausfinden will woher eigentlich die verwendeten Klassen kommen auch sicherlich mehr Aufwand schaffen kann, besonders dann wenn noch andere Wildcards bei den Imports verwendet werden.
Bei größeren Anwendungen mMn -> schlechter Stil
(und dafür lass ich mir jetzt gerne auf die Finger hauen 😛)
Gruß
 

Zurück
Oben