Tokamak, Spielerobjekt

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

derAtomkeks

ehemals "Sethus"

Betreff: Tokamak, Spielerobjekt

BeitragDi, Jul 20, 2010 16:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi @ all,

hab mich nach einem Jahr "Physikpause" mal wieder darangesetzt, Physik in mein Spiel einzubauen.
Es funktioniert eigentlich alles so, wie es soll, nur mit dem Spieler komme ich nicht gut klar.

Es gibt im Moment Gravitations- und Feuerzauber, die den Spieler bzw. andere Objekte anziehen und
abstoßen sollen. Mit den anderen Objekten funzt das auch. Wenn ich dem Spieler (Rigid Body, Cube)
aber eine so geringe Masse gebe, dass er genauso von Druckwellen etc. erfasst würde, dann ruckelt er
nach einem Fall über den Boden und kommt schnell ins rollen (Friction ist bei Boden und Spieler auf 1, Restitution bei beiden auf 0).
Der nächste Punkt ist die Bewegung. Mit ApplyForce und SetForce sowie Neupositionierung funktioniert
es nicht richtig, da der Spieler anfängt zu ruckeln bzw. bei leichtem Bodenabfall ins kullern gerät.

Der Spieler soll also folgendes tun / nicht tun:
- Zu steile Abhänge nicht hoch kommen / runterrutschen (NICHT KULLERN -> Ruckelbewegungen)
- Bei leichten Steigungen / Abhängen nicht ins kullern kommen
- Bei normaler Bewegung über den Boden gleiten, nicht ruckeln
- Auf Krafteinwirkungen wie Explosionen durch wegfliegen oder herangezogen werden reagieren

Ich habe auch schon überlegt, Gravitation und tokamakinterne Kollision abzuschalten und diese erst bei Berührung mit anderen Gegenständen oder Eintreten in Druckwellenradius wieder einzuschalten.
Allerdings gibt es da zwei Probleme:
Erstens weiß ich nicht, wie lange die Physikaktivität anhalten soll und
Zweitens müsste ich dann, obwohl ich die schönen Möglichkeiten von Tokamak habe, Steigungen per Hand
überprüfen und müsste den Spieler so bei zu starker Steigung vor eine "Wand" laufen lassen.

Hoffentlich haben nach dieser ausführlichen Beschreibung haben alle mein Problem verstanden Very Happy
Ich hoffe ihr könnt mir helfen!

MfG,
Sethus

ComNik

BeitragDi, Jul 20, 2010 17:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Also, das klingt nach Tokamak intern (da ich deinen Code nicht kenne),

1.) Eventuell stimmt die Kollisionszeit bei der Reaktion in Tokamak nicht genau, dadurch kann es bei angeschalteter Gravitation zu Rucklern kommen.

2.) Um richtiges Sliding/Stacking zu implementieren muss sowohl statische als auch dynamische Reibung unterstützt werden.

Du kannst dich ja mal informieren, wie das bei Tokamak so ist Wink

lg
ComNik
WIP: Vorx.Engine

derAtomkeks

ehemals "Sethus"

BeitragMi, Jul 21, 2010 10:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Schonmal danke für die schnelle Antwort Smile

Auf der Webseite von Tokamak steht folgendes:
Zitat:
Stacking Tokamak is specially optimized for stacking large number of
objects; one of the most frequently requested features by game
developers.

Sehr viel mehr konnte ich nicht dazu finden. Ich glaube allerdings nicht, dass es verschiedene Reibungstypen gibt, da es nur einen Befehl zur erstellung eines "Materials" gibt:
TOKSIM_SetMaterial id%,Friction#,Restitution#
Unter Sliding kann man sich ja was vorstellen Smile aber was ist denn Stacking?
Mittlerweile glaub ich, dass das Ruckeln ein Effekt ist, als wenn man mit einem Radiergummi über Metall geht, das ruckelt auch, wird halt von der hohen Reibung angehalten und dann wieder ein Stück nach oben und vorne bewegt.
Welche Engine unterstützt denn das alles? Bzw. Welche benutzt du?

Mfg,
Sethus

