JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=ba262e61c8117a7941e9d5ae90493f96Medaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Wie mache ich gute Bewegungsstreifen?

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 04.09.2006, 15:09    Titel: Wie mache ich gute Bewegungsstreifen? Antworten mit Zitat

Ahoi,

ich bräuchte mal eure Hilfe und zwar für folgende Sache. Wie im Topic stelle ich mir die Frage wie man gute Bewegungsstreifen basteln kann.

Zuerst natürlich was sind Bewegungsstreifen, der eine oder andere wird sie wohl eher unter dem englischen Begriffen motion trail kennen, für alle anderen hier ein Bild welches zeigt was gemeint ist:



Kurz gesagt motion trails sind die Kondensstreifen der Schwerter in vielen RPGs

Man könnte sie sicher durch Partikelemitter oder durch Motionblur in diversen Varianten darstellen, aber ich möchte gerne einen Meshbuffer haben den ich an mein Schwert klebe und schön hinter her gezogen wird.

Einen Ansatz habe ich auch schon fertig:

Ich habe einen Schleifenförmigen Meshbuffer dessen Vertexpäärchen konstant ausfaden (vertex.Alpha -= AusFadeFaktor*deltaTime)

Alle par Millisekunden wird das aktuelle Hauptvertexpäärchen durch das älteste Päärchen in der Schleife abgelöst. Dieses neue Hauptpäärchen hat die Eigenschaft Alpha immer 100% zu haben (oder je nach Geschwindigkeit des Schwertes) und immer am Schwert zu kleben, es bewegt sich also im Hauptpäärchen Zustand immer mit dem Schwert mit und lässt nicht locker.

Das ganze kann man sich so vorstellen:

Der grüne Rahmen ist nur zur Verdeutlichung wo die Randbereiche der Schleife sind. Blau=100% Alpha Weiss=0% Alpha



Mein Problem ist nun folgendes, die Neuernennung des Hauptpäärchens geschieht in einer festen Zeitspanne zB alle 10ms oder auch jedem Tick, aber da ich nur ein Hauptpäärchen maximal in einem Durchgang ernennen kann kommt es zu kritischen Zeitperioden oder schnellen Bewegungen zu kantigen Resultaten:



Eine Lösung wäre es mehrere hauptpäärchen zu ernennen und zwischen diversen Stadien zu interpolieren.

Gibt es da aber nicht eine bessere Lösung?
_________________
"I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse."
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 04.09.2006, 15:41    Titel: Antworten mit Zitat

Bei wenigen Schwertschingen, die relativ gleichförmig ablaufenn, könnte man ein Sprite vorrändern und hinter dem Schwert herziehen lassen.
Ansonsten wüsste ich auch ncihts besseres, als die Animation zu interpolieren. Man kann natürlich beim Ladne dynamisch ein Sprite aus der animaiton erstellen, und das hinterherziehen lassen, oder die Streifen gleihc in die Animation einbauen.
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 04.09.2006, 15:47    Titel: Antworten mit Zitat

Mhh das mit direkt in die Animation einbauen klingt ok, was aber wenn der Streifen für diverse Waffen anders ist Axt != Schwert.

Ach ja ehe ichs vergesse, das ganze spielt im 3D Bereich, daher sind Sprites evtl keine so gute Idee.
_________________
"I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse."
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Chriss
Senior JLI'ler



Anmeldedatum: 18.08.2004
Beiträge: 267

Medaillen: Keine

BeitragVerfasst am: 04.09.2006, 15:58    Titel: Antworten mit Zitat

Nur so eine Idee (ich hab davon nicht viel Ahnung)

Könntest du bestimmte Vertieces in deinem Schwert markieren?

Sollte es gehen kannst du ja bei jedem neuen Tick die neue Position dieser Markierten Vertices speichern und eine Fläche zwischen den Neuen und den zuletzt gespeicherten Punkten Zeichnen. DIeser müsstest du dann nur einen Verlauf von 100% zu 0% Farbwert geben. Alternativ kannst du ja alte Punkte eine weile bestehen lassen und den Verlauf über die so erstellten Flächen verteilen.

Ich stelle mir das so vor
CPP:
long IndexdesVertexObersterPunkt = Wert;
long IndexdesVertexUntersterPunkt = andererWert;


dann eine Funktion der man bei jedem Tick die Transformierten Punkte gibt (also tatsächliche Position in der 3D Welt)


Und dann mit 2 Dreiecken zwischen aktuellem und letzten Wert eine Fläche zeichnen, bzw zwischen den alten Werten der Reihe nach.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 04.09.2006, 16:25    Titel: Antworten mit Zitat

