Construction Set Objekte an den Globalen Achsen Rotieren

Unbekannter

Ehrbarer Bürger
Hallo alle zusammen. Ich schreibe ein Script, in dem ein Objekt so ausgerichtet werden soll, dass es zwei andere Objekte optisch miteinander verbindet.

Zumindest wollte ich die verschiedenen Rotationen durch die Umkehrfunktion des Tangens berechnen, habe dann aber festgestellt, dass die Funktion "setAngle" sich an den Lokalen Objektachsen anstatt an den globalen World-Achsen orientiert. Deshalb funktioniert das so nicht.

Gibt es irgendeine möglichkeit, die Objekte an der Globalen Achse zu rotieren, wie das im CS einfach durch die Linke Maustaste super klappt.

Oder kennt jemand eine Formel, die ich die Lokalen Rotationen ausrechnen kann, um das Objekt so zu bewegen, dass es zwei andere Objekte verbindet?
 
SetAngle setzt die Rotation/den Winkel des Objekts relativ zur globalen Achse, also es macht das, was du willst.

Oder kennt jemand eine Formel, die ich die Lokalen Rotationen ausrechnen kann, um das Objekt so zu bewegen, dass es zwei andere Objekte verbindet?
Ich könnte es dir schreiben, wenn du mehr Informationen gibst. Am Besten wäre ein Screenshot mit den Objekten, wie die Distanz zwischen ihnen ist und wie sie rotiert werden sollen (wenn ich es richtig verstanden habe).

Grüße,

Gildur
 
SetAngle setzt die Rotation/den Winkel des Objekts relativ zur globalen Achse, also es macht das, was du willst.

Laut dem CS-Wiki
Sets the object's rotation to the specified orientation along the selected local axis (x, y, or z).
und meiner Erfahrung nach wird das Objekt nach den Globalen achsen ausgerechnet.

Meine Situation ist die folgende:

Der Spieler soll einen bestimmen Pfeil irgendwo hinschießen. Wenn der Pfeil dann stecken bleibt, soll ein Seil zwischen der Abschussposition und dem Pfeil gespannt werden. Im Moment nutzt ich exemplarisch ein Brett.

Die Position des Brettes (Mit dem Pivot-Point in der Mitte) errechne ich mithilfe des Mittelwertes der entsprechenden koordinaten, die Rotationen wollte ich mit der Umkehrfunktion des Tangens der Steigungen berechnen, was nicht geht, das setangle die localen achsen nutzt.
Wenn ich nur eine Z-Rotation habe, klappt das ganze ja, da der Pfeil aber auch höher einschlagen kann, wird das ganze objekt bei zusäzlichen x und y rotationen nicht korrekt ausgerichtet.

Rotiert werden sollen jedoch nicht zwei verschiedenen Objekte, sondern nur das Verbindungbrett
 
Das Problem dabei ist, dass die Winkelkalkulation für das Seil/Brett abhängig von der Standardausrichtung des Brettes ist, also die Lage bzw. die Ausdehnung, die das Brett bei den Winkeln 0/0/0 hat. Allgemein lässt sich das Skript also wahrscheinlich nicht schreiben, sondern nur speziell für dieses Brett.
 
Ich habe inzwischen selber ein wenig gegoogelt und dann das hier gefunden:

GenerateRotationMatrix

(rotationMat:array) GenerateRotationMatrix axis:axis angle:float

Soweit, wie ich das verstehe, kann ich die globalen Koordinaten mit einer solchen Matrix multiplizieren, um die lokalen Koordinaten zu erhalten.
Was ich jedoch nicht verstehe ist, was ich für angle einsetzen muss.

Irgendwelche Ideen?
 
SetAngle setzt die globale Rotation.

Das Problem, was du hast, ist folgendes: Du rotierst im CS erst um die lokale z-achse um 45° und anschließend um die lokale x-Achse um 45°. Das ist das, was du brauchst. Wenn du dir allerdings die Attribute des Objektes im CS anguckst, hast du sowas:
X: 35.2645
Y:-30.0000
Z: 35.2645

Das sind die globalen Achsen und das eigentliche Problem, denn Oblivion bzw. GameBryo hat ein seltsames Achsen-Parenting benutzt. Was du brauchst, ist Euler und sehr kompliziert. http://en.wikipedia.org/wiki/Euler_angles
Ich hatte nämlich mal das gleiche Problem. OBSE liefert übrigens keine Euler Funktionen, allerdings bietet dir Algohol die Möglichkeit, Euler zu benutzen. Fakt ist, wenn du eine ordentliche Rotation möchtest, führt kein Weg an Euler vorbei.

Grüße,

Gildur

Edit.: Das habe ich gar nicht gesehen... RotationMatrix müsste auch gehen, allerdings bin ich da nicht mehr so fit. Da es mich aber selbst interessiert, werde ich mich da mal einlesen und bescheid geben, wenn ich zu einem Resultat komme.
 
Zuletzt bearbeitet:
  • Like
Reaktionen: Unbekannter
Klasse. Im Moment scheint mir die Rotations-Matrix die einfachere Variante zu sein, da ich davon wenigstens einen kleinen Teil verstehe. Für beides scheint mir jedoch das nötige Basiswissen zu fehlen, von daher wäre ich dir sehr dankbar, wenn du dich in sachen Rotationsmatrix mal schlau machen könntest und mir dann helfen würdest;)
 
Die Eulerschen Winkel können auch problemlos ohne OBSE erstellt werden. Die Z-X'-Z''-Konvention hat bei mir zumindest immer gut funktioniert.

Die Rotationsmatrizen, die du mit "GenerateRotationMatrix" erstellen kannst, beschreiben lediglich die Rotation um eine Achse. Du müsstest dann lediglich für jede Achse eine eigene Matrix erstellen und diese multiplizieren.

Der Nachteil der Eulerschen Winkel ist der, dass sie sich auf die globalen Achsen beziehen. Ich meine zwar mich zu erinnern, mal etwas ähnliches für die Rotation um die lokalen Achsen gesehen zu haben, finde es aber nicht wieder.
 
  • Like
Reaktionen: Unbekannter
Für die Rotations-Matrix wäre die Syntax also dann was?

(rotationMat:array) GenerateRotationMatrix axis:axis angle:float

set array to GenerateRotationMatrix x/y/z ???

Was muss ich für Angle einsetzen?
 
So wie ich es verstanden habe wäre es:
Code:
array_var rot_x
array_var rot_y
array_var rot_z

arrey_var rot_ges

let rot_x := RotMat x <Winkel>
let rot_y := RotMat y <Winkel>
let rot_z := RotMat z <Winkel>

let rot_ges := MatMult rot_x rot_y
let rot_ges := MatMult rot_ges rot_z

Die Arrays "rot_x", "rot_y" und "rot_z" sollten die Rotation um eine Achse beschreiben und "rot_ges" um alle drei.
 
  • Like
Reaktionen: Unbekannter
Gut. Also setze ich für <Winkel> den Winkel ein, den ich gerne hätte.

Wie kann ich dann das Objekt nach Rot_ges ausrichten?
 
Falls du damit meinst, dass du aus den Positionen auf den Winkel schließen kannst, dann muss ich dich, denke ich, enttäuschen.

Die Rotationsmatrix wertet lediglich die Rotation des Objektes aus. Mit Bezug zu deinem Beispiel könntest du praktisch errechnen, an welchen Koordinaten sich das Ende des Pfeils befindet, also wo zum Beispiel das Seil am Pfeil befestigt ist. Dafür musst du den Richtungsvektor zwischen besagtem Punkt und den Pfeilkoordinaten nehmen (also die Differenz für die Winkel 0/0/0) und die Rotationsmatrix zum Pfeil mit diesem Vektor multiplizieren.
 
  • Like
Reaktionen: Unbekannter
Hab mir die Euler-Winekl mal angeschaut. Wie ist denn bei Oblivion nun die Drehreihenfolge?

EDIT:
Anscheinend kann ich die Eulerwinkel irgendwie aus der Rotationsmatrix berechnen. Wie geht das?
 
Zuletzt bearbeitet: