Jump to content
Unity Insider Forum

Rigidbody self stabilization - Y dreht am Rad!


3ncrypt0

Recommended Posts

Hi zusammen,

ich habe einen Rigidbody, welchen ich durch neigen und drehen steuern kann - nun will ich aber, dass der Rigidbody auf der X & Z Achse wieder auf 0 laufen soll, OHNE das Y davon betroffen ist.

Hier mal mein Script, welches ich im Inet gefunden habe:

 

Vector3 predictedUp = Quaternion.AngleAxis(
	this.GetComponent<Rigidbody>().angularVelocity.magnitude * Mathf.Rad2Deg * stability / speed,
	this.GetComponent<Rigidbody>().angularVelocity
) * transform.up;
Vector3 torqueVector = Vector3.Cross(predictedUp, Vector3.up);
this.GetComponent<Rigidbody>().AddTorque(torqueVector * speed * speed);

Der Rigidbody dreht sich zwar wieder auf der X und Z Achse zu null - aber wenn ich z.B. das Objekt vorher nach vorne+links geneigt habe, fing der Rigidbody an, sich nach rechts um die Y Achse zu drehen - ebenso anders rum. Und er hört nicht auf. Gegensteuern kann ich nur, wenn ich z.B. nach vorne+rechts steuer, wenn das Objekt sich nach rechts dreht -_-. Dann aber fängt er irgendwann an, sich nach links zu drehen.

Ich habe auch schon versucht, Y in dem ScriptSnippet immer auf 0 zu setzen, da diese von der Stabilisation nicht betroffen sein sollte. Ohne Erfolg.

Jemand eine Idee?

Danke und VG

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 50 Minuten schrieb malzbie:

Hast du auch mal die Y Achse im Inspector blockiert?

Ja habe ich - bringt mir allerdings nicht soviel, da ich auch über Y Steuern kann/muss. Mich wundert einfach, dass AddTorque auch bzw. vor allen Dingen Y betrifft, auch wenn ich Y in dem Vector durchgehend auf 0 setze...

Btw: Ich steuer das Objekt mittels MoveRotation.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich würde es in etwa so machen:

float damping = 10.0f;
float step = damping * Time.deltaTime;
myRigidbody = this.GetComponent<Rigidbody>();
Quaternion targetRotation = Quaternion.Euler(0, myRigidbody.rotation.eulerAngles.y, 0);
Quaternion currentRotation = Quaternion.RotateTowards(myRigidbody.rotation, targetRotation, step);
myRigidbody.MoveRotation(currentRotation);

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

In der 3D Welt ist das ein gängiges Problem. Bei Rotationen kommt es häufig vor das sich das rotierende Objekt durch das Heading, Pitching und Rolling merkwürdig verhält, der gefürchtete Gimbal Lock also. Dies ist oftmals der Fall wenn Rotationen über Euler-Angles errechnet werden.

Unity bietet aber vereinfachte Methoden an um dem entgegen zu wirken, in diesem Fall sind Quaternions wie der Vorschreiber schon gepostet hat die sinnvollste Methode, Deine Rotationen zu errechnen, da sie nicht vom Gimbal Lock betroffen sind.

Kannst Du aber im Manual auch nachlesen: https://docs.unity3d.com/Manual/QuaternionAndEulerRotationsInUnity.html

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi zusammen,

komme leider erst jetzt dazu wieder etwas zu schreiben. Ich konnte das Problem lösen. Ich habe in dem Fall einfach einen PID Controller verwendet - Aber trotz allem hatte ich dann, sobald ich Roll+Pitch gleichzeitig verwendet habe, trotzdem noch diesen Yaw Effekt, der ja eigentlich auch logisch ist. Ich habe in meinem Projekt AngularDrag auf 0 stehen...das ist es schon. Gebe ich eine Kraft auf zwei Achsen aus, dann wirkt sich diese natürlich auch auf die dritte aus und ohne angularDrag fängt das Objekt sich an zu drehen, ohne zu stoppen...

Danke und VG

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...