Also man könnte das ggf. folgendermaßen machen:
Als Aufpunkt nehmen wir die x,y,z des Fahrzeugs.
new Float:x,Float:y,Float:z;
GetVehiclePos(vehicleid,x,y,z);
Dann benötigen wir die Angle des Fahrzeugs:
new Float:angle;
GetVehicleZAngle(vehicleid,angle);
Jetzt benötigen wir noch die offSet Position des Fahrersitzes. Einfacher währe direkt der Beifahrersitz, das gibts als Parameter aber leider nicht.:
new Float:offx,Float:offy,Float:offz;
GetVehicleModelInfo(GetVehicleModel(vehicleid),VEHICLE_MODEL_INFO_FRONTSEAT, offx, offy, offz);
Wir müssen jetzt , da wir von Achssymetrischen Fahrzeugen und von der Fahrzeugmitte als Referenz ausgehen, den Richtungsvektor noch um 90° drehen. Wir lassen hierbei mal z außer acht, da der Beifahrersitz sich auf gleicher Höhe wie der Fahrersitz befinden sollte. Unser Multiplikatiosnvektor heißst (-1/1).
offx = offx*-1;
offy = offy*1;
offz = offz; // kann man auch wegllassen
Beispiel. Unser offSet Vektor beträgt (-6/8 ) von der Fahrzeugmitte. Damit würde der Vektor auf einer 2d Ebene nach oben Links deuten. Wir wollen aber dass er nach oben rechts (Beifahrersitz) deutet:
(-6/8 ) * (-1/1) = (6/8 ) -> Also oben rechts.
So jetzt brauchen wir die Geradengleicheung nach: Aufpunkt + x*Richtungsvektor. x ist in diesem Falle 1, da wir genau den Beifahrersitz erreichen wollen. Bei x>1 würden wir praktisch über den rechten Front-Blinker schauen.
new Float:xg = x+offx;
new Float:yg = y+offy;
new Float:zg = z+offz;
Das sind jetzt die Koordinaten des Beifahrersitzes auf der realen Map (also von der tatächlichen Position abhängig.
Diese Koordinate kann als neuer Aufpunkt gesehen werden, an den wir jetzt nur noch den Richtungsvektor zur Beifahrertür anhängen müssen.
Diesen erhalten wir über die FacingAngle, also die Drehung des Autos.
Gehen wir als Anfang von einem Vektor aus, der nach Norden schaut: (0/1). Die Z-Ebene kann hier wieder vernachlässigt werden.
Diesen Vektor drehen wir jetzt um die entsprechende Gradzahl des Autos plus 90 Grad. Schaut das Auto also nach Norden (0°) wollen wir den Vektor um 90° (also nach rechts schauend) drehen.
angle = angle+90.0;
Angle beschreibt jetzt die zu vollziehende Rotation.
Des Weiteren benötigen wir noch die Drehmatrix für unseren eben erstellten Vektor nach Norden.
Diese sieht folgendermaßen aus:
x' = [cos(angle) -sin (angle)]*x
y' = [sin (angle) cos(angle) ]*y
x' und y' sind beschreiben den neuen Vektor. Angle und x/y kennen wir bereits und können einfach eingesetzt werden.
x' = [cos(angle) -sin (angle)]*0
y' = [sin (angle) cos(angle) ]*1
Leiten wir daraus nun ein LGS ab, erhalten wir folgende Berechnungen:
x' = cos(angle)*0 + (-sin(angle)*1)
y' = sin(angle)*0 + cos(angle)*1
Adaptieren wir das in Pawn, sieht der Code folgendermaßen aus:
new Float:x1 = floatcos(angle)*0+((-1*floatsin(angle))*1);
new Float:y1 = floatsin(angle)*0+floatcos(angle)*1;
Jetzt müssen wir nun noch unsere Gradengleichung aufstellen und wie sind fertig (auch mit den Nerven )
Aufpunkt+Richtungsvektor*l
(xg/yg)+l*(x1/y1);
=>
xg+l*x1
yg+l*y1
Jetzt erhalten wir den Punkt für den Marker, wenn wir einfach l einsetzen. Das kommt ganz darauf an wie breit das Auto ist, man kann aber testhalber einfach mal 2 einsetzen.
new Float:markerx = xg+2*x1;
new Float:markery = yg+2*y1;
new Float:markerz = zg; // ist jetzt die Höhe des Fahrersitzes.
Ich hoffe, dass das funktioniert, hab mir das mit der Drehmatrix auch grad erst angeschaut. Aber testen kann man es ja auf alle Fälle mal.
edit:
Ich hab das mal getestet und es funktioniert noch nicht ganz. Aber ich versuch das mal zu fixen. Der Marker wird auf jeden Fall beim Auto erstellt und verändert sich mit der Rotation des Fahrzeugs. Nur halt noch nicht hunderpro korrekt.