Checkpoint rechts neben Fahrzeug

Wichtiger Hinweis: Bitte ändert nicht manuell die Schriftfarbe auf schwarz sondern belasst es bei der Standardeinstellung. Somit tragt ihr dazu bei dass euer Text auch bei Verwendung unseren dunklen Forenstils noch lesbar ist!

Tipp: Ihr wollt längere Codeausschnitte oder Logfiles bereitstellen? Benutzt unseren eigenen PasteBin-Dienst Link
  • Guten Tag,


    Ich möchte das wenn ich z.B ein Befehl eingebe, dass ein Checkpoint rechts neben dem Fahrzeug erscheint, indem man gerade sitzt.
    Was aber wenn das Fahrzeug in die andere Richtung zeigt? Dann erscheint der Checkpoint ja links vom Fahrzeug. Wie kann ich das so machen, dass
    der CP immer rechts neben dem Fahrzeug erscheint, egal in welche Richtung es grade zeigt?

  • Nein... Ich will nicht das er sich Update, ich möchte das der Checkpoint IMMER egal ob er in Richtung Nord Süd etc. steht, dass der CP immer Rechts vom Fahrzeug gesetzt wird ( Oder Links es geht ums Prinzip ).


    //Edit: Ich versuche es mit diesen Bilder ein bisschen zu verdeutlichen:
    sa-mp-007.png
    sa-mp-005.png
    sa-mp-004.png
    sa-mp-006.png


    Es soll also immer an einer Stelle neben dem Auto sein, egal wie die Rotation ist.

  • Timer erstellen der alle paar Sekuden den Checkpoint neu setzt


    Es geht mir garnicht darum -.- Ich möchte das der Checkpoint Immer links ist! Wenn ich die Position von dem Fahrzeug auslese und ein CP setzte wo ich z.B x-2 nehme, dann passt das vielleicht wenn ich in richtung
    Norden stehe, aber wenn ich mich um 90 Grad drehe, passt das nichtmehr

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen
  • 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 :D )


    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.

    Einmal editiert, zuletzt von Hagi ()

  • Viel einfacher und kürzer (Habs noch nicht getestet):
    stock SetPlayerCheckpointForVehicle(playerid, vehicleid)
    {
    new Float:x, Float:y, Float:z, Float:a;


    GetVehiclePos(vehicleid, x, y, z);
    GetVehicleZAngle(vehicleid, a + 90.0);


    x += (2.5 * floatsin(-a, degrees));
    y += (2.5 * floatcos(-a, degrees));


    SetPlayerCheckpoint(playerid, x, y, z, 2.5);
    }

    Windows ist wie ein U-Boot, öffnest du ein Fenster hast du ein Problem.

  • Hagi: Klappt nicht :( Der CP passt sich nicht nach dem Angle an. Aber trozdem Danke für die Mühe
    @[SAS]Dominator: Danke das klappt :D


    //Edit: Kann man es ohne größere Probleme auch machen das der CP hinter dem Fahrzeug angezeigt wird?


    Ja, kann man. Schau hier:


    stock SetPlayerCheckpointForVehicle(playerid, vehicleid)
    {
    new Float:x, Float:y, Float:z, Float:a;


    GetVehiclePos(vehicleid, x, y, z);
    GetVehicleZAngle(vehicleid, a + 180.0);


    x += (2.5 * floatsin(-a, degrees));
    y += (2.5 * floatcos(-a, degrees));


    SetPlayerCheckpoint(playerid, x, y, z, 3.5;
    }

    Windows ist wie ein U-Boot, öffnest du ein Fenster hast du ein Problem.

  • Tread zwar schon erledigt, das hier möchte ich dennoch gerne anmerken:


    Tatächlich kann man das so kurz machen. Das Problem daran ist nur, dass man so von der Fahrzeugmitte ausgeht und das Marker rechts von der Fahrzeugmitte erscheint und nicht von der Beifahrertür (bzw. Beifahrersitz).


    Wenn ich jetzt aber mal meinen Code für die Position des Beifahrersitzes nehme:


    new Float:x,Float:y,Float:z;
    GetVehiclePos(vehicleid,x,y,z);
    new Float:angle;
    GetVehicleZAngle(vehicleid,angle);
    new Float:offx,Float:offy,Float:offz;
    GetVehicleModelInfo(GetVehicleModel(vehicleid),VEHICLE_MODEL_INFO_FRONTSEAT, offx, offy, offz);
    offx = offx*-1;
    offy = offy*1;
    new Float:xg = x+offx;
    new Float:yg = y+offy;
    new Float:zg = z+offz;
    angle = angle+90.0;


    und diese Werte in deinen Code einsetze:


    xg += (2.5 * floatsin(-angle, degrees));
    yg += (2.5 * floatcos(-angle, degrees));


    SetPlayerCheckpoint(playerid, xg, yg, z, 3.5);


    Dann wird der Marker in Abhängigkeit vom Beifahrersitz erstellt. Zumindest in der Theorie.
    Das Problem ist nur, dass ich für den OffSet des Fahrersitzes nach:


    GetVehicleModelInfo(GetVehicleModel(vehicleid),VEHICLE_MODEL_INFO_FRONTSEAT, offx, offy, offz);
    folgende Werte im Test erhalten habe:

    Code
    0.540000:-0.239999


    Wenn man das mal in ein Koordinatensystem einträgt ergeben die OffSetWerte von der Fahrzeugmitte gesehen jedoch den Beifahrersitz, warum auch immer. Demnach kann man sich das mit den Vektoren zur Berechnung des Beifahrersitzes an dieser Stelle schenken und direkt mit den offset Werten rechnen.



    new Float:x,Float:y,Float:z;
    GetVehiclePos(vehicleid,x,y,z);
    new Float:offx,Float:offy,Float:offz;
    GetVehicleModelInfo(GetVehicleModel(vehicleid),VEHICLE_MODEL_INFO_FRONTSEAT, offx, offy, offz);
    new Float:angle;
    GetVehicleZAngle(vehicleid,angle);
    angle = angle+90.0+180.0;


    offx = x+offx;
    offy = y+offy;


    offx += (2.5 * floatsin(-angle, degrees));
    offy += (2.5 * floatcos(-angle, degrees));


    SetPlayerCheckpoint(playerid, offx,offy,z, 3.5);


    Habs getestet und es funktioniert. Dar Marker wird in Abhängigkeit vom Sitz erstellt.

    Einmal editiert, zuletzt von Hagi ()