Jump to content
Unity Insider Forum

Objekt zeitabhängig rotieren macht mir Probleme


gombolo

Recommended Posts

Hallo zusammen,

ich lasse 3 Objekte um einen Mittelpunkt rotieren...

transform.RotateAround(Center.transform.position, Vector3.forward, rotateSpeed);

das Objekt soll mit der Zeit immer schneller rotieren bis eine bestimmte maximale Geschwindigkeit erreicht ist.

rotateSpeed += speed * Time.deltaTime;

Nun rotiert es auf langsameren Rechnern auch langsamer :)  und auf schnellen Rechner schneller.

Die Ursache ist...speed wird Frameabhängig addiert auf rotateSpeed.

Das geht wohl so nicht...habt ihr einen Vorschlag wie ich das am besten löse? Danke!

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • gombolo changed the title to Objekt zeitabhängig rotieren macht mir Probleme

Time.deltaTime soll man doch nur für nicht Lineare Bewegungen verwenden. Also der Spieler springt vorwärts, dann würde beim langsamen Rechner der Sprung länger werden als einen schnellen Rechner.

Eine Rotation ist doch immer gleich, also Linear.

Da müsste dann doch Time.deltaTime weg. mit Time.fixedDeltaTime würde man ja auch nur eine Feste Größe geben, also kann man es auch gleich weg lassen.

Das wäre jetzt mein Gedanke.

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

ich habe das jetzt so gelöst, dass ich in der FixedUpdate() Methode einen bestimmten Wert auf die Rotationsgeschwindigkeit addiere. 

Das Objekt selber rotiere ich in einer anderen Klasse und dann über Update()

 

Also wenn ich den Wert 20 addiere, aber in der FixedUpdate() Methode, dann bedeutet das, es wird alle 50 mal pro Sekunde die Geschwindigkeit um 20 erhöht ( 20*50 = 100 pro Sekunde) 

und in Update mache ich das hier:

 transform.RotateAround(Center.transform.position, Vector3.forward, rotateSpeed * Time.deltaTime);

Scheit jetzt zu funktionieren...auch auf langsamen als auch auf einem sehr viel schnellerem Rechner...

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Problem war die ganze Zeit, dass du rotateSpeed einmal pro Frame für das Rotieren benutzt hast. Die Addition war nie das Problem.
Denn wenn du z.B. für rotateSpeed einen Startwert von 1 hast und du jetzt erstmal nichts dazu addierst, wird ein Rechner mit 30fps das Pbjekt nur 30° um das Andere Objekt herum drehen. Ein Rechner mit 60fps macht in der selben Zeit 60°.

Deine Addition für die Geschwindigkeitserhöhung wurde Frameunabhängig, also mit der deltaTime, berechnet. Du hattest also entweder ein 30stel oder ein 60stel (wenn wir die zwei Rechner mal annehmen) des speeds dazu addiert. Trotzdem hast du die Rotation selbst "nicht" frameunabhängig gesetzt. Der eine Rechner hat das 30 mal gemacht und der Andere 60 mal.
Das, was dazu addiert wurde, war nicht ausschlaggebend.

Du musst also beides, die Addition und die Rotation mit time.deltaTime multiplizieren.
Du machst das jetzt zwar so ähnlich, weil du die Addition in der FixedUpdate ausführst und die ja unabhängig von den Frames passiert. Das ist aber nur solange ok, bis du dir evtl. überlegst die Fixed Time zu verringern, weil du z.B. möchtest dass die Physik genauer arbeitet. Dann wirst du mehr Additionen bekommen als du vorher hattest und alles wird sich schneller verändern. Du müsstest dann also neue Werte nutzen um alles wieder so hinzubiegen, wie du es vorher hattest.

Wenn du in der Update die Addition mit deltaTime multiplizierst UND auch die Rotation mit deltaTime multiplizierst wird es genau so gehen. Und es wird egal sein, welche FixedTime du später mal nutzt.

Immer daran denken, dass deltaTime soviel wie "Pro Sekunde" bedeutet. 20*Time.deltaTime heisst also sowas wie  20 Einheiten pro Sekunde.
Bei einem langsamen Rechner (30fps) ist die deltaTime viel größer als bei einem schnellen Rechner (60fps). Da du die Rotation einmal pro Frame ausführst, wird bei dem langsamen Rechner pro Frame dann viel weiter gedreht, wie bei dem schnellen Rechner.  Der schnelle Rechner macht aber viel mehr Bilder wie der langsame Rechner und somit ist am Schluß beides gleich schnell.
Bei der Addition ist das genauso weil die ja auch jedes Frame ausgeführt wird. Du wills die Roation ja um so-und-soviel pro Zeiteinheit erhöhen, also musst du den zu addierenden Wert mit der deltaTime mutliplizieren, damit du die Anzahl der möglichen Frames ausgleichst.

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 9 Stunden schrieb Sir_Mathew:

