Jump to content
Unity Insider Forum

Rotation, Quaternion ?!


Ismoh

Recommended Posts

Letztenendes sind Quaternions also nichts weiter als eine Art, wie du antworten kannst, wenn dich jemand fragt: "Wie ist dein Objekt gedreht?" - weil "Hannes" zu antworten irgendwie blöd wäre.

 

"Hannes" - sehr gut. Ganz mein Humor :D

 

Also kann ich bei meinem Problem (EDIT: Objekt in Richtung eines Punktes drehen), ebenso mit Transform.Rotate realisieren, da ich garnicht die selbe Rotation (also die vom Objekt selbst) haben will.

 

Ich berechne sozusagen den Richtugsvektor von Sammler zu Meteorit mit der LookAt() und kann den Sammler mit eben beiden Möglichkeiten drehen.

Bei Quanternions und t = 1 ist die Rotation beider Objekte somit gleich.

Bei Rotate weiß ich es gerade nicht.

 

Hab ich es richtig verstanden ?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Da steht jetzt, glaube ich, nichts falsches.

Aber auch nicht alles richtige :)

 

Du kannst sehr wohl mit Quaternions arbeiten, und das solltest du auch, nur halt nicht mit den Komponenten.

Im besten Fall hast du Quaternions rumliegen, schiebst sie hin und her und schaust, was dabei raus kommt. Nur per Hand bearbeiten solltest du sie nicht.

Z.B.:

Quaternion lookRotation = Quaternion.LookRotation(thingToLookAt.position - transform.position);

...und schon hast du ein Quaternion, das die Rotation beschreibt, mit der dein Objekt genau auf thingToLookAt schauen würde. Wie x, y, z und w von dem Ding aussehen (sprich: wie LookRotation() funktioniert) kann dir dabei total egal sein.

Als nächstes:

transform.rotation = Quaternion.Slerp(transform.rotation, lookRotation, Time.deltaTime * 10);

Und wieder passiert irgendwelche finstere Magie mit Quaternions, deren Konzepte wir nicht verstehen brauchen.

Du weiß nur: Bei Slerp wird eine Rotation der anderen angenähert, und zwar in diesem Fall mit t = Time.deltaTime * 10.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Du kannst sehr wohl mit Quaternions arbeiten, und das solltest du auch, nur halt nicht mit den Komponenten.

Wieso kein Transform.Rotate() ?, da ich dann per Hand Daten ändere ?

Im besten Fall hast du Quaternions rumliegen, schiebst sie hin und her und schaust, was dabei raus kommt. Nur per Hand bearbeiten solltest du sie nicht.

Z.B.:

Quaternion lookRotation = Quaternion.LookRotation(thingToLookAt.position - transform.position);

...und schon hast du ein Quaternion, das die Rotation beschreibt, mit der dein Objekt genau auf thingToLookAt schauen würde. Wie x, y, z und w von dem Ding aussehen (sprich: wie LookRotation() funktioniert) kann dir dabei total egal sein.

Als nächstes:

transform.rotation = Quaternion.Slerp(transform.rotation, lookRotation, Time.deltaTime * 10);

Und wieder passiert irgendwelche finstere Magie mit Quaternions, deren Konzepte wir nicht verstehen brauchen.

Du weiß nur: Bei Slerp wird eine Rotation der anderen angenähert, und zwar in diesem Fall mit t = Time.deltaTime * 10.

 

Das habe ich so :]

 

Ich möchte es aber gerne teilweise/ganz verstehen :]

Link zu diesem Kommentar
Auf anderen Seiten teilen

Wieso kein Transform.Rotate() ?, da ich dann per Hand Daten ändere ?

Ne, per Hand ändern wäre sowas wie transform.rotation.w = 20;

Transform.Rotate arbeitet auch auf den Euler-Winkeln, die sind mathematisch ziemlich harmlos.

Der Grund, warum Transform.Rotate in deinem Fall nicht so der Renner ist, ist der, dass das Berechnen, was du da jetzt explizit für Werte rein stopfen möchtest, ein ziemlicher Krampf wäre. LookRotation und Slerp ersparen dir diese Mühe, weil diese Berechnungen da schon drin stecken.

 

Ich möchte es aber gerne teilweise/ganz verstehen :]

Ist halt nicht immer notwendig. Nennt sich Black Box, das Prinzip: Wie Unity dir 3D-Modelle zeichnen kann, recherchierst du ja auch nicht bis ganz zum Boden, bevor du es benutzt ;)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ne, per Hand ändern wäre sowas wie transform.rotation.w = 20;

Transform.Rotate arbeitet auch auf den Euler-Winkeln, die sind mathematisch ziemlich harmlos.

