Übertragung von Rotation von einem Object3D zu einem anderen

Started by DrSeus, January 12, 2011, 06:01:26 PM

Previous topic - Next topic

DrSeus

Hi erstmal,

erstmal möcht ich erwähnen das ich mich erst seit Weihnachten mit jpct beschäftige und es meine ersten 3D Erfahrungen sind. Derzeit arbeite ich an einem Tank Game und stehe hier vor einem Problem.
Mein Tank ist aus mehreren Child Objects zusammengebaut die sich ja mitbewegen um meinen Referenzpunkt. Es gibt auch einen schwenkbare Kanone, 1 objekt welches um die y achse dreht und 1 objekt das child vom ersten ist und sich um die x achse dreht. Somit ist es möglich die waffe zu drehen und zu heben/senken wenn sie child vom 2. objekt ist. Wenn ich nun eine Kugel abfeuern will muss ich ja die derzeitigen winkelstellungen von dem rohr(das 3. objekt) auf das projektil übertragen. Da ich das noch immer nicht ganz verstanden habe wie diese Rotation gehandhabt wird (relativ oder absolut) komm ich auf keinen grünen zweig wie ich die y achse des einen objekts und die x achse des anderen auf ein Objekt übertragen kann so das es dann genau gleich steht. (oder wie ich überhaupt die derzeitige achsenstellung von einem objekt ermitteln kann)
Bin mir sicher es gibt eine einfach möglichkeit aber ich such schon seit einiger zeit und hoff das mir wer weiterhelfen kann mit ein paar stichworten. Ich bedank mich schonmal für hilfe :)

lg DrSeus

EgonOlsen

Du könntest versuchen, mit den Matrizen, die dir getWorldTransformation() auf den Einzelobjekten liefert, was zu machen. Eigentlich brauchst du doch nur die Richtung, in die das Rohr zeigt, oder? Denn der Schuss fliegt ja genau in diese. Wenn das Rohr vorher (also wenn der Panzer "jungfräulich" ist) mit einer der Achsen  x,y oder z in der Richtig übereinstimmte, dann sollte ein get?Axis() auf der Matrix dir eigentlich die neue Richtung des Rohrs geben.

DrSeus

Hey,
Ich hab jetzt versucht mit getWorldTransformation() die RotationMatrix auf das Objekt zu übertragen, leider rotiert das Objekt jetzt iwie nicht um den Mittelpunkt des Objekts sondern verändert auch die Lage. Hab jetzt schon wieder einiges probiert nur die Kugel gleich auszurichten wie das Rohr steht, bekomm es aber immer noch nicht hin, langsam am verweifeln :$ Hättest du noch eine Idee oder könntest genauer beschreiben wie du das gemeint hast?
lg DrSeus

EgonOlsen

Mal mal ein Bild oder so. Vielleicht habe ich nicht ganz verstanden, was genau du tun willst bzw. wo genau das Problem liegt.

DrSeus

Natürlich:

Nach der Rotation bzw Höhenverstellung der Kanone:


Die roten Striche markieren den Startpunkt des Objekts (das verschiebt sich sehbar nach vorne) außerdem verlässt so das Objekt die Kanone nicht mehr zentriert in der Mitte
Bisschen besser verständlich?  :)
lg DrSeus

EgonOlsen

Das macht das Problem etwas klarer...könnte an unterschiedlichen Rotationspivots liegen. Das sind die Punkte im Object-Space, um die eine Rotation ausgeführt wird. Standardmäßig setzt jPCT die auf den berechneten Mittelpunkt eines Objektes. Du könntest im Falle des Projektils versuchen, das Pivot auf den unteren Punkt (also da, wo der senkrechte rote Strich sitzt) zu setzen (setRotationPivot(...))...im Object-Space wohlgemerkt, nicht im Worldspace oder so.

DrSeus

Nein das klappt leider auch nicht, setze ich vor der RotationMatrix den RotationPivot auf den RotationPivot vom Referenzobjekt(das objekt von dem auch die RotationMatrix stammt) so verschiebt sich der Punkt nochweiter.
lg DrSeus

EgonOlsen

Ich müsste genauer wissen, wie die Dinger zusammenhängen. Wenn ein du lauffähiges Beispiel hättest, würde ich mal damit rumspielen, wenn ich Zeit habe.

DrSeus


EgonOlsen


EgonOlsen

Ich habe dir eine PM mit dem Link auf die "korrigierte" Fassung geschickt. Im Prinzip war meine Idee mit dem getWorldTransformation() gut, ich hatte nur vergessen zu erwähnen, dass man den Translationsteil natürlich daraus entfernen muss. Die neue Fassung feuert nun meiner Ansicht nach korrekt. Ich habe noch ein bisschen Kleinkram geändert, um Warnungen aus Eclipse zu entfernen...vor ich gerade mal da war... ;)
Außerdem habe ich diese Version auf Multithreading umkonfiguriert...auch mehr so aus Spaß. Wenn du das nicht willst/brauchst/kannst, dann erfernen einfach die beiden Config-Einträge am Anfang von Main wieder.

Ich hoffe, das hilft dir weiter...

DrSeus

Vielen dank!

Hier ein Auszug für jemanden der mal was ähnliches sucht:

Object3D referenzObj;
SimpleVector origin = referenzObj.getTransformedCenter();
Matrix tranformationMatrix = referenzObj.getWorldTransformation();

Object3D addedObj;
//Set the position to the current position of refernzObj
addedObj.translate(origin);

// Remove the rotational part from the transformation matrix
Matrix newRot = tranformationMatrix.cloneMatrix();
newRot.set(3, 0, 0);
newRot.set(3, 1, 0);
newRot.set(3, 2, 0);
b.setRotationMatrix(newRot);

//Offset to the referenzObj
SimpleVector dir = b.getZAxis();
dir.scalarMul(18);
b.translate(dir);