Nun das habe ich ja schon, der Verlauf besteht ja indem ich einfach die Alphewerte decrementiere, wobei der Verlauf zu stande kommt indem ich immer ein Vertexpäärchen auf 100% Alpha halte bis es abgelöst wird.
_________________
"I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse."
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Chriss
Senior JLI'ler



Anmeldedatum: 18.08.2004
Beiträge: 267

Medaillen: Keine

BeitragVerfasst am: 04.09.2006, 16:55    Titel: Antworten mit Zitat

Oh tut mir leid, da hab ich da hab ich das Kernproblem falsch verstanden.

Wenn es nur um die Rundung des Schweifs geht, warum nimmst du nicht die letzten Beiden und die aktuellen Koordinaten und interpolierst daraus deine Kurve wie es David in seinem Tutorial Curved Surfaces & CO beschrieben hat. Natürlich nicht mit allzu vielen Zwischenpunkten.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 04.09.2006, 16:58    Titel: Antworten mit Zitat

Wheee, gute Idee, danke.

Werde das mal ausprobieren, klingt zumindest sehr brauchbar Smile
_________________
"I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse."
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Dr. Best
Senior JLI'ler


Alter: 34
Anmeldedatum: 17.06.2004
Beiträge: 269
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 04.09.2006, 17:25    Titel: Antworten mit Zitat

Jetzt sind während ich das geschrieben hab schon ein paar neue Antworten gekommen, aber ich würde die Sache wohl folgendermaßen implementieren:

Erstmal würde ich für diesen Zweck ein Vertexformat schreiben das eine XYZ-Position, eine zweidimensionale und eine eindimensionale Texturkoordinate enthält (zu der 1D Koordinate unten mehr). Dann würde ich mit diesem Vertexformat eine indizierte Trianglelist erstellen. Die Anzahl der Dreiecke im Indexbuffer ergäbe sich aus der Zeit, die die Spur sichtbar sein soll, geteilt durch den Zeitinterval in dem ein neus Vertexpaar "hinzugefügt" werden soll multipliziert mit zwei. Der Vertexcount wäre dann gleich dem Trianglecount plus zwei.

Als nächstes bräuchte man eine Schleife, die die neuen Vertices hinzufügt. Dabei werden immer die ältesten Vertices überschrieben und es werden die indices der ältesten beiden Dreiecke überschrieben. Die Berechnung der Vertexpositionen sollte ja nicht so schwer sein (zumindest nicht wenn skeleton animation verwendet wird). Die 2D Texturkoordinate wird bei allen Vertexpaaren gleich sein (bei einem 0|0 und bei einem 0|1). Die 1D Texturkoordinate hingegen wird auf irgendeine Weise den Zeitpunkt der Vertexerstellung wiederspiegeln.

Der letzte Schritt wäre dann einen Vertexshader zu schreiben der diese Daten entsprechend anwendet. Die Texturkoordinaten werden verwendet um eine Textur aufzutragen die irgendeine hübsche Farbe hat und zu den Rändern hin transparent wird. Vielleicht könnte man die x-Texturkoordinate auch noch irgendwie mit dem Zeitfaktor manipulieren, so dass der Streifen zum Ende hin zum beispiel dünner wird. Und schließlich müsste man halt mit dem Zeitfaktor aus der Texturkoordinate und der derzeitigen Zeit, die über eine VS-Konstante übermittelt wird, die Transparenz berechnen.

Diese Methode müsste sich ziemlich effizient realisieren lassen und die Detailstufe der Spur ist Flexibel (sprich der Zeitinterval zwischen der Entstehung eines neuen Vertexpaars).
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen AIM-Name MSN Messenger
KI
JLI Master


Alter: 39
Anmeldedatum: 04.07.2003
Beiträge: 965
Wohnort: Aachen
Medaillen: Keine

BeitragVerfasst am: 05.09.2006, 10:11    Titel: Antworten mit Zitat

Wenn die Animationen des Schwertes immer gleich sind (Z.B. 5 verschiedene), dann könnte man Geometrie und Textur für den Schweif auch vorbereiten.
Die Animation des Scheifes geeigenet speichern und dann ggf. an der richtigen Stelle abspielen.

Bei einer freien Bewegung des Schwertes (siehe Die by The Sword) geht das leider nicht.

In den modernen Ninja Turtles "Beat 'em Up"-Spielen wird häufig ein Schweif für die Waffenbewegung gemacht. Da die Kampfbewegungen sich auf eine begrenzte Menge beschränken, schätze ich, dass jeder Schweif vorbereitet wurde und nicht on-the-fly mit Curved Surfaces oder ähnlichem generiert wurde.