Time.deltaTime soll man doch nur für nicht Lineare Bewegungen verwenden.

Äh... nein. Update+Time.deltaTime ist nur für lineare Abläufe sinnvoll.

@gombolo Wie @malzbie schon sagt: Dein ursprüngliches Problem war, dass du eine Beschleunigung hast. Diese passiert mit Time.deltaTime, aber die Drehung selbst muss auch mit Time.deltaTime multipliziert werden.

Wenn es wirklich exakt gleich auf allen Rechnern laufen soll, brauchst du hier FixedUpdate, da eine wachsende Geschwindigkeit kein linearer Ablauf ist und wie gesagt Update nur bei linearen Abläufen konsistent funktioniert. In FixedUpdate kannst du auch wunderbar Time.deltaTime benutzen, was das Problem mit der Robustheit vom fixed Timestep weitestgehend™ beseitigt.

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 5 Stunden schrieb gombolo:

Die Funktion ist doch logorhytmisch und würde so nicht beschleunigen sondern verlangsamen. Man muss das schon addieren damit es beschleunigt und das linear.

 

Bin keine Mathematiker bitte korrigieren wenn ich falsch liege. Danke :)

HÄ?

rotateSpeed = rotateSpeed * speed * Time.deltaTime;

Frame 1

2=2*2*0.2

Frame 2

0.8=0.8*2*0.2

Öhm ooooh

das Time.deltaTime ist zu gering, deswegen.

würde man aber höhere werte ansetzen beim Speed, dann klappt es.

Frame 1

2=2*10*0.2

Frame 2

4=4*10*0.2

Frame 3

8=8*10*0.2

 

usw. 

Es muss halt einfach so gerechnet werden, das der Wert Größer statt kleiner wird.B) <----- Mathematiker

Du darfst auch Mathe Ass sagen :P

Link zu diesem Kommentar
Auf anderen Seiten teilen

@MichaelHÖhm nö wieso?

Wenn du darauf anspielen willst, das bei z.b.

2=2*10*0.2

eigentlich vorne 4 stehen müsste....

dann muss ich sagen, evtl. hättest du recht. Ich bin mir nämlich nicht ganz sicher, ob die Auflösung zum Ergebnis exakt dann passiert, wenn die Berechnung

statt findet, oder erst im nächsten Frame.

bzw. von welcher Richtung das Programm abgearbeitet wird. Normal wäre ja von links nach rechts. Dann würde das Ergebnis erst im nächsten Frame kommen.

Oder er merkt sich das Ergebnis und aktualisiert es sofort wenn die Zeile mit ; abgeschlossen wird.

Normal würde man es ja auch andersrum schreiben 2*10*0.2=4 dann würde es ja nach deutscher Norm so geschrieben werden.

Ach was weiß ich. Ich bleibe Mathe Ass :P

Aber komm mir nicht mit der Wurzel :rolleyes:

PS: hab gar keinen Taschenrechner

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

@MichaelH Obwohl ich hab da doch recht. Hast mich voll durcheinander gebracht.

Beim einlesen von

2=2*10*0.2

steht es erstmal so. Erst wenn die Zeile Komplett eingelesen wurde, wird auf 4 gesetzt. Würde es vorher passieren dann wäre 4=4*10*0.2 usw...

Ein Zusammenbruch des Gesamten Systems wäre die Folge da dieses Ergebnis immer falsch wäre.

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

@gomboloNe.

Wenn man ein Spiel raus bringt, stellt man System Anforderungen auf.

Dort würde man einfach High End PC schreiben:D

Alles was darunter ist, kann zwar gespielt werden, aber wenn die Rotation dann still steht, ist man nicht Schuld...

 

Oder man setzt ganz einfach das Time.Deltatime ganz zum Schluss auf rotateSpeed ein und es wird immer beschleunigt.

Also Time.DeltaTime darf nicht in der Berechnung im rotateSpeed verwendet werden, weil dann wird leider rotateSpeed immer weniger. 

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...