Home arrow Eigene Profile erstellen
Effekte Scannen HOWTO Drucken E-Mail

 

 Diese Seite widmet sich ganz alleine dem richtigem Exportieren von Effekten für Yoda2.

Wort vorweg: Hier ist man am schwierigsten Teil angelangt, indem Wissen über DirectX und dessen Komponente “Direct Input” von Nöten ist. An dieser Stelle wird man die meiste Zeit investieren. Das liegt an der Tatsache, das ein Force Feedback Gerät meist sehr viele unterschiedliche Effekte vorgesetzt bekommt, aus dem es einen gesammten Effekt machen muss. Als da wären Flieh-Effekte in einer Kurve, schlechter Asphalt, Kollisionen in unterschiedlichen Längen und Stärken etc. etc.
Diese Effekte tragen natürlich kein Umhängeschild, was sie machen. Jeder Programmierer eines Spieles setzt sich in irgendeiner Art und Weise mit seinen Gegebenheiten auseinander und so kommen immer verschieden viele Effekte dabei heraus. In dem Spiel “Ford Racing” hat es sich der Programmierer z.B. sehr leicht gemacht und lässt genau “einen” Effekt springen. Aber auch hier lässt sich dadurch ein Kollisionseffekt bilden. Bei älteren Spielen sind die Effekte besser ausgebaut, da zu dieser Zeit die Force Feedback Geräte sehr gefragt waren. Heute ist das leider nicht mehr so, da alle mit Tastatur und Maus zocken. Dadurch haben auch die Programmierer dieser Spezialgeräte nachgelassen und können wahrscheinlich aus Zeitdruck nichts besseres bieten. Das ein Programm wie Yoda2 die Effekte abfragen wird, daran denkt natürlich keiner.
Und so kommt es vor, das manche Effekte erzeugt, ausgeführt und gleich wieder entfernt werden. Andere hingegen bleiben das Ganze Spiel über am Laufen oder werden stehengelassen ohne richtig beendet zu werden. (= Speicherleck)

Wissen über DirectX: Was für uns hier Interressant ist, ist die Spielesteuerung von Joysticks und Force Feedback Geräten. Dafür hat Microsoft freundlicherweise eine Schnittstelle mit dem Namen “Direct Input” geschaffen. Hier werden nicht nur alle Eingabegeräte für Spiele verwaltet, sondern auch die Force-Feedback Schnittstelle. Das kommt uns natürlich sehr gelegen, da wir dort eine Sammelstelle aller vom Spiel erstellten Bewegungen haben. Aller Code zum Verwalten und Benutzen der Geräte befindet sich in den zwei kleinen DLL Dateien dinput.dll und dinput2.dll in dem Windows Systemordner \system oder \system32.
Der Ablauf einen Force Feedback Effekt zu erzeugen ist immer derselbe. Als erstes wird DirectInput aktiviert über DirectInput(8)Create. Dannach muss das Eingabegerät erzeugt werden. Dies mithilfe von DirectInputDevice8::Create. Hat man ein Gerät, kann ein Effekt erzeugt werden. Dies geschieht mit CreateEffekt. Yoda2 reagiert genau in dieser Reihenfolge und liesst dabei den erzeugten Effekt aus. Natürlich nur, wenn es dabei nicht zu einem Fehler kommt. Denn viele der Effekte werden vom Spiel erzeugt, können aber aus diversen Gründen nicht ausgeführt werden, weil z.B. eine Achse fehlt (Lenkrad->Joystick). Und genau desshalb führt Yoda nicht nur die Effektdaten weiter sondern auch, ob der Effekt gerade gespielt wird und ob er wiedererkannt wurde (created) , wenn wir einen Effekt exportieren.

Als Effekttypen kennt DirectX folgende Effekte:

  
"ConstantForce", "RampForce", "Square", "Sine", "Triangle", "SawtoothUp", "SawtoothDown", "Spring", "Damper", "Inertia", "Friction" und  "CustomForce”