Der Grund, warum Transform.Rotate in deinem Fall nicht so der Renner ist, ist der, dass das Berechnen, was du da jetzt explizit für Werte rein stopfen möchtest, ein ziemlicher Krampf wäre. LookRotation und Slerp ersparen dir diese Mühe, weil diese Berechnungen da schon drin stecken.

 

 

Ist halt nicht immer notwendig. Nennt sich Black Box, das Prinzip: Wie Unity dir 3D-Modelle zeichnen kann, recherchierst du ja auch nicht bis ganz zum Boden, bevor du es benutzt ;)

 

Danke :]

Stimmt :P

Link zu diesem Kommentar
Auf anderen Seiten teilen

Es ist lediglich so, daß Unity einfach die Schreibweise für die Grafik-Schnittstellen übernommen hat, statt dem unbedarften User da ein wenig Komfort zu bieten. Es reicht sie ja praktisch unverändert weiter. So gesehen nutzt es sie nicht mal.

 

Also ob nun OpenGL/DirectX mit Quaternions Arbeiten oder nicht lasse ich jetzt mal ausen vor. Ich weiß es nicht (ist mir auch egal :D) und Sacha meinte ja OpenGL würde mit eulerWinkel Arbeiten.

 

Das Unity aber keine Hilfe anbietet finde ich jetzt nicht ganz. Im Grunde genommen hat man ja seine Methoden und man kann Vector3 in Quaternions umwandeln. Genauso wie man mit Slerp drüber Schritte generieren kann. Und Quaternions selber muss man dafür nicht verstehen. Man muss nur Wissen das sie die Rotierung darstellen.

 

Ansonsten hat Unity ja sogar eine Darstellung für "unbedarfte User". Den überall gibt es Properties oder Methoden die mit eulerAngles arbeiten. Genauso wie man jeden Quaternions direkt in Euler Angles umwandeln kann. Und genau diese Art finde ich persönlich ist der Grund warum es überhaupt zu so Problemen mit der Rotation in Unity kommt.

 

Weil sie nämlich irgendwie versuchen mit eulerAngles was simpleres anzubieten, was man aber eigentlich ja gar nicht nutzen soll. Wenn man in den Klassen einfach nur Quaternions hätte würde doch beim Benutzer gar keine Fragen aufkommen und man würde sie einfach nutzen.

 

Nur so hat Unity ständig an einer Stelle mal eulerAngles, mal werden Quaternions genutzt, und mal werden Vector3 in Quaternions umgewandelt. Manche Tutorials nutzen eulerAngles an manchen Stellen. Und an manchen Stellen kommt dann nur eine Warnung das man dann auf einmal keine mehr nutzen darf und man bitte Quaternions nutzen soll.

 

Gerade diese vereinfachung ist meiner Ansicht nach viel eher das was verwirrt, da die Leute nicht wissen warum/wieso/wann man Quaternions benötigt. Oder besser gesagt, das Problem ist eher das die API inkonsistent ist.

 

Wenn einfach Konsistent Quaternions im Code genutzt werden würde und man noch die Vector3 umwandlung hätte dann würde es wohl sehr viel weniger Fragen/Probleme zu den Thema Rotierung geben.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Weil sie nämlich irgendwie versuchen mit eulerAngles was simpleres anzubieten, was man aber eigentlich ja gar nicht nutzen soll. Wenn man in den Klassen einfach nur Quaternions hätte würde doch beim Benutzer gar keine Fragen aufkommen und man würde sie einfach nutzen.

 

Nur so hat Unity ständig an einer Stelle mal eulerAngles, mal werden Quaternions genutzt, und mal werden Vector3 in Quaternions umgewandelt. Manche Tutorials nutzen eulerAngles an manchen Stellen. Und an manchen Stellen kommt dann nur eine Warnung das man dann auf einmal keine mehr nutzen darf und man bitte Quaternions nutzen soll.

 

Gerade diese vereinfachung ist meiner Ansicht nach viel eher das was verwirrt, da die Leute nicht wissen warum/wieso/wann man Quaternions benötigt. Oder besser gesagt, das Problem ist eher das die API inkonsistent ist.

 

Wenn einfach Konsistent Quaternions im Code genutzt werden würde und man noch die Vector3 umwandlung hätte dann würde es wohl sehr viel weniger Fragen/Probleme zu den Thema Rotierung geben.

Zustimmung.

Vielleicht sollte jemand mal das Stichwort "Dual-Quaternions" in die Gegend rufen, dann würde das ganze Umwandlungs-Gehampel auch noch wegfallen und es wäre, einmal implementiert, ein praktisch geschlossenes System.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...