Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Quastl

Frischling

  • »Quastl« ist der Autor dieses Themas

Beiträge: 8

Wohnort: Wien

Beruf: Grafiker/Webdesigner

  • Private Nachricht senden

1

29.11.2012, 10:23

Motor-Leistungskurve simulieren

Hallo,
ist schon etwas länger her, dass ich da war. Habe Eure Ratschläge von DAMALS beherzigt, erstmal C gelernt, Zertifikat gemacht und danach auf Anraten meines Trainers erstmal C# zu Gemüte geführt. Nun, in der Zwischenzeit habe ich sogar bereits ein paar Anwendungen verkauft *freu*. Das Thema Spieleprogrammierung ließ mich aber nach wie vor nicht los.

So und nun stehe ich vor einem Problem, bei dem ich einfach nicht weiterkomme:
Ich habe ein C# Script, bei dem ein Fahrzeug simuliert wird. Dabei möchte ich so realitätsnah wie nur möglich die Leistung des Motors simulieren.

Erstmal zur Situation in der realen Welt:
So ein Motor hat ein maximales Drehmoment, das bei einer bestimmten Motordrahzahl erreicht wird. Bei überschreiten der Drehzahl wird es eben wieder geringer. Dieses Verhalten kann man anhand einer sog. Leistungskurve sehen.
Jetzt ist es so, dass einerseits die maximale Leistung und Drehzahl des Motors das Drehmoment bestimmt, welches dann (unter Berücksichtigung der Übersetzung) auf die Räder übertragen wird und das Fahrzeug antreibt, andererseits wiederum die Drehzahl der Räder, die die Motordrehzahl beeinflusst. Naja, und dann wäre da ja noch das berühmte Gaspedal, das ja die momentane Leistung eben regelt. Ein Teufelskreis :thinking:
Nach unzähligen Gesprächen mit Kfz-Technikern bin ich nun auf dem Stand, dass man eine Leistungskurve nicht berechnen kann. "Die kannst nur messen, da kommst halt mit deinem Fahrzeug vorbei und wir fahren mal auf den Prüfstand" heißt es da. Meine Einwände, dass es sich um ein virtuelles Fahrzeug handelt, lassen die nicht gelten - "Ja, egal, hat das Räder? Ja, dann komm halt mit dem vorbei und wir messen das!". :rolleyes:
Trotz der Versuchung, dass ich mal gerne sehen würde, wie er meinen PC an seinen Leistungsprüfstand anbindet, bin ich nun zu dem Schluß gekommen, dass man so eine Leistungskurve für eine Simulation eben faken muss.

Hat das jemand schon mal gemacht? Es gibt ja Autorennspiele, bei denen sowas vorkommt. Wie ist das denn da gelöst? Es sollte halt eben so nah, wie nur möglich an die Realität herankommen.

Die Situation in der virtuellen Welt sieht so aus:
Die PhysicsEngine stellt mir Radkollisionsobjekte zur Verfügung. Ich kann hier u.A. die Drehzahl des Rads auslesen, sowie ein Drehmoment angeben. Mein Ansatz war also:

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
private void CalculateEngine()
    {
        if (Input.GetAxis("Vertical") > 0)
        {
            throttleFactor = Input.GetAxis("Vertical");
        }
        else
        {
            throttleFactor = 0.0f;
        }
        int drivenWheels = 0;
        float totalRpm = 0.0f;
        foreach (Wheel wheel in wheels)
        {
            if (wheel.isDriven)
            {
                drivenWheels++;
                totalRpm += wheel.wheelCollider.rpm * currentGearRatio * finalGearRatio;
            }
        }
        engineRPM = totalRpm / drivenWheels;
        currentSpeed = (wheels[0].wheelCollider.rpm * 2 * Mathf.PI * wheelRadius) * 60 / 1000;
        if (engineRPM < idleEngineRPM)
        {
            engineRPM = idleEngineRPM;
        }
        if (engineRPM > maxEngineRPM)
        {
            engineRPM = maxEngineRPM;
        }
        if ((engineRPM < maxEngineRPM) && (engineRunning))
        {

 
            // Fake torque curve
            float powerPercent = maxOutputPS / gearShiftUpRPM;
            float motorPower;
            if (engineRPM < gearShiftUpRPM)
            {
                motorPower = engineRPM * powerPercent;
            }
            else
            {
                motorPower = (engineRPM * powerPercent) - (0.01f * engineRPM * maxOutputPS);
            }
 
            float engineTorque = (motorPower / 1.36f * 1000) / (2 * Mathf.PI * (engineRPM / 60));
            float throttleWheelTorque = (engineTorque * throttleFactor) / 10 * currentGearRatio * transferGearRatio * finalGearRatio;
 
            // Apply Torque to wheels
            foreach (Wheel wheel in wheels)
            {
                if (wheel.isDriven)
                {
                    wheel.wheelCollider.motorTorque = throttleWheelTorque / drivenWheels;
                }
            }
        }
    }


Wobei der Wert, der bei

C#-Quelltext

1
(engineTorque * throttleFactor) / 10
entsteht, reine Spekulation und try and error meinerseits ist. Haut auch irgendwie nicht richtig hin. Im niedrigen Drehzahlbereich und niedrigem Gang hat das Fahrzeug soviel Kraft, dass es teilweise abhebt und nach dem Schalten auf den 4ten Gang reicht die Leistung nicht mal um die Geschwindigkeit zu halten.

Ich wäre hier echt für jede Hilfe dankbar, da ich nun schon seit einer Woche dransitze und nicht weiterkomme... ;(

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

29.11.2012, 11:14

Du willst in der Regel doch wohl ein echtes Fahrzeug simulieren. D.h. die Leistungskurve bzw. Drehmomentenkurve ist eigentlich bekannt, du brauchst nur einen Weg um sie im Computer zu repräsentieren. Wenn ich mich recht erinnere, sehen solche Kurven eigentlich immer wie umgedrehte Parabeln aus. Ich würde also einfach mal versuchen, eine Parabel auf meine gewünsche Kurve zu fitten. Du kannst sie natürlich auch aus Liniensegmenten zusammensetzen oder ein Spline drüber legen etc. Spiel einfach mal ein wenig in Excel mit Trendlinien rum... ;)

Quastl

Frischling

  • »Quastl« ist der Autor dieses Themas

Beiträge: 8

Wohnort: Wien

Beruf: Grafiker/Webdesigner

  • Private Nachricht senden

3

29.11.2012, 11:26

Du willst in der Regel doch wohl ein echtes Fahrzeug simulieren. D.h. die Leistungskurve bzw. Drehmomentenkurve ist eigentlich bekannt...
Jein... Naja, ja und nein. Im Prinzip ist das schon richtig, weil ich da erstmal mit einem bestimmten Fahrzeug experimentiere. Es soll aber später möglich sein, andere Motorisierungen, bzw. Fahrzeuge zu simulieren. Sprich es soll durch die Angabe von z.B. PS oder max. Drehmoment, welche bei einer bestimmten Drehzahl (kann ebenfalls angegeben werden) erreicht werden, eben eine solche Kurve errechnet werden. Die muss jetzt nicht als wissenschaftlich und technisch korrekt standhalten, aber halt annähernd eine Leistung rauskommen, die halbwegs real erscheint.
Ah ja... um die Kurve als Grafik geht's mir da weniger. Werte würden mir da besser gefallen. Also halt eben, momentane Drehzahl ist jetzt so und so hoch, ich gebe so und so viel Gas - also bekommen meine WheelCollider so und so viel Drehmoment ab...

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

29.11.2012, 11:28

Naja, dann konstruier eben einfach eine entsprechende Parabel für deine fiktive Kurve!?

Quastl

Frischling

  • »Quastl« ist der Autor dieses Themas

Beiträge: 8

Wohnort: Wien

Beruf: Grafiker/Webdesigner

  • Private Nachricht senden

5

29.11.2012, 11:36

Nun ja, ok, das könnte ich hinbekommen. Aber wie beeinflusst jetzt das "Gas geben" die Leistung - da hänge ich hauptsächlich. Da weiß ich echt nicht, wie ich das simulieren soll. Klar, irgendwie muss das Drehmoment im Verhältnis zur Stellung des Gaspedals gesteigert werden dabei, damit mehr Kraft einwirkt - aber was ist da so annähernd real? Wie könnte ich das berechnen.

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

6

29.11.2012, 13:13

Naja ich denke berechenbar wird das schon sein. Ist halt die Frage wie aufwendig das ist, da sehr viele Faktoren da rein spielen werden. Je nachdem wie viel theoretisches Wissen die Leute hatten mit denen du gesprochen hast, ist es ja kein Wunder, dass du keine richtige Antwort bekommen hast;) Jemand der Ahnung von der Praxis hat, muss sich mit der Theorie ja nicht auskennen. Ich selbst habe zu wenig Ahnung von der Physik eines Autos, aber oft muss man gar nicht so nah an die Realität ran. Ein Spiel soll ja oft nur das Gefühl von Realität vermitteln. Ich denke, dass war auch was dot dir sagen wollte.
Mein Vorschlag wäre, du guckst dir verschiedene Leistungskurven an. Möglichst zu verschiedenen Autos. Dann guckst du in etwa wie sich die Kurven unterscheiden. Im vergleich hast du dann ja die verschiedenen Werte der Autos. Damit kannst du dir denke ich schon eine grobe Formel für deine Autos erstellen. Der Rest ist dann nur noch Anpassung. Testen und die Parameter so lange anpassen bis es dir gefällt. Wie gesagt, Realität ist viel unwichtiger als man denkt.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

7

29.11.2012, 14:45

Naja ich denke berechenbar wird das schon sein.

Das würde ich auch sagen. Allerdings ist in der realen Welt fast nichts vernünftig berechenbar, aber aber das meiste sehr gut approximierbar. Das einzige was man tun muss, ist ein Modell aufstellen, dass komplex genug ist um alle benötigten Details aus der echten Welt wiederzugeben, aber simpel genug, dass man es noch ausrechnen kann.
Ein Kfz Mechaniker braucht das nicht können, die Jungs die die Motoren entwickeln wissen aber sehr wahrscheinlich vorher schon recht genau, wie die Leistungskurve aussehen wird.

Bilder von Leistungskurven findet man zuhauf im Internet. Du kannst entweder versuchen, ein Polynom durch zu legen, oder du schreibst dir ein paar Messpunkte raus und interpolierst (linear, oder auf eine der vielen anderen Methoden). Die Parameter die man braucht, um so eine Kurve zu berechnen sind vermutlich mehr als nur PS und Max. Drehmoment, aber man kann sich ja irgendeinen Zusammenhang ausdenken, und daraus dann eine Kurve konstruieren, die anderen ähnlich sieht.
Wenn du es ganz realistisch haben willst, ist es wohl das beste, mit echten Messwerten zu messen, wenn du Fantasie-Autos hast, wird es keiner merken, dass die kurve keine plausible physikalische Grundlage hat, solange sie von der Form her in etwa richtig aussieht.
Lieber dumm fragen, als dumm bleiben!

Käsekönig

1x Contest-Sieger

  • Private Nachricht senden

8

29.11.2012, 14:51

Die Leistung ist im Prinzip nicht so ausschlaggebend. Ich würd sagen, du musst da mit dem Drehmoment arbeiten. Und dazu gibts dann ja die Drehzahl/Drehmomentenkennlinie. Mit dem Gaspedal steuerst du ja das Drehmoment (voll durchgedrücktes Gaspedal = maximales Drehmoment, das der Motor her geben kann bei der aktuellen Drehzahl). Ich fahr zwar nicht Auto, deswegen hab ich keine Ahnung, ob das Gaspedal das Drehmoment linear steuert. Aber du kannst es ja mal so probieren.

Zum Beispiel:
Dein Auto steht, du drückst das Gaspedal zur Hälfte -> der Motor liefert das halbe Moment, was er bei Drehzahl 0 aufbringen kann. Damit beschleunigt das Auto. Wie schnell das geschieht, rechnest du dir mit der Kraft am Rad, dem Gewicht und den Kräften, die entgegen wirken (Luftwiderstand, Rollreibung) aus. Wenn du dann die Beschleunigung hast, weißt du eben, wie schnell er nach x Sekunden schon ist. Und das musst du eben dauernd berechnen, somit kommst du immer auf einen Beschleunigungswert - wenn dieser negativ ist, bremst du das Auto ab (z.B. wenn du schon schnell unterwegs bist und nur wenig oder gar kein Gas gibst).

Ich hoffe, ich konnte dir helfen. :)

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

9

29.11.2012, 15:06

Leistung §P§ und Drehmoment §M§ hängen zusammen: §P = M \cdot \omega§. Wichtig für die Beschleunigung ist das Drehmoment, das ist richtig. Über den Radius der Räder gibt dir das Drehmoment die Kraft, welche letztendlich für die Beschleunigung sorgt. Da das Drehmoment von der Drehzahl abhängt, hängt die Kraft, mit der der Motor das Fahrzeug antreibt, von der Geschwindigkeit (Drehzahl der Räder) und Übersetzung des Getriebes (Gang) ab. Für richtige Fahrphysik wirst du natürlich noch ein Modell für den Kontakt der Räder mit der Straße brauchen (Reibung, Schlupf, ...) etc.

Das wär jetzt zumindest mal wie ich das mal grob angehen würde, ich hab aber keinerlei Erfahrung mit Fahrsimulationen. Die Drehmomentenkurve entspricht, wenn überhaupt, vermutlich auch nur vollgas...

Dieser Beitrag wurde bereits 10 mal editiert, zuletzt von »dot« (29.11.2012, 16:37)


Quastl

Frischling

  • »Quastl« ist der Autor dieses Themas

Beiträge: 8

Wohnort: Wien

Beruf: Grafiker/Webdesigner

  • Private Nachricht senden

10

29.11.2012, 18:15

Yo! Habs hinbekommen. Nachdem ich mir verschiedene Drehmoment und Leistungsdiagramme angeschaut habe, musste ich feststellen, dass das von einer Parabel weit entfernt ist. War also nicht so die Lösung. Aber im Endeffekt sehen die alle so aus:
1. Punkt = Leerlaufdrehzahl / min. Drehmoment
2. Punkt = bestimmte Drehzahl / max. Drehmoment
3. Punkt = max. Drehzahl / Drehmoment max. falloff

Damit habe ich zwar dazwischen die Kurve linear (hehe, eine lineare Kurve), aber dafür funzt das auch allgemein. Mit Luftwiderstand/Rollreibung abgestimmt damit der TopSpeed grad so erreicht werden kann. Die Beschleunigung ist eine andere Sache, aber da ist halt eben die Physics Engine kacke. Sieht halt immer eher nach Arcade aus. Muss mich noch mit dem Schlupf der Räder spielen, dann wird das auch besser.

Apropos Physics:
Könnt ihr mir eine Physics Engine emfehlen die ich mit C# ansprechen kann und für Lau bekomme? Im speziellen bastle ich im Moment eher an Fahrzeugsachen rum, also wenn jemand da Erfahrung hat. Ich habe mir zwar schon einige rausgesucht, aber jeder Krämer lobt seine Ware, wie's so schön heisst. Mich überzeugt da eher, wenn jemand schon was derartiges damit gemacht hat und mir sagt "ja dafür taugt die was".

Danke auf jeden Fall für die Tipps, hat mir weitergeholfen!

Werbeanzeige