und dies in verschiedenen DirectX Versionen. Nachdem Force Feedback erst mit DirectX 5 bekannt wurde, dieses aber nicht mehr dafür verwendet wurde, unterstützt Yoda2 nur DirectX 7 und 8. DirectX 9 hat kein neues DirectInput und greift auf die Funktionen von DirectX8 zurück. Allerdings gibt es noch Unterschiede, ob die Funktionen mit “Wide” Parametern aufegrufen werden oder mit den normalen “Ansi” Zahlenwerten. Dies sieht man in Yoda noch hinter einem DirectX7 Effekt vermerkt. Die Custom Forces sind in Yoda nicht wirklich richtig implementiert, da ein Abfragen solcher Effekte eigentlich nicht möglich ist. Ebenso konnte ich bis jetzt kein einziges Spiel mit solchen Effekten finden. Diese vielen verschiedenen Effekte werden direkt an ein Force Feedback Gerät geleitet und in dessen eigenen Speicher zwischengelagert. Wird der Effekt nun vom Spiel verlangt wird er mit “Start” gestartet und mit “Release” wieder entfernt. Hinzu kommen noch diverse Spezial Force Feedback Kommandos, welche das Gerät an sich paussieren und wieder abspielen lassen.

Meine Suchtechnik: Hier gehen natürlich die Meinungen auseinander. Jeder kann seine Suchtechnik ausreifen wie er will. Für Einsteiger kann ich meine Suche nur Empfehlen. Als erstes wird
Yoda gestartet und auf einem weiteren Rechner das Anzeigetool RemoteYoda . Hat man dies geschafft, stehen in den oberen Menüleisten die IP Adressen des jeweils anderen PC’s. Wenn nicht, sollten die Firewalls überprüft werden. Dannach wird der Start-Button von Yoda gedrückt und der Hacken bei “Delete Released Effekt” herausgenommen. Dieser Hacken erkennt gelöschte Effekte und löscht sie aus der Liste. Bei schnellen Effekten sieht man dadurch nur sehr kurz eine Reaktion. Wir wollen aber zum Erfassen lieber eine Art Log-Datei. Nachdem wir auch bei 10 oder mehr Effekten mit dem Aufklappen der Effekte nicht hinterherkommen werden, muss noch bei beiden Expand Boxen ein Hacken gemacht werden. Nun startet man das Spiel und beobachtet den Remote Yoda und dessen Aktionen. Dabei ist es sehr wichtig, das eine Person das Spiel spielt und in dem Spiel Kollissionen und Kurven nach Vorgabe fährt. Währenddessen muss diese Person dem Effekte-Beobachter immer mitteilen, was im Spiel gerade passiert. Natürlich lässt sich das auch alleine durchführen. Dabei sollte der Yoda Monitor allerdings immer gleich in Sichtweite stehen. Am Besten wird das ganze ohne den Stuhl ausgeführt. Sieht man nun, das bei einer Kollission ein Effekt erzeugt wird und dieser sich verändert, hat man gewonnen. Kollissionen können aber mehrere vorhanden sein. Als da wären Kollissionen für Wagen gegen Wagen, Kollissionen Wagen gegen Seitenwand und Frontalzusammenstöße. Jeder dieser Effekte sollte schnellstens notiert werden (Bleistift und Papier bereithalten !). Als Notitz schreibt man sich die wichtigsten Eckdaten auf, die sich nicht verändern. Bei schnell verschwindenden Effekten ist dies natürlich sehr schwierig. Hier kann man schon mal ein oder zwei Stunden investieren, um hinter das Geheimniss der einzelnen Effekte zu kommen. Meist anderst verhalten sich dagegen Flieh und G-Effekte. Diese bestehen in der Regel aus einer Constant Force, welche nud Ihre Magnitude von einem negativen Wert bis zu einem positiven Wert verändert. Dies entspricht dann 1:1 der X-Achse, also links-rechts, des Stuhles. Da diese Effekte zu den Dauerbrennern zählen, kann hier auch das Autoplay angesetzt werden.

