Erstellung und Wirkung von Gravitation auf Pawn / Spiel Asteroids

  • Hallo Zusammen,


    ich bin Anfänger und möchte ein Spiel ähnlich wie den Klassiker "Asteroids" basteln. Allerdings klappt es nicht, dass ich die Wirkung von Gravitation einbringen kann. Ich habe aktuell einen simplen Cube als Pawn mit einer ebenso simplen Standardsteuerung. Mit der Pfeil nach oben Taste bewegt er sich nach oben. Jetzt bräucht ich ein "realistisches" Absinken zurück auf die Oberfläche. Ein einfaches einschalten der "Physics" führte dazu, dass der Pawn nicht mehr steuerbar war, also schlicht nichts mehr passierte. Habt Ihr Tipps oder Ansätze für mich? Gerne auch Links zu Tutorials.


    Vielen Dank im Voraus


    Tiocca

  • Sleepy

    Hat das Thema freigeschaltet.
    • Offizieller Beitrag

    Hallo Tiocca und willkommen im Forum!

    Ich kenne dein Setting nicht genau, aber vielleicht helfen dir ein paar grundlegende Dinge weiter:

    1. Die Gravitation hängt stark vom Scale deiner Meshes ab. Möchtest du realistische Gravitation haben, sollten deine Meshes auch eine realistische Größe haben.

    Angenommen, du importierst ein Mesh (z.B. einen Tennisball) mit einem Scale von 1.000.000 – dann wäre dein Tennisball so groß wie ein Planet, was physikalisch eine komplett andere Dynamik mit sich bringt. Dies betrifft auch die physikalischen Eigenschaften, wie z.B. die Masse. Ein Planet hat deutlich mehr Masse als ein Tennisball usw. Du könntest zwar mit der Gravity Scale gegensteuern, aber es ist besser, wenn die Skalierung von vornherein korrekt ist. Andernfalls wäre es so, als würdest du in Unreal ein Haus auf eine bestimmte Position setzen und diese Position ständig über Blueprints anpassen. Warum also nicht gleich die korrekten Werte verwenden, anstatt nachträglich zu korrigieren?

    1. Für dein Vorhaben benötigst du auf jeden Fall Physik – diese muss jedoch erst aktiviert werden. In den Physik-Einstellungen gibt es viele Werte, mit denen du experimentieren und die du verstehen solltest. Zum Beispiel steht "Damping" für die Reibung: Ist der Wert zu hoch, könnte es sein, dass dein Objekt zu stark abgebremst wird. Eine zu große Masse könnte dafür sorgen, dass dein Objekt nicht physikalisch korrekt abprallt. In manchen Fällen möchte man möglicherweise auch unrealistische Physik – etwa, wenn ein Raumschiff von einem Meteor abprallen soll.
  • Nein, du brauchst kein Raumschiff in Blender bauen, welches wirklich 1:1 skaliert ist, es reicht durchaus die Masse usw. richtig anzugeben.


    Aber, leider gibst du ja nur schriftliche Angaben, ein paar Angaben, welche deine Einstellungen zeigen wäre da hilfreicher.


    Was die Physik angeht, du musst halt Masse des Objektes angeben, irgendwo die Gravitationskraft, also, wenn es sich um die Erde handelt, 9.7, bei einem anderen Planeten dann halt entsprechend mehr oder weniger.

    Was aber dein eigentliches Problem sein dürfte, zumindest vermute ich das, die Physiksimulation arbeitet natürlich mit Kraftimpulsen. Sprich, wenn du keine Kraft ausübst auf das Objekt, in eine bestimmte Richtung, dann bewegt es sich halt auch nicht.


    Ist ein wenig schwierig zu erklären, aber so in die Richtung musst du halt denken. Ein ruhender Körper, ruht halt so lange, wie es keine Krafteinwirkung gibt. Wenn ich richtig liege, reicht da eine normale Geschwindigkeitsangabe nicht mehr aus.

    • Offizieller Beitrag

    Nein, du brauchst kein Raumschiff in Blender bauen, welches wirklich 1:1 skaliert ist, es reicht durchaus die Masse usw. richtig anzugeben.

    So würde ich niemals arbeiten.


    Wenn du dir eine Szene in Unreal aufbaust, spielen Größen und Entfernungen für die Physik eine wesentliche Rolle. Wenn du beispielsweise einen Ball im Maßstab 1:1 importieren und alles in eine Gruppe packen würdest, die du anschließend skalierst, wäre die Physik in Unreal nicht mehr korrekt.

    Natürlich kann man bei allen Objekten in der Szene die physikalischen Werte entsprechend durch einen Offset anpassen. Es ist jedoch viel einfacher, das Setting von Anfang an in einem korrekten Maßstab aufzubauen, anstatt mit Offsets dagegen anzukämpfen.


    Für die Unreal Phyiskengine ist es ein riesen Unterschied ob etwas aus 1m Herunterfällt oder aus 1000000m weil der das zehntausendfache ist oder über den Skale alles massiv skaliert wurde. Im Viewport sieht du ja optisch nicht wie Meshes skaliert sind.
    Ich kann jedem nur Empfehlen auf die Masstäbe zu achten. Du kannst einen Tennisball natürlich auch aus 1000000m Fallen lassen und die Masse dafür auf 1000000 erhöhen dann passt es auch wieder.



    Hier gibts auch eine Quelle ist zwar für Unity aber das zählt für Unreal genau so: https://techarthub.com/untangling-unit-scale-in-unity/


    Zitat

    The size of each unit of scale in Unity is arbitrary, and developers are free to work within whatever measurement system they are most comfortable. However, by default the engine expects you to use meters for distance/length and kilograms for mass. Diverting from this may have unexpected results.

    Hier gibts noch ein Link zu Unreal:

    Scale and Measurement Inside Unreal Engine - techarthub
    Having a practical understanding of how scale and measurement works inside the Unreal Engine is more than just a numbers game.
    techarthub.com

  • So würde ich niemals arbeiten.

    Du weißt aber schon, dass es in der Unreal Engine keine wirkliche Maßeinheit gibt? Meter, oder Zentimeter, ist nur eine Orientierungshilfe. Wenn du entsprechend aber in Blender alles im gleichen Maßstab erstellst, sprich, zum Beispiel, dass eine menschliche Figur 1 Meter groß ist, also halbiert, dann braucht dein Schreibtisch in dem Spiel auch nur 30 cm Höhe oder so. Wichtig ist nur, dass die Skalierung gleich bleibt. Schlecht ist nur, wenn du einige Modelle im Maßstab 1:1 erstellst, andere 1:2, wieder andere 1:5 oder was auch immer. Dann wird es schwierig. Am Ende, wenn du die Entfernung ansprichst, musst du dann gegebenenfalls die Skalierung auch auf das Gewicht übertragen. Oder stell dir mal vor, du willst ein Spiel mit dem Kampfstern Galactica programmieren. Das Teil ist mal eben rund 1,5 Kilometer lang. Da wirst du ja nie fertig.


    Du glaubst doch nicht wirklich, dass jemand, zum Beispiel bei Battlefield, einen Flugzeugträger im Maßstab 1:1 erstellt hat. Im Leben nicht. Und auch die Landschaften, die haben nur scheinbar ein Ausmaß, bei ganz großen Spielen, von 30, 40 oder mehr Kilometern. Wie würdest du so ein Landscape auch modellieren wollen?



    Aber genau das steht ja auch in deinem Link, von daher solltest du es eigentlich wissen.

    • Offizieller Beitrag

    In 3D sind Maße grundsätzlich relativ, aber es gibt gute Gründe, warum korrekte Maßeinheiten wichtig sind. Die Unreal Physik-Engine beispielsweise interpretiert Masse auf Grundlage des Skalensystems. Wenn die Maßstäbe nicht konsistent sind, können Objekte zb.. zu langsam oder zu schnell fallen oder sich anders als erwartet verhalten.

    Wenn du ein Mesh als physikalisches Objekt markierst, berechnet Unreal automatisch dessen Masse basierend auf dem Volumen des Objekts.


    Das kannst du einfach ausprobieren, indem du zwei Kugeln erstellst. Eine mit einem Radius von 50 Einheiten und eine mit einem Radius von 100 Einheiten – und bei beiden die Physik aktivierst.


    Wäre die Skalierung ohne Auswirkungen, würden beide Kugeln trotz unterschiedlicher Größe gleich schnell fallen. Du wirst aber sehen, dass die größere Kugel mehr Masse erhält als die kleine Kugel, was sich auf ihr physikalisches Verhalten auswirkt.


    Wichtig ist auch, wie weit die Kugeln fallen. Wenn sie nur 1 cm fallen, ist die Zeit bis zum Aufprall zu kurz, um einen Unterschied zu bemerken. Lässt du die Kugeln jedoch über einen längeren Zeitraum (z. B. 30 Sekunden) fallen, wird der Unterschied deutlicher sichtbar.


    Das ist, was ich mit der Wichtigkeit von Skalierung und Abständen meine.

    Stell dir beispielsweise einen Gleitschirm vor. Ein Gleitschirm mit einer Flügelspannweite von 10 cm würde sich komplett anders verhalten als ein Gleitschirm mit einer Spannweite von 10 m.

    Damit die physikalische Berechnung korrekt funktioniert, müssen auch die Basiswerte wie Größe, Masse und andere Parameter korrekt eingestellt sein.


    Ich skaliere in Unreal und auch in Maya niemals direkt. Wenn ich in Maya exportiere friere ich die Transforms ein, da Position, Rotation und Skalierung auf 0 gesetzt sein müssen.


    Hast du schon mal vom Gimbal Lock -Problem gehört? Nehmen wir an, ein Ball fällt und fliegt 5 km nach unten. Alle Achsen rotieren, XYZ drehen sich. Nun kann es passieren, dass zwei Achsen übereinander liegen, zum Beispiel X und Z. Sie richten sich gegenseitig aus. Das bedeutet, dass dein Objekt nicht mehr drei Rotationsachsen hat, sondern nur noch zwei.


    Das ist ziemlich interessant, kann aber zu großen Problemen führen.

    So Probleme hab es früher schon in der Schifffahrt mit Kompasse.


    Ich weiß dass viele keine Rücksicht auf den Scale nehmen aber das ist aus so vielen Gründen sehr wichtig.

  • Wenn du ein Mesh als physikalisches Objekt markierst, berechnet Unreal automatisch dessen Masse basierend auf dem Volumen des Objekts.

    Eben nicht. Deswegen musst du die Masse in KG ja eingeben. Woher sollte die Engine auch wissen, ob du da jetzt eine massive Stahlkugel mit 10 Meter Durchmesser darstellen willst, oder ob es eine hohle Kugel ist?

    Du kannst noch verschiedene andere Werte einstellen, wie Luftwiderstand usw. All das bräuchtest du nicht, wenn die Engine das aus der Größe des Objektes ziehen würde. Glaube mir, beim Paintballprojekt habe ich mich sehr viel mit der Kugel, Kugelgröße, Luftwiderstand usw., beschäftigt. War am Ende eine recht interessante Formel um die realistische Bewegung, Entfernung usw. hinzubekommen. Bzw. Formel ist vielleicht der falsche Ausdruck. Die Berechnung bestand halt aus den Werten Kugeldurchmesser, Luftwiderstand der Fläche, Restdruck in der Vorkammer, sprich, mit wie viel Druck wurde sie abgeschossen, und all diese Werte ergaben am Ende ein Paket an Daten für die Anfangsgeschwindigkeit und Flugbahn.

    Ich konnte aber ein identisches Ergebnis mit einer Kaliber .50 oder auch .68 Kugel replizieren. Das machte genau gar keinen Unterschied. Und ich habe so einige Schüsse zum Testen abgefeuert. Die genau gleichen Treffer waren mit Sicherheit nicht nur Zufall.


    Es mag zwar sein, wenn man sich um diese Werte gar nicht kümmert, dass die Engine dann aus dem Objekt selber versucht irgendwelche Anfangswerte zu ziehen, das weiß ich jetzt nicht, weil ich eigentlich von Anfang an mit eigenen Bewegungsvektoren ud so weiter gearbeitet habe. Aber am Ende kannst du bei den Werten alles beeinflussen. Und wie gesagt, wenn du das machst, dann verhält sich eine Kaliber .50 Kugel haargenau so, wie eine Kaliber .68 Kugel. Und mit haargenau meine ich so genau, dass ich schon dachte, am Code wäre irgendetwas falsch, weil ich dachte, dass eine Kugel keinen Fleck hinterlässt. Und da war die Zielweite immerhin etwa 10 Meter oder so, also jetzt auch kein Abstand, wo man sagen würde, dass sich auf die Strecke die Physik gar nicht auswirken würde.

    • Offizieller Beitrag

    Alles eine Frage der Einstellungen und Startwerte.

    Aber darum ging es ja du brauchst ja keine Einstellungen und keine Startwerte. Du erstellt eine große und eine kleine Kugel und du wirst sehen dass sich ohne Einstellungen die große Kugel anderst verhält als die kleine Kugel.

    Ich bin jetzt aber auch raus aus der Diskussion ich denke ich habe ausreichend quellen genannt die belegen dass es so ist.

  • So, ich konnte mein Problem lösen. Hab das gelöst, dass ich im Blueprint die Physics eingeschalten und dann über einen Tastendruck AddForce aufgerufen habe. Das klappt soweit. Eine kleine Timeline von 1 Sekunde lässt mein "Triebwerk" laufen.

    Jetzt ergibt sich eine weitere Frage. Kann ich den Ansatzpunkt von AddForce wählen? Ich möchte später eine Drohne mit 4 Triebwerken basteln und AddForce scheint sich auf den Mittelpunkt meines Meshes zu beziehen.


    Danke Euch schonmal im Voraus

  • Das ist mal eine gute Frage. Wie du an der Diskussion mit Sleepy bestimmt gelesen hast, bezieht sich mein Wissen zu Physik bisher auf Paintballkugeln. Da ist der Mittelpunkt OK, es gab für mich also kein Grund, den Mittelpunkt zu verschieben oder so.


    Aber, ich nehme mal an, du meinst sowas wie ein Quadcopter, wo dann, wenn ein Rotor sich schneller dreht, sich die Drohne entsprechend neigt. Da hätte ich zwei gedankliche Ansätze.


    Zum einen, der komplizierte Weg, der wahrscheinlich auch nicht funktioniert, bzw. schwierig umzusetzen ist. Die Rotorblätter musst du ja eh extra erstellen, damit sie halt rotieren, diese dann im Aktor so verbinden, dass sie den Body der Drohne halt immer entsprechend mitziehen, in die Richtung in die es gehen soll. Dazu bräuchtest du dann immer den jeweiligen Mittelpunkt des jeweiligen Rotors.


    Der einfachere und vielleicht auch funktionierende Weg ist, dass du nicht alles physikalisch darstellst, also, wenn du zum Beispiel um eine Kurve fliegst, dass sich der Actor dann halt anhand von Neigungswinkeln usw., die du ja auch im Code berechnen kannst, das kann man relativ geschickt machen, neigt. Also eigentlich so auf dem normalen Weg, wie man auch eine Spielfigur rotieren lassen würde, wenn man um eine Ecke rennt, oder mit einem Fahrzeug um eine Kurve fährt.

    Kurz gesagt, ich würde jetzt nicht notgedrungen alles der Physikengine überlassen, vielleicht nur im Falle eines Absturzes oder so, dass da halt die Physik greift. Die normale Steuerung würde ich da eher "händisch" programmieren, da hast du dann auch entsprechende Möglichkeiten die Flugeigenschaften zu kontrollieren.

    • Offizieller Beitrag

    AddForce scheint sich auf den Mittelpunkt meines Meshes zu beziehen.


    Ein Beispiel:


    Wenn du AddForce auf einen Ball anwendest, verhält sich das Objekt wie ein physikalischer Körper, auf den die Kraft gleichmäßig wirkt. Das bedeutet, dass der Ball durch die Anwendung von AddForce vorwärts bewegt wird, jedoch ohne signifikante Rotation, da die Kraft direkt auf den Massenschwerpunkt des Balls wirkt.


    (Du würdest nicht den Ball selbst bewegen sondern vielmehr den Massemittelpunkt. Ein unendlich kleiner Punkt innerhalb des balls wodurch auch keine Rotation zustande käme. )


    Anderst gesagt: Wenn du dir vorstellst, den Ball mit einem Billardstock anzustoßen, würde sich der Ball mit AddForce geradeaus bewegen, ohne zu drehen oder zu rotieren. Das liegt daran, dass die Kraft zentral auf den Schwerpunkt wirkt. In der Realität würde eine Billardkugel bei einem Stoß an der Seite rotieren und "Spinn" entwickeln.


    Um das zu erreichen , kannst du AddForce at Location verwenden. Mit dieser Funktion wird die Kraft an einem bestimmten Punkt außerhalb des Massenschwerpunkts angewendet, was zu einer Kombination aus Bewegung und Rotation führt.


    Falls du einen Quadrokopter physikalisch korrekt kippen lassen möchtest, solltest du dich fragen, warum das in der Realität geschieht. Das Kippen wird dadurch verursacht, dass die Motoren auf einer Seite schneller rotieren als auf der anderen Seite. Das ist vergleichbar mit einem Panzer, bei dem sich die Ketten unterschiedlich schnell bewegen, um eine Kurve zu fahren.


    (Eine einfache Möglichkeit, dieses Verhalten ohne komplexe Physiksimulationen darzustellen, ist über eine Animation.)


    Um es physikalisch korrekt zu simulieren: Sobald du den Quadrokopter zur Seite neigst, muss die Schubkraft auf einer Seite verstärkt und auf der anderen Seite reduziert werden, was das Kippen verursacht.


  • Anderst gesagt: Wenn du dir vorstellst, den Ball mit einem Billardstock anzustoßen, würde sich der Ball mit AddForce geradeaus bewegen, ohne zu drehen oder zu rotieren. Das liegt daran, dass die Kraft zentral auf den Schwerpunkt wirkt. In der Realität würde eine Billardkugel bei einem Stoß an der Seite rotieren und "Spinn" entwickeln.

    Ich bin mir nicht ganz sicher, ob man das Beispiel so auf eine Drohne übertragen kann. Es gibt halt viele physikalische Einflüsse auf ein Objekt und ich bin mir auch nicht ganz sicher, ob die Physiksimulation so komplex ein Objekt berechnet, denn es ist ja immer noch nur eine Gameengine.


    Aber, selbst wenn die Engine alles so komplex berücksichtigen kann und auch tut, ich habe da so ein wenig Bedenken, dass der Spieler bei einer kompletten physikalischen Berechnung der Bewegung, der Spieler die Drohne noch gut kontrollieren könnte, weswegen ich im zweiten Punkt da ja auch eher zu einer Animation tendiere.

    Und du kannst die Physikengine ja auch per BP an- und ausschalten. Also, solange der Spieler die Kontrolle hat, halt mehr mit Animationen wie Kippen, Neigen und beschleunigen arbeiten, und wenn die Drohne halt nicht mehr unter der Kontrolle des Spielers steht, weil Akku leer, oder abgeschossen, also alles, was so mit Absturz zu tun hat, dann das Ganze der Physikengine überlassen. Einfach die letzten Werte, wie Geschwindigkeit und Richtung übergeben und dann abstürzen lassen. Damit hast du dann eine schöne Absturzsequenz, und sie prallt an Wänden oder dem Boden dann auch korrekt ab usw.


    Man kann das alles eben halt auch kombinieren. So würde ich das zumindest versuchen es umzusetzen.

  • Wie gesagt du kannst es ja ausprobieren

    P.S. Ich habe es jetzt noch einmal mit zwei einfachen Kugeln ausprobiert, eine halb so groß wie die Andere, beide 100 Kilogramm schwer, beide fallen genau gleich schnell, beschleunigen auch gleich und prallen vom Boden gleich ab. Damit sollte dann wohl bewiesen sein, dass die Größe des Objektes keinen Einfluss auf die Physikengine hat.

    • Offizieller Beitrag

    Wie bist du den vorgegangen beim Importieren ? Wenn beide Kugeln 100kg schwer sind ist es ja klar das beide Kugeln gleich fallen.


    Versuch mal folgendes:

    Erstelle eine Kugel in Blender mit einem Radius von 50 exportiere sie in Unreal und mach die Simulation an.

    Erstelle eine zweite Kugel in Blender mit einem Radius von 100 exportiere sie in Unreal und mach die Simulation an.


    Das funktioniert natürlich nur wenn die physikalische Simulation aktiv ist.

  • Wie bist du den vorgegangen beim Importieren ? Wenn beide Kugeln 100kg schwer sind ist es ja klar das beide Kugeln gleich fallen.


    Versuch mal folgendes:

    Erstelle eine Kugel in Blender mit einem Radius von 50 exportiere sie in Unreal und mach die Simulation an.

    Erstelle eine zweite Kugel in Blender mit einem Radius von 100 exportiere sie in Unreal und mach die Simulation an.


    Das funktioniert natürlich nur wenn die physikalische Simulation aktiv ist.

    Oh man. Es geht aber doch darum, wenn du ein Raumschif, von mir aus 300 Meter im Original, 20 Tonnen schwer, in Blender halt 30 Meter lang machst und angibst, 20 Tonnen schwer, dass es sich dann genauso verhält. Alles andere wäre absolut blödsinnig. Ich muss doch logischerweise wenigstens die Masse angeben. Warum verstehst du diese Kleinigkeit nicht? Es geht doch darum, dass du gesagt hast, man kann die Physikengine nicht nutzen, wenn man die Modelle skaliert und hier ist der Beweis, dass man es sehr wohl kann. Ist doch nun wirklich nicht so schwer.

  • Das habe ich gesucht. Damit kann ich alles lösen. Dankeschön.