[GELÖST] Java3D - Position eines ColorCubes im Raum



  • Hallo,

    ihm Rahmen einer Vorlesung lernen wir ein wenig Java3D.
    Um mich ein wenig einzuarbeiten, hab ich ein paar einfache Würfel in eine Scene gesetzt.

    [IMG=http://img213.imageshack.us/img213/5599/unbenanntwi.png][/IMG]

    Im Zentrum [0,0,0] befindet sich ein Würfel mit Kantenlänge x, an jeder seiner 8 Ecken befindet sich ein weiterer Würfel mit einer Kantenlänge von x/2.

    Der SourceCode sieht so aus:

    public BranchGroup createSceneGraph()
    {
    	final float siteLength = 1.0f;
    	final float halfLength = siteLength/2;
    	final float tLength = siteLength+halfLength;
    
    	// Wurzel des SceneGraphen
    	BranchGroup root = new BranchGroup();
    
        // 1. Würfel im Zentrum des Universums
        ColorCube centerColorCube = new ColorCube(siteLength);
        root.addChild(centerColorCube);
    
    	// Restliche Würfel um den Würfel im Zentrum
        ColorCube[] cubes = new ColorCube[8];
    	for(int i=0; i<cubes.length; ++i)
        	cubes[i] = new ColorCube(halfLength);
    
    	// Verschiebung um Vector
    	int pos = 0;
    	for(float x=-tLength; x<=tLength; x+=(2*tLength))
    		for(float y=-tLength; y<=tLength; y+=(2*tLength))
    			for(float z=-tLength; z<=tLength; z+=(2*tLength))
    			{
    				// Neue Transform Informationen erstellen
    				 Transform3D transform3d = new Transform3D();
    				 transform3d.setTranslation(new Vector3f(x,y,z));
    
    				// Neue Transformgruppe erstellen
    				TransformGroup transcube = new TransformGroup(transform3d);
    
        			// ColorCube an Transformgruppe hängen
        			transcube.addChild(cubes[pos++]);
    
    				// Transformgruppe an Wurzel hängen
        			root.addChild(transcube);
    			}
    
    	return root;
    }
    

    Um das ganze jetzt etwas allgemeiner zu machen, würde ich gerne eine Methode schreiben, die mir zu einem Würfel,
    alle 8 Würfel an den Kanten erzeugt.

    Dazu muss ich aber die Position eines Würfels im Raum wissen. Oben kann ich einfach den Ursprung nehmen, da sich dort der zentrale Würfel befindet, bei einem beliebigen Würfel brauch ich seine Position im Raum, also einen Vektor(x,y,z).

    Gibt es da eine Möglichkeit sich diese Informationen zu beschaffen ?

    Besten Dank



  • Du hast nicht mal richtig erklärt, was Du genauo willst, also was deine Methode genau bewirken soll. Meinst Du z.B. das 9 Würfel erstellt werden und die dann neben einander und übereinander wie Kartons angereiht werden? Z.B. 3x3?

    Wo ist da das Problem? Du hast die Höhe und die Breite eines Würfels, dann musst Du noch, wenn Du wilst einen Abstand defenieren. Der einfach sein kann oder der sich je weitere Zeile z.B um das doppelte vergrößert oder sonst wie.

    Dann brauchst Du einfach die x,z Kordinaten des zu lest platzierten würfel, addierst den Abstand hinzu und dann hast Du die Kordinaten für die linke obere Ecke des hinzu kommenden Würfels.



  • Wobei Du natürlich zu erst die eigene Breite des würfels, vor dem Abstand, addieren musst bzw, die Höhe. Je nach dem ob der Würfel in der selbigen Zeile rechts angelegt wird oder in der selbigen Spalte unterhalb des anderen Würfels.



  • Also was ich eigentlich will, ich habe einen

    ColorCube c1 = new ColorCube(siteLength);

    der sich durch Transformationen irgendwo im Raum befindet.
    Kann ich jetzt aus c1 irgendwie herausbekommen wo sich der CC im Raum befindet,
    also einen Vektor3d mit x,y,z Wert in Relation zum Ursprung des Universums.



  • cocacola88 schrieb:

    Also was ich eigentlich will, ich habe einen

    ColorCube c1 = new ColorCube(siteLength);

    der sich durch Transformationen irgendwo im Raum befindet.
    Kann ich jetzt aus c1 irgendwie herausbekommen wo sich der CC im Raum befindet,
    also einen Vektor3d mit x,y,z Wert in Relation zum Ursprung des Universums.

    Entweder Weißt du selber nicht was Du willst oder Du redest schon wieder von was anderem. Du redest jetzt von was, was Du glaubst zu brauchen für, dass was Du eigentlich erreichen willst.

    Wie wäre es ersteinmal mit der Erklärung was dein Ziel ist?



  • Idiot schrieb:

    Wie wäre es ersteinmal mit der Erklärung was dein Ziel ist?

    Im Endeffekt möchte ich den Teil der Methode oben, der 8 Würfel um einen Würfel herum erstellt verallgemeinern.

    Der folgende Quellcode erstellt 8 Würfel um einen Würfel im Zentrum des Universums[0,0,0]

    for(float x=-tLength; x<=tLength; x+=(2*tLength))
            for(float y=-tLength; y<=tLength; y+=(2*tLength))
                for(float z=-tLength; z<=tLength; z+=(2*tLength))
                {
                    // Neue Transform Informationen erstellen
                     Transform3D transform3d = new Transform3D();
                     transform3d.setTranslation(new Vector3f(x,y,z));
    
                    // Neue Transformgruppe erstellen
                    TransformGroup transcube = new TransformGroup(transform3d);
    
                    // ColorCube an Transformgruppe hängen
                    transcube.addChild(cubes[pos++]);
    
                    // Transformgruppe an Wurzel hängen
                    root.addChild(transcube);
                }
    

    Wenn ich das ganze jetzt allgemein schreiben möchte, darf ich nicht davon ausgehen, dass sich der Würfel um den 8 weitere Würfel gezeichnet werden im Zentrum des Universums befindet, sondern an einer beliebigen Stelle.

    Grob sieht das ganze dann so aus.

    public BranchGroup createCubes(ColorCube c1) 
    // C1 befindet sich irgendwo im Universum und um diesen Würfel sollen 8 weitere Würfel gezeichnet werden.
    {
    // Lese die Position von C1 im Universum aus
    // Erstelle 8 Würfel
    // Ausgehend von der Position von C1 verschiebe jeden Würfel im Raum, so dass sich  jeweils 1 Ecke des neuen 
    // Würfels mit einer Ecke von C1 berührt.
    // Füge das ganze in eine BrachGroup zusammen und liefere es zurück
    }
    

    Und mein Problem dabei ist, herauszufinden wo sich c1 befindet.



  • Irgendwie ist dein Ziel, geräumisch, schwer vorstellbar. Weil Du willst 8 Würfel hinzufügen aber es existiert schon einer, der zu dem Anhaltspunkt seinn soll. Das Heißt der zusammengefügte Block wäre dann unvollständig. Etwa wie in Tetris.

    Sollen denn die Würfel alle gleich sein?

    Soweit ich das sehe, möchtest du einfach an allen Anschlagflächen (6) einen Würfel anhängen. Läst sich sprachlich sehr schlecht beschreiben. Aber an sich rein Mathematisch müsstest Du Z einfach wie y behandeln, nur das da halt die Reihe abgeschnitten wird und dann einfach hinter alle Würfel geschoben wird und zwar an x 0 und y 0. Wie gesagt läst sich ganz schwer textlich beschreiben.

    Wie wahrscheinlich aber viel mehr drauf geachtet werden muss ist, wie die Zeichnunsgmethode des 3D Objects nacher die Informationen akzeptiert.

    Punkt aber wird wohl sein, dass bei Z auch zu nächst einmal die Breite von einem Würfel, die nach hinten ins Bild rein geht (Z) addiert werden muss und dann der Abstand der für die Z richtung ist. Also wie ich bereit schon sagte so gleich wie bei 2D. Du könntest es so sehen, dass x,y,z Adressen sind. Die mathematische Operation einer aneinanderreihung der Würfel wäre also die selbige wie bei 2D.



  • Okay ich versuche das Problem, dass ich habe einfach mal ein wenig zu abstrahieren.
    Angenommen ich wäre nicht in einer 3D-Welt sondern hätte nur einer 2D-Welt.

    Jeder Punkt hier ist durch eine eindeutige Koordinate P[x,y] bestimmt.
    (In 3D wäre das dann P[x,y,z])

    http://img140.imageshack.us/i/unbenanntpg.png/

    So ich habe jetzt ein Viereck(Würfel), der sich irgendwo auf meiner Welt befindet.
    Dieses Viereck soll nun an eine Methode

    public BranchGroup createCubes(ColorCube c1)
    

    übergeben werden. (c1 wäre jetzt also das schwarze Viereck)

    Zu diesem Viereck(schwarz) sollen jetzt die 4 anderen Vierecke(rot) gezeichnet werden.
    Dazu muss ich aus c1 aber seine Position im Raum haben(seinen Mittelpunkt).
    Und genau das ist mein Problem, wie bekomme ich aus c1 jetzt seinen Mittelpunkt raus P(x,y) bzw. P(x,y,z).

    Das zeichnen der anderen Vierecke(Würfel) ist dann kein Problem mehr.
    (Muss um bestimme Längen verschieben, die wiederum von der Größe des Würfels abhängen)



  • Moment mal, wenn du einen Würfel an den anderen hängen wilst (in 2D wären das 4 Anschlagflächen) wieso musst Du dann den Mittelpunkt des vorangegangen Würfels wissen? Es gilt doch bei der Objektplatzierung, die obere linke Ecke, also x,y.

    Nehmen wir mal an wir haben Würfel #0 an x=0 y=0. Der Würfel hat eine Länge von 10px und eine Breite von 20px. Unster globaler Abstand ist mit 5px defeniert. Nur rechnen wir Breite + Abstand = 15px. Damit ist die Kordinate für den nächsten Würfel an x=0 y=15. Und das geht dann einfach immer so weiter. Tja das ist reines mechanisches Denkvermögen, wenn man dafür keinen Sinn hat macht es keinen sinn sich mit 3D Programmieren zu beschäftigen.



  • LiGERWooD schrieb:

    Moment mal, wenn du einen Würfel an den anderen hängen wilst (in 2D wären das 4 Anschlagflächen) wieso musst Du dann den Mittelpunkt des vorangegangen Würfels wissen? Es gilt doch bei der Objektplatzierung, die obere linke Ecke, also x,y.

    Ob dabei es die obere linke Ecke, Mittelpunkt, untere linke Ecke, obere rechte Ecke oder untere linke Ecke ist, ist mir zunächst ja einmal egal, weil mir ich halt keinen dieser Punkte habe. Ich kann mir von jedem der Punkte jeden anderen Punkt errechnen.

    Angenommen ich haben P1(40;40) ^= obere linke Ecke.
    Kantenlänge = 20px

    Daraus kann ich mir nun errechnen, dass
    P2(60;40) = obere rechte Ecke
    P3(40;20) = untere linke Ecke
    usw. ist.

    Mein Problem ist, dass ich zu einem Würfel/Viereck P1, keine Koordinaten (x;y)[(x;y;z)] habe.



  • Die Kordinaten hast du egal ob x,y oder z. Und zwar in dem moment wo du den Würfel erstellen läst. Der erste, sofern Du das nicht anders vorgibst hätte dann x=0, y=0 und z=0. Das wäre die Kordinate und was er genau im Raum bedeckt kann man dann mit Länge, Höhe, Breite errechnen.

    Übrigenst ist es bei 3D im gegensatz zu 2D teilweise wirklich so, dass du ganz einfach nur viele 2D bilder hast. Die nummiert sind mit z. So viel Flächen du also hinten dran nach einander geschoben hast, genauso so hoch ist auch der Z wert.



  • Hab mein Problem jetzt gelöst.
    Was ich gesucht hatte war im Grunde
    http://download.java.net/media/java3d/javadoc/1.3.2/javax/media/j3d/Node.html#getLocalToVworld(javax.media.j3d.Transform3D)

    Damit hab ich das ganze jetzt so gelöst:

    public BranchGroup createSmallCubes(ColorCube centralCube)
    {
    	final float halfLength = (float)centralCube.getScale()/2;
    	final float tLength = 3*halfLength;
    
    	BranchGroup root = new BranchGroup();
    
    	Transform3D centralTransform = new Transform3D();
    	centralCube.getLocalToVworld(centralTransform);
    
    	for(float x=-tLength; x<=tLength; x+=(2*tLength))
    		for(float y=-tLength; y<=tLength; y+=(2*tLength))
    			for(float z=-tLength; z<=tLength; z+=(2*tLength))
    			{
    				ColorCube cube = new ColorCube(halfLength);
    
    				Transform3D transform3d = new Transform3D();
    				transform3d.setTranslation(new Vector3f(x,y,z));
    
    				TransformGroup transcube1 = new TransformGroup(centralTransform);
    				TransformGroup transcube2 = new TransformGroup(transform3d);
    
    				root.addChild(transcube1);
    				transcube1.addChild(transcube2);
    				transcube2.addChild(cube);
    			}
    	return root;
    
    }
    
    public BranchGroup createSceneGraph()
    {
    	final float siteLength = 1.0f;
    
    	BranchGroup root = new BranchGroup();
        ColorCube centerColorCube = new ColorCube(siteLength);
    
        root.addChild(centerColorCube);
    	root.addChild(createSmallCubes(centerColorCube));
    
    	return root;
    }
    

    Danke trotzdem für die Hilfe


Anmelden zum Antworten