Das Exportieren läuft nun folgendermaßen ab:
Man verlässt das laufende Spiel mit ALT+TAB und wechselt in den Yoda2 Host (nicht Remote Yoda). Dort zählt man entweder von oben her ab oder man sieht den Effekt sofort. Damit ist die Effekttypenbezeichnung in der zusammengeklappten Liste gemeint. Ist der Effekt gefunden wird er expandiert. Dort befinden sich nun die ganzen Werte, welche sich während eines Spieles laufend anpassen sollten. Eine Ausnahme sind hier manche Kollissionseffekte, die nur einmal kurz abgespielt werden. Dieser verändernde Wert wird nun exportiert. Er erscheint dann in der Exportliste und später im Force-Profiler in der oberen Liste. Es können natürlich hier ruhig zum probieren mehrere Werte eines Effektes exportiert werden. Ist dies geschafft, wird die Liste in Yoda als .yef gespeichert. Dannach startet man Yoda neu, lädt die Liste und schaltet den Filter ein. Dieser Filter verhindert das Erkennen irgendwelcher anderen Effekte, ausser denen, die in der Liste stehen. Dann wird der Force-Sender und der Force-Profiler gestartet sowie das Spiel. Der Force-Sender soll dabei seine Daten senden. Während des Spieles kann nun im Force-Profiler der Exportierte Wert noch einmal begutachtet werden. Stimmt alles, kann dieser Wert in der Verarbeitungsliste als kollission oder G-Effekt oder Afterburner integriert werden. Um eine Bewegung bei sehr geringen Ausschlägen des Effektes zu verhindern, kann hier jeweils ein Minimum angegeben werden, ab der eine Reaktion am Stuhl stattfindet, sowie die Stärke auf die Stuhlachse.

Was tun, wenn die Effekte einfach zu schnell sind: Dies ist der anstrengendste Teil. Existiert ein Effekt für Kollisionen der nur für eine oder für zwei Sekunden in Yoda erscheint, kann dieser natürlich nicht so schnell exportiert werden. Ein ausschalten von “delete released Effect” hilft hier ebenfalls nichts, da die gelöschten Effekte nicht mehr exportiert werden können. Dies hängt damit zusammen, das die Erstdaten mit der der Effekt erzeugt wurde leider zu diesem Zeitpunkt schon gelöscht sind. Um dennoch diese Effekte zu erhaschen muss die .yef Datei manuell angegangen werden. Hierzu kann doppelt auf die Datei gegangen werden und diese dauerhaft mit dem Editor verknüpft werden. Natürlich kann man auch die Datei per Drag n Drop in den Editor gezogen werden. Einmal geöffnet sollten die bereits exportierten Effekte zu sehen sein.


[Exportinfo]
exportsize=2

In diesem Abschnitt wird die Anzahl der exportierten Effekte notiert. Fügt man einen Effekt dazu, muss der Wert exportsize um eins erhöht werden.

Es folgt ein Auszug “eines” exportierten Effektes wie er in einer .yef Datei steht und woher die Daten kommen:

c
c c
 

>
>
>
>
>
>

c c
 

hier in diesem Beispiel wird der lMagnitude Wert exportiert. Um die Größe des Wertes bei der Erkennung zu ignorieren, wird in der Ignore Liste der ConstantlMagnitude auf 0 gesetzt. (siehe rechts) Die lMagnitude war bei der Erzeugung 10000, kann aber nach Spielneustart auch 30 sein. Um eine Neuerkennung zu gewährleisten
muss der Wert ignoriert werden. Das gilt nur
für die Wiedererkennung, nicht für das spätere Verwenden dieses Wertes.

c c
 

[Export 1]
DataType=12
guid=1
dwSize=56
dwFlags=18
dwDuration=2000000
dwSamplePeriode=0
dwGain=10000
dwTriggerButton=-1
dwTriggerRepeatInterval=0
cAxes=1
effectdirection0=9000
effectdirection1=0
effectdirection2=0
effectdirection3=0
effectdirection4=0
effectdirection5=0
isEnvelope=0
dwAttackLevel=0
dwAttackTime=0
dwFadeLevel=0
dwFadeTime=0
EnvelopedwSize=0
cbTypeSpecificParams=4
isparameters=1
ConstantlMagnitude=10000
RamplStart=0
RamplEnd=0
PerodicdwMagnitude=0
PerodiclOffset=0
PerodicdwPhase=0
PerodicdwPeriode=0
ConditionlOffset=0
ConditionlPositivCoefficient=0
ConditionlNegativCoefficient=0
ConditiondwPossitivSaturation=0
ConditiondwNegativSaturation=0
ConditionDeadBand=0
CustomcChannels=0
CustomdwSamplePeriode=0
CustomcSamples=0
dwStartDelay=0
 

