Gedachte "Linie" Erstellen

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
  • Hi


    Iwie steh ich im moment auf dem Schlauch. Ich will eine gedachte Gerade erstellen, auf der ich einzelne punkte abfragen kann. Also ich möchte eine Funktion erstellen, die mithilfe der kamera-vektor funktionen die Coords auf einer gedachten Geraden wiedergibt.


    Mit dem Scripten habe ich kein problem, jedoch habe ich kein plan wie ich diese Rechnung machen soll, die dies verwirklicht. Kann mir da vielleicht einer helfen? Wäre wirklich nett :)


    MFG, Robdeflop®

  • Das ist ja Bestandteil der Vektorrechnung.Ziemlich Umfangreiches Thema,bin auch nicht mehr sehr sicher darin.Dennoch müsstes du so bspw Punkte erhalten die auf der Geraden liegen:
    new
    Float:fPktX,
    Float:fPktY,
    Float:fPktZ,


    Float:fX,
    Float:fY,
    Float:fZ,
    Float:fVecX,
    Float:fVecY,
    Float:fVecZ;
    GetPlayerPos(playerid,fX,fY,fZ);
    GetPlayerCameraFrontVector(playerid,fVecX,fVecY,fVecZ);
    // g-> (fX,fY,fZ) + r * (fVecX,fVecY,fVecZ)
    for(new r = 1 ; r < 10 ; r++) {
    fPktX = ( fX + ( r * fVecX ));
    fPktY = ( fY + ( r * fVecY ));
    fPktZ = ( fZ + ( r * fVecZ ));
    }
    Je nachdem wofür du es brauchst,würdest du so Punkte erhalten die von 1LE bis 10LE vor dem Spieler liegen.
    Wäre vorteilhafter man würde direkt überprüfen können ob ein Punkt auf einer Geraden liegt,aber das zu scripten ist glaubige Ich nicht so einfach.Mathematisch kein großer Aufwand mit Stift & Zettel, aber das zu scripten ist wieder etwas Anderes ;).

  • Hi


    Danke schonmal, werds gleich denke ich mal testen.
    Kann mir aber noch nicht so recht was draus reimen, kommt mir eher spanisch vor.
    Ich hab mal bei einem Youtube video sowas in der richtung gesehen. Dort wurde die Schussbahn mit ganz vielen pickups hintereinnander dargestellt. Ich kann dieses aber leider nichtmehr finden.


    Folgendes habe ich vor:


    Auf der Z-Achse vom Spieler (sozusagen die höhe vom spieler) will ich die Position abfragen, wo der Spieler hinzielt. Natürlich muss der Spieler dann etwas nach unten schauen.


    Diese Rechnung könnte etwas schwer werden :D Weil ich muss ja dann noch wissen mit welchem faktor (in deinem beispiel "r") ich die rechnung multiplizieren muss.
    Weiß da einer ein Rat? Oder gibts hier gute Mathematiker die mit 3D-Coordinatensystemen keine probleme haben?


    MFG, Robdeflop®


    EDIT:


    Um es einfacher auszudrücken:


    Ich muss also "nur" die X und Y position rausfinden. Die Höhe habe ich ja schon durch die spielerposition.


    Dann müsste es doch eigendlich gehen wenn ich einen Z-Bereich erstelle, also damit es nicht so genau auf der Z-Höhe sein muss, dann eine schleife verwende wie du Goldkiller, und dann für jeden punkt abfrage ob er in diesem Z-Bereich ist. Oder?

    Einmal editiert, zuletzt von Robdeflop ()

  • Das habe Ich ja auch geschrieben:

    Zitat

    Wäre vorteilhafter man würde direkt überprüfen können ob ein Punkt auf einer Geraden liegt,aber das zu scripten ist glaubige Ich nicht so einfach.Mathematisch kein großer Aufwand mit Stift & Zettel, aber das zu scripten ist wieder etwas Anderes ;).


    Hätte Ich dafür eine einfache Umsetzunge gefunden,hätte Ich sie selber schon für diverse Dinge benutzt.Mir fiel dazu auch nie eine einfache Lösung ein,
    hab auch so noch keine direkt gefunden.


    Zitat

    Ich hab mal bei einem Youtube video sowas in der richtung gesehen. Dort wurde die Schussbahn mit ganz vielen pickups hintereinnander dargestellt. Ich kann dieses aber leider nichtmehr finden.


    Da funktioniert es sicherlich,wenn Ich dich richtig verstehe,so wie Ich oben mit dem Code gezeigt habe.Da wird einfach für r was eingesetzt X-mal.


    Jetzt hast es geschafft mich trotzdem so zu verwirren,dass Ich nicht mehr ganz verstehe was du möchtest,besonders mit deinem Edit :p.

  • Hi


    Lol ok :D sry^^


    Also. Hier so wie es gehen soll:


    Ich ziehle in richtung boden. An dem Punkt wo die "Sichtlinie" (also die linie in die ich schaue) eine bestimmte Höhe/Z-Achse schneide, soll die X, Y und Z Position zurückgegeben werden.


    Wie das Funktionieren könnte, habe ich oben angeschnitten, werde aber mal eine Funktion erstellen, die funktionieren könnte. Ich werde die gleich mal erstellen und dir entweder per PM schicken oder hier im Thread posten. Dann haben wir beide was davon :)


    Funktion kommt in ca 10 minuten ;)


    MFG, Robdeflop®


    EDIT: Wurde leider n bissl später xD


    stock ZielAufBoden(playerid, &Float:zielX, &Float:zielY, &Float:zielZ)
    {
    new
    Float:fPktX,
    Float:fPktY,
    Float:fPktZ,


    Float:fX,
    Float:fY,
    Float:fZ,
    Float:fVecX,
    Float:fVecY,
    Float:fVecZ;

    GetPlayerPos(playerid,fX,fY,fZ);
    GetPlayerCameraFrontVector(playerid,fVecX,fVecY,fVecZ);
    // g-> (fX,fY,fZ) + r * (fVecX,fVecY,fVecZ)
    for(new r = 1 ; r < 100 ; r++)
    {
    fPktX = ( fX + ( r * fVecX ));
    fPktY = ( fY + ( r * fVecY ));
    fPktZ = ( fZ + ( r * fVecZ ));
    if(fPktZ <= fZ-1 && fPktZ >= fZ-3)
    {
    zielX = fPktX;
    zielY = fPktY;
    zielZ = fPktZ;
    return 1;
    }
    }
    return 0;
    }


    Das habe ich bis jetzt. Aber ich glaube da stimmt iwas noch nicht.
    Also es geht schonmal dass geprüft wird ob der Spieler auf die Z-Ebene zielt, die -1 und -2 unter dem spieler ist. Es wird auch was returnt, aber ich glaube dass ist noch nicht so richtig :/


    EDIT2: Wäre es nicht besser wenn man bei:
    fPktX = ( fX + ( r * fVecX ));
    fPktY = ( fY + ( r * fVecY ));
    fPktZ = ( fZ + ( r * fVecZ ));


    r addiert anstatt multipliziert?
    Wäre das ergebnis dann nicht genauer? oder irre ich mich?


    MFG, Robdeflop®

    2 Mal editiert, zuletzt von Robdeflop ()


  • Nein,das wird multipliziert:

    ( Wikipedia )
    Würde sowieso keinen Sinn machen wenn man das Addiert,denn das eine ist ein Ortvektor,das Andere ein Richtungsvektor. Wenn dich das wirklich interessiert schlag es bei Google nach,ist ein rießen Thema.


    Meinst du nicht,
    if(fPktZ <= fZ-1 && fPktZ >= fZ-3)
    könntest du durch
    if( fPktZ < fZ )
    ersetzen? Gibt dir auch den ersten Punkt,der unter der aktuellen Z-Position liegt.

  • Diese Abschussbahn für die Pickups wurde glaube ich mit folgender Funktion erstellt.


    GetXYInFrontOfPlayer(playerid, &Float:x, &Float:y, Float:distance)
    {
    new Float:a;
    GetPlayerPos(playerid, x, y, a);
    GetPlayerFacingAngle(playerid, a);
    if (GetPlayerVehicleID(playerid))
    {
    GetVehicleZAngle(GetPlayerVehicleID(playerid), a);
    }
    x += (distance * floatsin(-a, degrees));
    y += (distance * floatcos(-a, degrees));
    }


    Durch mehrfach Verwendung dieser Funktion sowie die Änderung der distance, kannst du eine Linie von deiner Blickrichtung aus erstellen.
    EDIT: "Linie" hinzugefügt.

  • Das wird dann wohl auf's Gleiche hinnaus kommen.
    Ist natürlich ein riesen Thema, schade das noch niemand eine Vektor Library geschrieben hat für PAWN :|.Selber hab Ich nur eine GetDistanceBetweenPointAndLinear() Funktion die auch noch funktioniert x).

  • Hi


    Erstmal danke für die "Nachhilfe" :D


    Ich vollgasidiot, das mit der abfrage, da hätte ich auch selber drauf kommen müssen -.-
    Genauso dass das multipliziert werden muss.


    Ich werd grad ma weitertüfteln und schauen obs dann richtig klappt :D


    Mir fällt auch grad der Satz des Pytaguras ein^^


    MFG, Robdeflop®


    EDIT:


    So, nun die fast richtige funktion :P


    stock ZielAufBoden(playerid, &Float:zielX, &Float:zielY, &Float:zielZ)
    {
    new
    Float:fPktX,
    Float:fPktY,
    Float:fPktZ,


    Float:fX,
    Float:fY,
    Float:fZ,
    Float:fVecX,
    Float:fVecY,
    Float:fVecZ;


    GetPlayerPos(playerid,fX,fY,fZ);
    GetPlayerCameraFrontVector(playerid,fVecX,fVecY,fVecZ);


    for(new r = 1 ; r < 1000 ; r++)
    {
    fPktX = ( fX + ( r * fVecX ));
    fPktY = ( fY + ( r * fVecY ));
    fPktZ = ( fZ + ( r * fVecZ ));
    if(fPktZ < fZ-10)
    {
    zielX = fPktX*0.9;
    zielY = fPktY*0.9;
    zielZ = fZ;
    return 1;
    }
    }
    return 0;
    }


    Das einzigste was mir aufgefallen ist was falsch ist, ist die Entfernung. Der Punkt ist vom Spieler weiter weg, als der Punkt wo man hinschaut. Sonst geht alles. Wie könnte man das fixxen?


    Und zu der Funktion mit GetXYInFrontOfPlayer. Da wird die Z-Achse ja nicht einbezogen. Ich überleg aber mal ein wenig rum, vielleicht komm ich von selbst drauf ^^


    Und schonmal vielen dank für die Hilfe :)


    MFG, Robdeflop®

    Einmal editiert, zuletzt von Robdeflop ()

  • Stimmt, Pythagoras ist keine schlechte Idee. wenn die Peds ihre Waffen alle gleich hoch halten, du diese Höhe irgendwie ermitteln kannst, zudem die Länge der Geraden zwischen Spieler und "Einschussloch" bekannt ist (kannste ja mit dem FrontVector-Zeug errechnen), dann kriegste ganz einfach die Länge der Hypotennuse, in diesem Fall die Gerade zwischen Waffe und Einschussloch.
    Edit: Beim genaueren Durchlesen des ganzen Threads bin ich jetzt bezüglich deines Vorhabens auch verwirrt. Kann sein, dass ich iwie was anderes denke... oO

  • Hi


    Hab meinen post über dir (maddin) noch editiert :)


    Also mein Vorhaben ist ganz einfach die Position auf der Z-Achse des Spielers herauszufinden, wo gerade hingezielt wird. Wofür das ist. Wofür ich das verwende erfahrt ihr NOCH nicht. Erst wenn es fertig/ fast fertig ist.


    MFG, Robdeflop®

  • Hi


    Ich idiot -.- malwieder xD


    Nein, nicht die höhe sah falsch aus. Die Position sah einfach weiter weg aus also da wo man hinzielt.


    Es stimmt alles. Es sah nur falsch aus.


    Die X und Y Position wird ja auf der Z Achse vom Spieler -10!!!!! genommen. Die Z-Achse wird dann aber durch die höhe vom Spieler ersetzt. So sieht es dann ja aus (wenn man z.B. nen textdraw an die position setzen würde) als wäre es weiter weg, als man auf den boden schaut.
    Ich hoffe ihr versteht was ich meine :D zur not zeichne ich es auf :)


    MFG, Robdeflop®

  • Zitat

    Die X und Y Position wird ja auf der Z Achse vom Spieler -10!!!!!


    Wieso denn Z -10 ? Du wolltest doch die Koordinate die unter der aktuellen Z Position des Spielers liegt.Da reicht es doch dass es einfach kleiner als Z-Pos des Spielers ist.

    Zitat

    Ich hoffe ihr versteht was ich meine :D zur not zeichne ich es auf :)


    Kannst es ja trotzdem mal aufzeichnen ;).

  • Hi


    Cool, danke, das sin die vids^^ Aber die funktion ist ja schon fertig xD Trotzdem danke :)


    So, hier die Skizze:



    Wenn ich z.B. ein 3DTextLabel auf der position X und Y (linie wo sich blickrichtung und Gedachte linie schneiden, senkrecht) erstelle, ist das Objekt ja nicht dort wo die sichtlinie den boden schneidet^^ Also dachte ich erst es geht nicht richtig. Versteht ihr jetzt? :D


    Ich muss aber auch auf jeden fall diesen Z bereich UNTERM spieler machen, da sonst immer die Position des spielers returnt werden würde. Ist aber auch logisch oda? :D Ich hab jetzt nicht -10 sondern eine kleinere zahl genommen, so dass es so ziemlich passt ;)


    MFG, Robdeflop®