ComNik

BeitragMi, Jul 21, 2010 15:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Also,

1.) Stacking: (=stapeln) Die Möglichkeit viele Physik Objekte übereinander zu stellen, ohne dass sie auseinandergleiten. Das klingt recht einfach ist aber schwer zu implementieren, da Stacking ein spezieller Fall in der Kollisionsreaktion sein muss, ansonsten kollidieren die Objekte immer ein bisschen, es gibt kleine Impulse = die Objekte ruckeln.

Mit 3D Physik habe ich mich in der Praxis noch nicht beschäftigt (da ich nicht 3D Programmiere), allerdings ist vieles genauso wie in 2D (nur komplizierter Wink).

Ich weiss nicht wie Tokamak denkt, aber bei SetMaterial() könntest du mal an friction und restitution spielen.
Restitution klingt für mich nach Reibungskoeffizienten, wenn du den auf 0.0 setzt, sollte es eigentlich Kollisionen ohne "Rückschlag" geben, also die Objekte springen nicht voneinander ab (wie wenn du einen Haufen Matsch auf den Boden wirfst...). Da das aber bei dir nicht zu wirken scheint, solltest du versuchen mal anstatt friction = 1.0, friction = 0.9 oder irgendwas anderes unter 1.0 zu machen. Denn wenn die Reibugn wie in meiner Engine funktioniert (^^), dann dürfte das die Geschwindigkeiten immer ein winziges bisschen reduzieren, so dass Objekte nicht einfach unendlich lange drehen/wegrutschen. Wenn restitution wirklich der Reibungskoeffizient ist, dann kannst du für ihn einen Wert zwischen 0.0 = Matsch und 1.0 = Flummi ohne jede Reibung = Superball.

Also ich würde als erstes probieren SetMaterial(0.9,0.0).

Wenn das nicht funktioniert, dann schreib bitte mal,

was die Gegner für eine Masse haben, und was der Spieler für eine Masse hat. Auch interressant (wegen dem Rollen) wäre, was der Spieler für einen Inertialmoment hat, wobei ich nicht weiss ob man das in Tokamak herausfinden kann? Wie gesagt ich nutze keine 3D Physik Engine.

[EDIT:] Gerade habe ich mir mal die Tokamak Seite angeschaut, also "Realistic Friction Model" spricht eigentlich für das was du brauchst. Dann liegt es wohl an deinem Code Wink. Könntest du mal die Auschnitte posten, in denen du Gegner und den Spieler erstellst?[/EDIT]

lg
ComNik
WIP: Vorx.Engine

derAtomkeks

ehemals "Sethus"

BeitragMi, Jul 21, 2010 20:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Aaalso mit der Reibung und dem Ruckeln hats ein Ende, durch rumspielen mit Masse, Reibung und diesem Reibungskoeffizienten rausbekommen.
Habe noch folgende drei Einstellungen für den Spieler (inkl Inertiaalmoment = InertiaTensor?)
Code: [AUSKLAPPEN]
TOKRB_SetLinearDamping Player\body,0.001
TOKRB_SetAngularDamping Player\body,0.02
TOKRB_SetBoxInertiaTensor Player\body,fPColDist#,fPColDist#,fPColDist#,fPMass#


fPMass# = 1

Das größte Problem ist aber nicht das Rollen, sondern eher die Tatsache, dass ich mich so zwar schön auf flachem Feld bzw auf einer abfallenden Ebene, aber kein bisschen auf ansteigendem Terrain bewegen kann.
Außerdem finde ich keine Möglichkeit, die Beschleunigung eines Gegenstandes zu begrenzen. Somit schießt der Spieler immer schneller werdend über die Karte und läuft bei abfallendem Terrain schneller als bei ansteigendem. Mittlerweile zweifle ich daran, dass ich das so mit "purem Tokamak" realisieren kann, sondern eine Hybridlösung implementieren muss, wie in meinem ersten Post beschrieben. Da kommt aber wieder das Problem auf, dass ich nicht weiß, wann ich nach zB. einer Explosion die Tokamakphysik wieder durch meine eigene Spielerphysik ersetzen muss. Also früh genug, damit die Steuerung wieder ordentlich funktioniert sobald der Schwung aufgebraucht ist aber auch so spät, dass die Rutschbewegung nicht mittendrin abgebrochen wird.