c c
 

+

cc
 

DataIgnored0=1
DataIgnored1=1
DataIgnored2=1
DataIgnored3=1
DataIgnored4=1
DataIgnored5=1
DataIgnored6=1
DataIgnored7=1
DataIgnored8=1
DataIgnored9=1
DataIgnored10=1
DataIgnored11=1
DataIgnored12=1
DataIgnored13=1
DataIgnored14=1
DataIgnored15=1
DataIgnored16=1
DataIgnored17=1
DataIgnored18=1
DataIgnored19=1
DataIgnored20=1
DataIgnored21=1
DataIgnored22=1
DataIgnored23=0
DataIgnored24=1
DataIgnored25=1
DataIgnored26=1
DataIgnored27=1
DataIgnored28=1
DataIgnored29=1
DataIgnored30=1
DataIgnored31=1
DataIgnored32=1
DataIgnored33=1
DataIgnored34=1
DataIgnored35=1
DataIgnored36=1
DataIgnored37=1
DataIgnored38=1
DataIgnored39=1

c c
 

<
<
<
<
<
<
<
<
<

 

0=ignorieren / 1=verwenden

c  
 


 

Um einen neuen, eigenen Effekt zu erstellen muss man nun einen solchen Abschnitt kopieren und ihn in den Effekt verwandeln, den man kurzzeitig auf dem Bildschirm sieht. Das [Export1] wird dabei immer auf die Effektnummer erhöht ([Export2]...). Desweiteren spielt auch das DataIgnored eine große Rolle. Das sieht jetzt nach viel aus, jedoch ist es eigentlich sehr simpel aufgebaut. Die hier abgebildeten Einstellungen müssen nicht alle bearbeitet werden. Ein paar wichtige Einzelheiten, um den Effekt wiederzuerkennen reichen völlig aus. Dazu gehört in erster Linie die ersten beiden Werte DataType und guid. Zudem setzt man alle DataIgnored schon mal alle auf 0, was bedeutet, das die rechten Daten einfach ignoriert werden. DataIgnored 0-39 entspricht der Ignore Liste wie wir sie aus dem Yoda Programm selbst kennen. Ich habe hier die Liste danebengestellt, damit man von oben nach unten abzählen kann, was für ein Ignore, was für eine Eigenschaft des Effektes Ignoriert. Weiss man, das eine Größe, eine dwMagnitude, eine Rochtung etc. immer gleich bleibt, wird dieser Wert in der rechten Tabelle eingetragen und das entsprechende Data Ignore auf 0 gesetzt. Dieser Vorgang kann auch später nach dem erneuten Laden der erweiterten, neuen .yef in Yoda selbst ausgeführt werden.

DataType gibt eine Zahl von 1 bis 35 an, wobei dies der zu exportierende Wert ist.
Will man also eine dwMagnitude einer Constant Force später im Force-Profiler sehen, gibt man hier 12 an.

1 = dwDuration
2 = dwSamplePeriode
3 = dwGain
4 = dwTriggerButton
5 = dwTriggerRepeatInterval
6 = cAces
7 = Effektrichtung
8 = dwAttackLevel
9 = dwAttackTime
10= dwFadeLevel
11= dwFadeTime
12= lMagnitude DICONSTANT
13= lStart DIRAMP
14= lEnd DIRAMP
15= dwMagnitude DIPERODIC
16= dwPhase DIPERODIC
17= dwPeriode DIPERODIC
18= lPositivCoefficientDICONDITION
19= lNegativCoefficient DICONDITION
20= dwPossitivSaturation DICONDITION
21= dwNegativSaturation DICONDITION
22= lDeadBand DICONDITION
23= dwSamplePeriode DICUSTOM
24= dwStartDelay
30-35 Grad der jeweiligen Effecktrichtung

