[GELÖST] Java3D - Position eines ColorCubes im Raum
-
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 Methodepublic 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 = 20pxDaraus 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