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)
 

jemandzehage

Aktives Mitglied
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ß
 

Martin591995

Mitglied
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)
 

jemandzehage

Aktives Mitglied
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
 

Martin591995

Mitglied
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:

Martin591995

Mitglied
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);
	}
}
 

Marco13

Top Contributor
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);
    }
}
 

Martin591995

Mitglied
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.
 

Marco13

Top Contributor
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);
    }
}
 
F

Firephoenix

Gast
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 :p)
Gruß
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
G listener repaint() - verschiedene Darstellung AWT, Swing, JavaFX & SWT 24
E verschiedene Cursor setzen AWT, Swing, JavaFX & SWT 1
I GUI, das verschiedene Panels hat (Von Seite zu Seite navigieren) AWT, Swing, JavaFX & SWT 7
RedEagle JavaFX Verschiedene Bereiche miteinander verknüpfen AWT, Swing, JavaFX & SWT 7
H 3 verschiedene Nachrichten in einer FXML View die Infos kommen aus DB AWT, Swing, JavaFX & SWT 4
E wie fängt man verschiedene Ereignisse ein mit MVC ? AWT, Swing, JavaFX & SWT 42
S JavaFX Optimierung für verschiedene Auflösungen AWT, Swing, JavaFX & SWT 12
Bartertown JTable - Verschiedene Komponenten in einer Spalte unterbringen AWT, Swing, JavaFX & SWT 3
H Verschiedene JPanels aus eigenen Klassen in JFrame einfügen, nur ein Panel sichtbar AWT, Swing, JavaFX & SWT 4
V Swing Nimbus Look And Feel verschiedene Buttons AWT, Swing, JavaFX & SWT 8
W Verschiedene Foreground color in Combo SWT Auswahlliste AWT, Swing, JavaFX & SWT 5
L AWT Window, Dialog und verschiedene Betriebssysteme AWT, Swing, JavaFX & SWT 2
T Swing verschiedene Auflösungen AWT, Swing, JavaFX & SWT 7
J 3D-Grafik JOGL - Verschiedene Perspektiven darstellen AWT, Swing, JavaFX & SWT 5
R JTree - verschiedene Verzeichnisse AWT, Swing, JavaFX & SWT 3
T AWT verschiedene Oberflächen programmieren AWT, Swing, JavaFX & SWT 5
D verschiedene Zeichenebenen AWT, Swing, JavaFX & SWT 10
M Verschiedene Layouts anzeigen AWT, Swing, JavaFX & SWT 5
Dit_ Verschiedene Icons in einer JTable-Zelle AWT, Swing, JavaFX & SWT 2
H Swing TableCellRenderer für verschiedene Spalten AWT, Swing, JavaFX & SWT 11
N Verschiedene FormLayout in einem Panelbuilder AWT, Swing, JavaFX & SWT 3
D Verschiedene ActionEvents für ein JButton-Array AWT, Swing, JavaFX & SWT 2
M Swing Swing, MVC über verschiedene Panel AWT, Swing, JavaFX & SWT 4
P verschiedene JPanels einblenden je nach auswahl AWT, Swing, JavaFX & SWT 2
L Focus für KeyListener auf verschiedene Panels AWT, Swing, JavaFX & SWT 2
K Verschiedene ComboBoxen in JTable AWT, Swing, JavaFX & SWT 9
D 2 verschiedene Frames mit einem Button schliessen AWT, Swing, JavaFX & SWT 2
D Mit der Maus in verschiedene Modi wechseln AWT, Swing, JavaFX & SWT 15
I JTable: "GLEICHZEITIG" zwei verschiedene TableMode AWT, Swing, JavaFX & SWT 2
F GridLayout: verschiedene Spaltenbreiten AWT, Swing, JavaFX & SWT 2
S verschiedene Menuleisten AWT, Swing, JavaFX & SWT 2
S In einem button Panel 2 verschiedene TiteledBoarder erzeugen AWT, Swing, JavaFX & SWT 5
T verschiedene Farben in einem Text/Editfeld AWT, Swing, JavaFX & SWT 11
R Fenster in verschiedene Bereiche teilen - aber wie? AWT, Swing, JavaFX & SWT 4
D Mehrere verschiedene Textfelder auslesen? AWT, Swing, JavaFX & SWT 10
Icewind Verschiedene Farben in einer JTextArea AWT, Swing, JavaFX & SWT 3
F Verschiedene Vordergrundfarben in einer TextArea AWT, Swing, JavaFX & SWT 4
G JFileChooser in verschiedene Sprachen? AWT, Swing, JavaFX & SWT 6
R 3D-Grafik Verwendung mehrerer Texturen AWT, Swing, JavaFX & SWT 1
MiMa Reaktion auf einen SplitScreenTrenner? AWT, Swing, JavaFX & SWT 2
MartinNeuerlich Kann mir jemand, der einen Mac mit einem m1 oder m2-Chip hat, eine POM geben mit der Javafx-Fullscreen beim Mac mit m-Chip funktioniert? AWT, Swing, JavaFX & SWT 1
W Gibt es einen "automatischen Listener" in Swing oder JTable oder der ATM-Klasse? AWT, Swing, JavaFX & SWT 14
U Gibt es eine Möglichkeit statt concatenate einen anderen Befehl zu nutzen? AWT, Swing, JavaFX & SWT 9
K Warum genau hat man einen Listener, dann ein Event und was ist ein Adapter AWT, Swing, JavaFX & SWT 2
I Probleme beim Drucken auf einen PDF-Drucker AWT, Swing, JavaFX & SWT 8
Jose05 JavaFX: eigene FXML-Datei für einen Button AWT, Swing, JavaFX & SWT 3
P Swing ActionListener überschreibt einen Wert aus der Hauptklasse nicht AWT, Swing, JavaFX & SWT 5
Z Mit einem Button einen anderen Button Triggern AWT, Swing, JavaFX & SWT 3
J Gibt es einen Grund für 16x16 anstatt z.B. 15x15 Tiles ? AWT, Swing, JavaFX & SWT 10
O Soll ich einen JEditorPane verwenden ? AWT, Swing, JavaFX & SWT 5
L JavaFX JavaFX stürtzt durch einen Server#connect Exception AWT, Swing, JavaFX & SWT 3
Drachenbauer Hauptfenster erhält schmale Streifen rechts unt unten, wenn ich einen JDialog hinzufüge. AWT, Swing, JavaFX & SWT 19
J Schriftart über einen Button ändern AWT, Swing, JavaFX & SWT 1
J Genutzte Methoden in einen Frame einbauen AWT, Swing, JavaFX & SWT 21
P Wie lese ich einen jRadioButton aus? AWT, Swing, JavaFX & SWT 21
MaxG. Swing JMenu einen Listener Hinzufügen AWT, Swing, JavaFX & SWT 25
Sanni94 JavaFX Kann man eine Grafik in einen Text einbinden? AWT, Swing, JavaFX & SWT 2
H JavaFX aus der .fxml Datei einen Konstruktor bedienen AWT, Swing, JavaFX & SWT 3
H JavaFX via .fxml einen abgeleiteten Button erstellen... AWT, Swing, JavaFX & SWT 4
S Swing GANZE Row auf einen Schlag einfärben AWT, Swing, JavaFX & SWT 2
B JavaFX Wie programmiere ich hier einen "Weiter" Button? AWT, Swing, JavaFX & SWT 11
P Einer JList mit eigenem ListModel einen Eintrag hinzfügen AWT, Swing, JavaFX & SWT 5
L Wie realisiere ich einen Controller AWT, Swing, JavaFX & SWT 1
A Slider soll einen Wert übergeben AWT, Swing, JavaFX & SWT 1
F JavaFX Erstelle einen Wald AWT, Swing, JavaFX & SWT 6
Thallius Swing Aufgabe für einen der gerne Tüftelt. AWT, Swing, JavaFX & SWT 4
M JavaFX Wie füge ich zu einer WebEngine einen Flash Player hinzu AWT, Swing, JavaFX & SWT 3
G AWT Wie bekomme ich einen zeitgesteuerten robot hin? AWT, Swing, JavaFX & SWT 6
D Event Handling Aus einer anderen Klasse heraus einen Text des JLabels ändern. AWT, Swing, JavaFX & SWT 12
C Im ActionListener Buttons disablen, einen Thread starten, dann Buttons enablen AWT, Swing, JavaFX & SWT 2
H Swing Probleme beim erstellen eines neuen Objektes durch einen Button AWT, Swing, JavaFX & SWT 10
B SWT Problem: Wie kann man für jede TableColumn einen eigenen KeyListener registrieren. AWT, Swing, JavaFX & SWT 1
S Bei BoxLayout haben hinzugefügten Jpanels einen Versatz/Space AWT, Swing, JavaFX & SWT 0
D Graphics2D einen Bereich füllen AWT, Swing, JavaFX & SWT 1
T Einen Variablen Wert in einem TextField AWT, Swing, JavaFX & SWT 4
M Swing Mit Java in der GUI einen Belegungsplan einfügen AWT, Swing, JavaFX & SWT 23
P Swing Panel-austausch über einen MenuListener AWT, Swing, JavaFX & SWT 2
H Swing Hintergrundbild in einen JFrame einfügen AWT, Swing, JavaFX & SWT 7
K 2D-Grafik Kontrastanpassung über einen JSlider AWT, Swing, JavaFX & SWT 2
E Warum macht die einfache Animation einen kleinen Fehler? AWT, Swing, JavaFX & SWT 14
A Swing JTextField durch einen JButton leeren AWT, Swing, JavaFX & SWT 15
J Swing JTable-Event für einen Select?? AWT, Swing, JavaFX & SWT 3
P Swing RadioButtons - nur einen auswählen AWT, Swing, JavaFX & SWT 3
VfL_Freak Swing KeyListener, um einen Dialog per ESC zu schließen AWT, Swing, JavaFX & SWT 6
J JFrame in einen JFrame anzeigen AWT, Swing, JavaFX & SWT 2
L Mehre Panels einen Frame zuweisen AWT, Swing, JavaFX & SWT 11
Furtano AWT mehrere Bilder in einen Frame zeichnen + Layout Manager AWT, Swing, JavaFX & SWT 10
Madlip SWT Tree mit einen Klick alles ausklappen AWT, Swing, JavaFX & SWT 3
D JTree nach Klick auf einen Hyperlink aktualisieren AWT, Swing, JavaFX & SWT 3
M JProgressBar für einen Thread AWT, Swing, JavaFX & SWT 14
T Einen Kreis anzeigen AWT, Swing, JavaFX & SWT 14
M SWT /Jface Wann einen ColumnLabelProvider benutzen? AWT, Swing, JavaFX & SWT 2
-horn- WorldWindJava+JOGL soll einen animierten Graphen anzeigen, wie? AWT, Swing, JavaFX & SWT 4
X Einem JFrame einen Dialog als Parent setzen. Möglich? AWT, Swing, JavaFX & SWT 4
A 2D-Grafik Alles auf einen Panel Zeichnen AWT, Swing, JavaFX & SWT 5
P 2D-Grafik Neue Farbe für einen Teilbereich einer Linie? AWT, Swing, JavaFX & SWT 8
VfL_Freak Swing kann ich einen laufenden Timer mitten in der Ausführung abbrechen? AWT, Swing, JavaFX & SWT 6
P Swing JTabbedPane mit JButton einen anderen Tab anzeigen AWT, Swing, JavaFX & SWT 9
G Mit Java einen Button wie z.B. im Opera 10.63 erzeugen AWT, Swing, JavaFX & SWT 3
F Swing Beenden eines ActionListener über einen Button AWT, Swing, JavaFX & SWT 8

Ähnliche Java Themen

Neue Themen


Oben