Hier ein Screenshot
noch einer
und noch einer
(Die Comic-Effekte 'Bash', Thok' etc. kann amn abstellen und sind uanabhängig vom Motion Trail)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 05.09.2006, 12:46    Titel: Antworten mit Zitat

@Dr. Best: Diese Grundlagen habe ich schon längst Wink aber danke.

@KI: Naja MotionTrails in das Modell legen halte ich nicht für so toll weil die unter umständen Probleme mit Schatten sowie Kollisionsmeshs/Dinge bereiten könnten. Ausserdem stört mich da ein wenig der statische Aspekt.

Für Pfeile oder andere Angelegenheiten lassen sich ja Motiontrails auch gebrauchen.

Auch wenn ich nicht abstreiten möchte das ich es auch mal versuchen wollte es so zu machen wie du vorgeschlagen hast ^^

--------

So nur mal um meine Gedanken etwas zu ordnen ein bissl Pseudocode:

Beim Initialisieren:
Code:

Erstelle x Segmente (x=AusfadeZeit/Erstellungszeit+Puffersegment).

So habe ich die benötigten Teilsegmente, Teilsegmente sind nicht mit Meshsegmente zu verwechseln.
Das Puffersegment dient dazu immer auf der selben Position zu liegen wie das aktuelle Hauptsegment, damit der Alphaübergang hart ist. (Ansonsten würde man die Schleife sehen)

Code:

Erstelle für jedes Segment x Meshsegmente (x=Detailgrad des Trails von 0 bis irgendwas).

Ein Meshsegment besteht aus 2 Vertexpaare, 2 Meshsegmente ergeben ein Quad. Die Vertexe haben einen Farb, Positions und Texturkoordinatenwert.

Code:

Initialisiere alle Segmente auf den gleichen Wert.

Bedeutet die Positionsdaten werden an das gelinkte Objekt angepasst und die Alphawerte der Segmente werden auf 0 gesetzt. Dies dient dazu damit es nicht zu unschönen Grafikartefakten kommt.

Beim Updaten:
Code:

Gehe durch jedes Segment und dekrementiere den Alphawert um deltaTime.
{
  Wenn das aktuelle Segment unser Hauptsegment oder unser nächstes Hauptsegment ist ist dann setze die Position auf die Position des gelinkten Objektes.
  Wenn das aktuelle Segment unser Hauptsegment ist dann setze den Alphawert auf 100%.
  Wenn das aktuelle Segment unser nächstes Hauptsegment ist dann setze den Alphawert auf 0%.
}
Dekrementiere die Zeit bis zur Ernennung des nächsten Hauptsegmentes.
Wenn die Zeit zur Ernennung gekommen ist setzte die Zeit wieder auf die Erstellungszeit und ernenne unser neues Hauptsegment.

Hier werden wie man sehen kann nur die Segmente geupdatet, die Meshsegmente kommen danach dran.

Code:

Für alle Segmente mache folgendes
{
  Für i=Segmentindex*Detailgrad bis Segmentindex*Detailgrad+Detailgrad-1 mache folgendes
  {
    t = RelativerIndex*0.5/DetailGrad
    Setze Alphawert von Meshsegment[i] auf den interpolierten Wert vom aktuellen Segment, vorherigen Segment und vorvorherigem Segment nutze t als Parameter
    Setze Position von Meshsegment[i] auf den interpolierten Wert vom aktuellen Segment, vorherigen Segment und vorvorherigem Segment nutze t als Parameter
  }
}

Auch wenn Meshsegmente aus oberen Vertex und unteren vertex bestehen wird im Code nicht näher darauf eingegangen, da ja klar sein dürfte was passiert/gemacht werden soll.
_________________
"I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse."
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Dr. Best
Senior JLI'ler


Alter: 34
Anmeldedatum: 17.06.2004
Beiträge: 269
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 05.09.2006, 15:14    Titel: Antworten mit Zitat

Wo ist denn jetzt noch das Problem?
Falls es um die Berechnung der Vertexpositionen eines Vertexpäärchens zwischen zwei Frames geht hängt das natürlich entscheidend von der Animationsmethode ab die verwendet wird. Bei Skeleton-Animation kann man ja einfach für den Zwischenframe nochmal die Transformation des Schwert-Bones berechnen. Damit dann die Vertexpositionen zu kriegen ist ja kein Problem.
Bei nicht Skeleton-Animation (weiß grad nicht wie das heißt, ich meine so etwas wie z. B. bei *.md2 und *.md3 Dateien, wo es für jeden Frame einen Mesh gibt) ist die Sache natürlich etwas schwieriger Rolling Eyes .
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen AIM-Name MSN Messenger
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 05.09.2006, 15:53    Titel: Antworten mit Zitat

Es gibt eigentlich kein Problem mehr, zumindest von meiner Seite vorerst nicht.

Ich wollte meine Methode nur nochmal notiert haben damit evtl jemand etwas entscheidendes findet oder damit ichs parat habe wenn ich mein TrailSystem erneut aufsetze.
_________________
"I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse."
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum