pXcon_setwheel (ENTITY* entity, var SteerAngle, var MotorTorque, var BrakeTorque): void*
Bringt einen Steuerwinkel sowie Beschleunigungs- und Bremsdrehkraft an einem Radgelenk (PH_WHEEL) an und weckt die Karosserie-Entity der das Rad zugewiesen ist. Verwenden Sie diese Funktion zum Bewegen und Steuern von Fahrzeugen.
Parameter:
entity |
Radentity |
SteerAngle |
Drehwinkel um Achse 1. |
MotorTorque |
Drehmoment für Beschleuningung um Achse 2. |
BrakeTorque |
Drehmoment für's Bremsen um Achse 2. |
Geschwindigkeit:
Schnell
Bemerkungen:
Die Radfunktionen von PhysX, Version 2.8.3 leiden an ein paar Problemen, die einiger Behelfslösungen bedürfen:
- PhysX liefert nicht Position und Winkel des Rades zurück und überläßt daher die Berechnung der Ausrichtung des Autos, der Federungsparameter, der Kontaktpunkte und der Radachsengeschwindigkeit dem Leser als Übung. Unglücklicherweise ist die von PhysX zurückgelieferte Radachsengeschwindigkeit falsch - sie bezieht das Gleiten des Rades nicht mit ein. Es ist unmöglich aus den Radparametern die 'reale' Radachsengeschwindigkeit zu berechnen und daher müssen einige Näherungen und geschulte Schätzungen angewandt werden.
- Die Berechnung der Radreibung von PhysX benutzt eine theoretisch korrekte Annäherung einer lateralen und longitudinalen Reibungskurve mit Extremwert und Asymtote. Diese Kurve aber bekommt offensichtlich die Drehkraft und nicht die Gleitung als Eingabeparameter und das führt zu unrealistischer Beschleunigung und Reibung. Aus diesem Grund muß die Reibungskurve in Echtzeit aus Geschwindigkeit und Beschleunigung des Rades skaliert werden und die Drehkraft des Rades muß bei höheren Geschwindigkeiten reduziert werden.
- All diese Behelfslösungen sind in die Bibliothek ackphysX.dll sowie im Skript car.c übernommen worden und funktionieren bis zu einem gewissen Grade erfolgreich. Für eine wirklich realistische Autosimulation muß die Radphysik auf der CPU berechnet werden.
Beispiele:
function simple_car()
{
ENTITY* car = ent_create("car.mdl",vector(100,-200,40),NULL);
pXent_settype(car,PH_RIGID,PH_BOX);
ENTITY* FLwheel = ent_create("wheel.mdl",vector(168,-170,17),NULL);
ENTITY* FRwheel = ent_create("wheel.mdl",vector(168,-230,17),NULL);
ENTITY* BLwheel = ent_create("wheel.mdl",vector(39,-170,17),NULL);
ENTITY* BRwheel = ent_create("wheel.mdl",vector(39,-230,17),NULL);
pXcon_add ( PH_WHEEL, FLwheel, car, 0 );
pXcon_add ( PH_WHEEL, FRwheel, car, 0 );
pXcon_add ( PH_WHEEL, BLwheel, car, 0 );
pXcon_add ( PH_WHEEL, BRwheel, car, 0 );
//drive the car
while(1)
{
pXcon_setwheel (FLwheel,-5,0,0);
pXcon_setwheel (FRwheel,-5,0,0); // steer to the right
pXcon_setwheel (BLwheel,0,500,0);
pXcon_setwheel (BRwheel,0,500,0);
wait(1);
}
}
Siehe auch:
pXcon_add, pXcon_setparams1, pXcon_setparams2, pXcon_setmotor