Die GUID gibt den Effektnamen an. Sie muss dem kurzzeitig erkanntem Effekt entsprechen. Wenn der Hacken bei “delete released Effect” herausen ist kann man die GUID ebenso nachträglich erkennen und sich übrigens auch die meisten Werte notieren. (Zettel !!)

1="ConstantForce DirectX8/9"
2="RampForce DirectX8/9"
3="Square DirectX8/9"
4="Sine DirectX8/9"
5="Triangle DirectX8/9"
6="SawtoothUp DirectX8/9"
7="SawtoothDown DirectX8/9"
8="Spring DirectX8/9"
9="Damper DirectX8/9"
10="Inertia DirectX8/9"
11="Friction DirectX8/9"
12="CustomForce DirectX8/9"
13="ConstantForce DirectX7 Ex"
14="RampForce DirectX7 Ex"
15="Square DirectX7 Ex"
16="Sine DirectX7 Ex"
17d="Triangle DirectX7 Ex"
18="SawtoothUp DirectX7 Ex"
19="SawtoothDown DirectX7 Ex"
20="Spring DirectX7 Ex"
21="Damper DirectX7 Ex"
22="Inertia DirectX7 Ex"
23="Friction DirectX7 Ex"
24="CustomForce DirectX7 Ex"
25="ConstantForce DirectX7 Ansi"
26="RampForce DirectX7 Ansi"
27="Square DirectX7 Ansi"
28="Sine DirectX7 Ansi"
29="Triangle DirectX7 Ansi"
30="SawtoothUp DirectX7 Ansi"
31="SawtoothDown DirectX7 Ansi"
32="Spring DirectX7 Ansi"
33="Damper DirectX7 Ansi"
34="Inertia DirectX7 Ansi"
35="Friction DirectX7 Ansi"
36="CustomForce DirectX7 Wide"
37="ConstantForce DirectX7 Wide"
38="RampForce DirectX7 Wide"
39="Square DirectX7 Wide"
40="Sine DirectX7 Wide"
41="Triangle DirectX7 Wide"
42="SawtoothUp DirectX7 Wide"
43="SawtoothDown DirectX7 Wide"
44="Spring DirectX7 Wide"
45="Damper DirectX7 Wide"
46="Inertia DirectX7 Wide"
47="Friction DirectX7 Wide"
48="CustomForce DirectX7 Wide"

Hier gleich den Namen einzutragen habe ich wegen der Möglichkeit einen Fehler zu machen vermieden. Es muss also eine Zahl angegeben werden, die der Liste entspricht. Im oberen Beispiel haben wir eine guid von 28 was einem  “Sine DirectX7 Ansi” -Force Feedback Effekt entspricht.

Wenn alle Änderungen abgeschlossen sind, muss die Datei nur noch gespeichert werden und in Yoda erneut geöffnet werden. Dann sollte in der Export Liste auch der hinzugefügte Wert auftauchen. Nun müssen evtl. noch die Ignore Parameter verändert werden. Dabei sollten nur die Werte nicht ignoriert werden, die wir mit Sicherheit vorher notiert haben. Es reichen meist 3 Eckdaten aus, die nicht ignoriert werden. Überprüft wird das nun durch das Starten von Yoda mit Filteroption und weiterem Spielen bis der Effekt im Profiler korrekt arbeitet.

 

Das Autoplay: Zu guter Letzt wird noch das automatische Ein und Ausschalten des Stuhles anhand einiger Ereignisse Programmiert. Hierfür sind die meist andauernd laufenden G-Effekte sehr wichtig. Sollange diese auf Play sind oder nicht gelöscht werden, kann man davon ausgehen, das das Spiel sich noch im Rennmodus befindet. Geht man in ein Menü werden diese Effekte Pausiert oder beendet. Die Verwendung der eigentlichen Accurrator Funktion findet sich nur in sehr seltenen, älteren Spielen. Man exportiert also einen Effekt, welcher auf das Verlassen des Rennens 100 prozentig reagiert.

Letzte Aktualisierung ( Friday, 24. November 2006 )
 
Weiter >