EDIT:
Ich Idiot hab mir zwar vorher mindestens 20 Mal die DECLS von Tokamak durchgeguckt, aber erst beim 21. Mal entdecke ich natürlich den Befehl der mir hilft: TOKRB_SetVelocity
Damit kann ich sämtliche Beschleunigung (auch das Runterrollen von Bergen etc.) unterdrücken und auch eine schöne Konstante Bewegung erzeugen. Ich glaube damit sind alle meine Probleme gelöst, nachdem das mit der Reibung jetzt auch ordentlich funtioniert. Noch einmal vielen Dank für deine Hilfe, falls es doch nicht klappen sollte, schreibe ich hier weiter Very Happy

ComNik

BeitragMi, Jul 21, 2010 22:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Schön das es klappt, frag ruhig weiter, wenns Probleme gibt Wink.

Ja das mit dem Inertialmoment gilt nur für 2D in 3D gibt es auch für den Drehwiederstand Tensoren (also einfach eine art Map, die für unterschiedliche Stellen am Objekt den Inertialmoment beinhaltet.

lg
ComNik
WIP: Vorx.Engine

derAtomkeks

ehemals "Sethus"

BeitragSo, Apr 17, 2011 18:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Nach einer Frustpause, die durch einen Geistesblitz zur Lösung der oben genannten Probleme, scheitere ich nun an deren Implementation.

Meine Idee:
Der Spieler ist eine Kugel, mit sämtlichen "normalen" Physikeigenschaften. Allerdings steht bzw. liegt er nicht direkt auf dem Boden auf, sondern schwebt er über dem Boden. Ein nach unten gerichteter Sensor überprüft die Distanz zum Boden. Wenn diese einen festgelegten Wert unterschreitet, wird dem Spieler in jedem Schleifendurchlauf ein Impuls angelegt, der die Gravitation ausgleicht und die Distanz zum Boden auf den Schwellwert erhöht.
Dadurch und durch die zusätzliche maximierte Winkeldämpfung kann der Spieler nicht mehr Abhänge runterkullern, es gibt auch kein Ruckeln mehr etc., da der Spieler den Untergrund ja nicht berührt. Trotzdem bleibt er flexibel und kann von äußeren Einflüssen wie Explosionen oä. durch die Gegend geschoben werden, da sämtliche Bewegungskontrollen ausschließlich durch Impulse erfolgen - kein SetPosition usw.

Das Problem ist jetzt nur, dass ich einfach nicht weiß, wie ich diesen Ausgleichsimpuls berechnen muss. So wie ich mir das vorstelle, funktionert es nicht:
F = m * g = 1 * 9.81
t = 1 (ein Step)
m * v = F * t
Da der Spieler meist mehr als 1 Step lang fällt, sollte die Fallgeschwindigkeit ein Vielfaches von 9.81 sein.. wenn ich aber nur einen Impuls von 9.81 pro Step ansetze, dann springt der Spieler wie ein Flummi wieder in die Höhe.
Hab ich jetzt irgendwo nen ganz dummen Denkfehler oder funktioniert Tokamak einfach nicht nach den bekannten physikalischen Gesetzen? Confused

Edit:
Durch Anpassung und Tests mit den Federungs-Algos der Rally Demo habe ich herausgefunden, dass der optimale Impuls irgendwo zwischen 0.17 und 0.19 liegt... Hat irgendwie nicht viel mit 9.81 zu tun...

Edit 2:
Ich hab mir den Tokamak Quellcode mal zu Gemüte geführt und festgestellt, dass logischerweise der Zeitdifferenzparameter ja noch einmultipliziert wird.. Meine Lösung flattert nun mit einer Höhendifferenz von etwa 0.01, was am Bild nicht zu erkennen ist. Bin nun also doch selbst auf die Lösung gekommen... aber vielleicht hat ja mal jemand dasselbe Problem.

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group