Feste Waffenstreuung absolut zur Bildschirmmitte

  • Feste Waffenstreuung absolut zur Bildschirmmitte

    Hallo zusammen,

    als allererstes muss ich mal sagen, dass ich sehr froh über dieses Forum bin. Mein Englisch ist nicht das schlechteste, aber wenn es dann so in's technische geht komme ich an meine Grenzen.


    - UE 4.18.2
    - Windows OS, First Person Shooter Template,
    - Bei der Standardwaffe habe ich das Projektil entfernt, LineTrace wird verwendet
    - Es gibt noch keinen Waffenrückstoß und dieser wird später auch keinen Einfluss auf das Schussbild haben. -> Beim Schießen zuckt derzeit nix und das soll auch so sein.


    Ich habe vor wenigen Wochen angefangen mich mit der UE4 zu beschäftigen, weil ich meinem Entwickler soweit mir das möglich ist helfen will. Bisher habe ich nur als Betatester fungiert und bin was das Entwickeln selbst angeht ziemlich unbelastet. C++ Kenntnisse habe ich absolut keine, dafür weiss ich ziemlich genau, wie das Ergebnis später mal sein soll und welche Features ich brauche.
    Da ich in der Unreal Engine Logikschaltungen ohne C++-Kenntnisse zusammensetzen kann konzentriere ich mich darauf, optischen Kontent werde ich wohl nicht herstellen.

    Ziel ist es eine Waffenlogik (und ein festes Schussbild) zu erstellen, die ich umfangreich einstellen kann. Momentan hänge ich an dem Problem, dass ich den Linetrace zwar nach jedem Schuss an die vorgesehene Stelle bekomme, das aber nur in Worldrotation X-Richtung richtig funktioniert. Drehe ich den Player um 180°(also nach hinten), ist das Schussbild auf den Kopf gestellt.

    Das Bild "graph1" zeigt den Teil der Waffenlogik, der Start - und Endpunkt des LineTrace festlegt, sowie je eine Wert für den vertikalen und den horizontalen Versatz (absolut zur Bildschirmmitte) einfließen lässt.
    Nach dem Linetrace kommt ein Multigate, wo nach jedem Schuss der Wert der Variablen (vertical & horizontal bullet climb) neu gesetzt werden ("graph2" übersichtshalber).
    Davor kommt die derzeit vorhandene Waffenlogik, die funktioniert wie sie soll und erst nach der Lösung des aktuellen Problems erweitert wird.


    Meine Frage ist wie bekomme ich das hin, dass das Schussbild immer wie in X+ Richtung aussieht, egal wohin ich schaue und schieße?


    Ich danke schonmal für die geopferte Zeit und wünsche einen schönen Abend.
    Bilder
    • Schussbild Worldrotation X+.png

      945,73 kB, 1.936×1.056, 54 mal angesehen
    • Schussbild Worldrotation X-.png

      946,99 kB, 1.936×1.056, 38 mal angesehen
    • Schussbild Worldrotation Y-.png

      958,41 kB, 1.936×1.056, 35 mal angesehen
    • graph1.png

      454,77 kB, 1.928×1.048, 81 mal angesehen
    • graph2.png

      669,72 kB, 1.928×1.048, 96 mal angesehen
  • Ich glaube das Problem liegt irgendwoim Bullet climb. Wie du siehst hast du in die eine Richtung genau das umgekehrte Bild wie in der anderen. Wenn du dich im Spiel um 180 Grad drehst dann drehst du dich um die Z Achse, also sagen wir mal von 0 auf -180 grad. Das wird hoffentlich nicht von deiner Bullet Climb funktion geprüft (Du hast ja den Line Trace und wirfst ja die koordinaten des Hits zurück!!!).

    Sprich - was sich ändert wenn du dich um 180 grad drehst und auf die gegenüberliegende Wand schiesst sind die X und Y Koordinaten. Sagen wir mal bei einem perfekt Viereckigen Raum ist die Ecke im Nordosten X100, Y100 und die Ecke im Südwesten x -100, y -100.

    Deine Bullet Climb braucht ja die X Y und Z Koordinaten (Wobei sich Z nicht ändert wenn du nicht höher oder tiefer zielst) um zu wissen wo der Schuss hingeht. Das klappt beim initialen Schuß. Der eigentliche Climb scheint aber einen rechenfehler zu haben.


    Deine PrintScreen debugging Ausgabe ist nicht so nützlich - versuch mal zumindest bei 3 oder 4 signifikaten bullets (LineTrace, ganz oben, ganz links, ganz rechts) aus deinem Multigate die XY und Z werte auszugeben, das dürfte den rechenfehler schon eher zeigen. Ich schätze mal es ist sowas in der Art "Wenn Y 100 ist geht es nach oben, wenn Y -100 ist geht es nach unten" oder so. Vermultich multiplizierst du irgendwo mit X oder Y und wenn dann X oder y einen negativen wert haben kommt was anderes raus als positiv, also offensichtlich das exakte Gegenteil. Sowas in der Richtung...
  • Hallo kyodai und danke für Deine Antwort.

    Die Werte für beide Bullet-Climb Variablen sind für jeden Schuss festgelegt und werden per Multigate & Set-Funktion für den nächsten Schuss entsprechend gesetzt.
    Die aktuelle Blickrichtung der Camera wird nicht geprüft, sondern nur für Anfangs - und Endpunkt des Linetrace verwendet (siehe "graph1").
    Sie (Bullet-Climb) verändern
    lediglich den Vektor für den LineTrace absolut (nicht inkremental) zur
    Bildschirmmitte, indem sie zum aktuellen Vektor addiert werden. Das
    betrifft aber nur die Y und Z-Achse, es wird nichts um die X-Achse
    rotiert.


    kyodai schrieb:


    Vermultich multiplizierst du irgendwo mit X oder Y und wenn dann X oder y einen negativen wert haben kommt was anderes raus als positiv, also offensichtlich das exakte Gegenteil. Sowas in der Richtung...
    Ja, wenn ich mir den Forwardvektor anzeigen lasse und nach hinten schaue sind X und Y vertauscht, deshalb ist sicherlich das Schussbild auf beiden Achsen gespiegelt. Die Frage ist wie ich das umgehe.
    In dem Bereich bin ich noch nicht durchgestiegen und ich habe auch noch keine wirklich brauchbare Quelle gefunden, die das gut erklärt und in die Tiefe geht. Die UE4 Doku ist da leider auch recht oberflächlich.
  • das problem liegt bei GetWorldLocation und GetForwardVector
    durch getworld bekommste deine position x.y.z, zb 1.1.1
    diese x.y.z läst du mit GetForwardVector x addieren. zb 1= 2.1.1
    wenn du jetzt nach hinten schaust ist -x also -1 und du hast 0.1.1 wodurch dein bild umgedreht ist. baue nach GetForwardVector ein check ein ob die Return Value - ist und wandel die fals es so ist um.
    was machst du jetzt aber wenn deine GetworldLocation -1.1.1 ist ? dann musst du nach hinten schauen damit es richtig rum angezeigt wird. und nach vorne schauen musst du umwandeln,

    also musst du 2 checks einbauen,
    wenn GetWorldLocation gleich + mach aus -GetForwardVector ein +

    wenn GetWorldLocation gleich - mach aus +GetForwardVector ein -


    So sollte dein bluprint in etwa aussehen (rotate vector ist jeweils das gleiche ziele

    [if GetWorldLocation + ] [if GetForwardVector +] [ROTATE]
    [if GetWorldLocation + ] [ifnot GetForwardVector +] [convert GetForwardVector to + ] [ VECTOR]

    [ifnot GetWorldLocation +] [if GetForwardVector -] [ROTATE]
    [ifnot GetWorldLocation + ] [ifnot GetForwardVector -] [convert GetForwardVector to -] [ VECTOR]

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von WarsheepGER ()

  • Guten Abend Warsheep,

    erstmal danke für die Antwort.

    Ich habe den Output-Value von GetForwardVector gesplitet und jeweils ein "Absolute" drangehängt. Wenn ich Dich richtig verstanden habe sollen an dieser Stelle alle negativen Werte (immer) in positive geändert werden.
    Weiter bin ich noch nicht und das Schussbild geht momentan nur noch in +X-Richtung und +Y-Richtung. In Y-Richtung ist es noch so verkorkst wie anfangs, da wurde ja noch nichts geändert (kein Anstieg des Schussbildes in Z-Richtung, X+Y funktioniert).


    Meine Fragen:

    Wenn ich die WorldLocation oder den ForwardVector prüfen soll, sind damit jeweils die einzelnen Floats gemeint?
    --> Falls ja sollen dann nur die Values mit den entsprechenden Vorzeichen geändert werden oder alle?

    Diese Values zu prüfen und ggf. zu negieren ist kein Problem, aber was hat es mit dem Rotate und Vector (groß & gelb in Deiner Antwort) auf sich?


    Ich wäre Dir sehr dankbar, wenn Du da nochmal ins Detail gehen könntest.
  • Nein nicht immer, wenn du eine negative GetWorldLocation hast muss die GetForwardVector negativ sein.
    Wenn die location positiv ist muss der vector positiv sein. Damit dein abbild vorne und hinten immer gleich ist.

    Mit links und rechts hatte ich garnicht gesehen das dort auch ein falsches schussbild entsteht.
    Ich tippe jetzt einfach mal darauf das GetForwardVector nicht nur eine variable übergibt sondern auch eine postion(x.y.z) und deshalb das schussbild liegend ist. Ich dachte es wird nur eine Variable x ubertragen. Was jetzt beim drüber nachdenken aber auch schwachsinn ist weil wenn man seitlich 90°schaut ist die x achse ja 0
    Dementsprechend musst du die seitlich y in x umwandeln umwandeln.

    Oder irgendwie so.

    Das ist aber nur eine Vermutung, am besten mal die GetForwardVector auslesen und zu der position xyz addieren und dann beide anzeigen lassen. Am besten in alle 4 Richtungen. Dann weißt du wasn wann wo abgezogen bzw hinzugerechnet wird und warum dein schussbild liegend oder gar falschrum ist. Und auch hier daran denken das die position xyz auch negativ sein können und dementsprechend die werte für das schussbild negativ sein müssen.

    Also kurz gesagt wenn GetWorldLocation positiv ist muss GetForwardVector auch positiv sein und wenn die location negativ ist muss der vector auch negativ sein. Oder du wandelst dann beide in Positive werte um.


    Zu den gelben rotate vector ist nichts weiter zu sagen. Ich habe nur textlich versucht die bluprints von dir nachzubauen und dass war das wo alle (if ifnot) vergleiche bei deinen bluprint vorgesetzt werden sollten.

    Da ich gerade(bei der vorigen Antwort) auf arbeit bin kann ich da eher weniger verschaulichen. Gut wäre es wenn ich mal heime bin und du zeit hast. Dann könnte ich dir besser helfen und das problem eher lösen.

    Hoffe habe jetzt nicht zu viel wirrendes zeug geschrieben :D
  • Es werden mehrere Schüsse abgegeben? Also so wie das Schrot bei einer Pumpgun? Und jetzt willst du ermitteln, was jedes einzelne Schrotkorn der Pumpgun getroffen hat? oder ist das eher so gemeint, dass es sich um eine Art zufälligen Treffer handelt, also eine generelle Unsicherheit bei einer Waffe? Was soll denn das Ergebnis sein?

    Auch wenn mir die Aufgabe noch nicht ganz klar ist, ist die Rotation generell falsch an der Stelle, denn was du auf jeden Fall willst, ist die Mehrfache Ausführung eines Linetrace. Also entweder als generelle Waffenstreuung oder als Schrotflinte. Hierfür ist aber die Rotation in Verbindung mit dem Linetrace nicht richtig, weil wir hier von Vectormathematik sprechen. Was du willst, ist ein genereller Versatz des Endpunktes des LineTrace.

    Beispiel: Auf 10m soll deine Waffe eine Unsicherheit von sagen wir 0,5m aufweisen. Also schießt du auf ein Ziel in 10m Entfernung, dann besteht die Möglichkeit jeweils 0,5m in jede Richtung "daneben" zu schießen.

    Der Aufbau ist also ein ForLoop (Anzahl der Streuungspunkte) und dann ein Versatz Horizontal und Vertikal im Endpunkt. Jetzt wird das LineTrace (ForLoop) so oft ausgeführt, wie du es einstellst, sagen wir also 10 mal. Den Versatz kannst du beispielsweise über ein RandomFloatInRange setzen und zum Endpunkt hinzufügen. Drückst du jetzt die Maustaste, dann wird dein ForLoop ausgeführt und ermittelt alle Treffer also hier 10 mal und speichert sie in eine Array ab.

    Die Logik ist für eine Waffenstreuung die selbe wie für eine Pumpgun. Natürlich musst du dich noch bei der Waffenstreuung für einen der Werte des LineTrace entscheiden (am besten Random), da nur eine Kugel fliegt. Bei der Pumpgun kannst du alle Schrotkugeln auswerten und natürlich auch mehrere Objekte treffen. Eine Rotation ist aufgrund des Vektor irrelevant.
  • Hallo Annubis.

    Es soll ein erlernbares (festes) Schussbild für ein Sturmgewehr werden. Das Bild "Schussbild Worldrotation X+" zeigt das entstandene Schussbild nach 30 Schuss Dauerfeuer ohne händische Kompensation durch eine Mausbewegung.
    Bezogen auf das Schussbild sind Random-Werte absolut unerwünscht und das Schussbild soll aus dem Crosshair hinauslaufen (können).

    Ich habe vor das so zu basteln, dass das Crosshair die ersten 2 oder 3 Schüsse mit nach oben wandert. Vermutlich lasse ich diese ersten Schüsse jeweils mitten ins Crosshair gehen und nicht nur den ersten. Der Viewkick simuliert dann (nach diese 3 Schuss) weiter den Rückstoß, bleibt aber auf seiner aktuellen Höhe, während die Schüsse immer weiter nach oben gehen (ähnlich cstrike, aber halt gänzlich ohne jede Randomness).
    Ich hatte dieses Schussbild schonmal mit der AddControllerPitch / Yaw gebastelt was auch funktioniert hat, aber ich will nicht, dass der Viewport so weit nach oben getrieben wird.

    Ja, ich will den Endpunkt der LineTraces versetzen und das wenn möglich (beim jeweiligen LineTrace) absolut zum aktuellen Bildschirmmittelpunkt (wo das Crosshair sitzt). Absolut soll die Trefferpunktlage deshalb sein, damit ich einen bestimmten Schuss (z.B. Schuss Nr. 20) einfach an die gewünschte Stelle schieben kann, ohne die nachfolgenden Schüsse zu beeinflussen.

    Gruß
  • Soweit ich weiss feuert der ForLoop nach einem Eingangsimpuls so oft einen Ausgangsimpuls wie man es eingestellt hat und das so schnell wie möglich.

    Ich verstehe nicht ganz wie ich den ForLoop einsetzen soll. Der ForLoop soll sicherlich vor den Linetrace, aber da würde er den einzelnen Impuls ja nur vervielfältigen. Für Schrotflinten leuchtet mir das ein und wird sicherlich auch so eingebaut wenn die dran sind, aber für ein Sturmgewehr mit einer bestimmten Feuerrate?
  • den Feuerstoß nennt man Burst und besteht aus 3-5 Schuss pro Mausklick.
    Vollautomatisch schießt das ganze Magazin leer wen die Maus gedrückt ist.
    Halbautomatik macht 1Schuss pro Klick.

    Mich wundert gerade das mein Beitrag von vor ein paar tagen garnicht da ist, hatte mich mit TBn einen Abend unterhalten und die Sache mal auseinandergenommen, er will für alle schussarten(Pistole,Schrott,Maschinengewehr) ein vordefiniertes Schussbild haben welches man erlernen kann , das gab es mal in CSS oder Half Life .
    Was wir den Abend Rausgefunden haben ist das sein Code mit GetForwardVector nicht funktionieren kann da der nur die x achse annimmt, er muss GetRightVector und GetUpVector mit reinnehmen, jedoch haben wir das den Abend nicht so ganz hinbekommen .
  • Ich werde da bestimmte Werte gegenrechnen müssen, damit das Schussbild nicht mehr verzerrt wird. Am Wochenende geht's da weiter. Unter der Woche kann ich abends nur noch im Schrittempo denken :D.

    @WarsheepGER: Du hast sicherlich recht, dass das auch ein Vorzeichenfehler ist, gerade wenn man nach hinten schaut und das Schussbild auf dem Kopf steht. Ursprünglich dachte ich es wäre horizontal UND vertikal gespiegelt, es stellte sich aber heraus, dass es nur hoizontal gespiegelt war.
    Es spielt aber auch noch etwas anderes mit hinein, denn wenn ich nach rechts & unten schaue und schieße, steht das Schussbild in Richtung X+ (WorldRotation) schief.

    Die Tage hatte ich nochmal ein paar Stunden nach Lösungen gesucht, aber selbst im englischspracheigen Bereich war da nichts zu finden. Scheinbar bin ich der einzige Assi, der das unbedingt so haben will.
    Egal wird schon :).

    Schönen Abend
  • So, hab's hinbekommen und glücklicherweise ohne herumgefrickel mit Korrekturwerten. Es hat eine Weile gedauert, bis ich das nötige Wissen aus Analytischer Geometrie und UE4 gefunden und verstanden habe.
    Die beiden Multiplikator-Nodes nach Vertical - und HorizontalBulletClimb dienen mir aktuell zum Skalieren des Schussbildes. Ich werde die später entfernen und gegen entsprechend hohe Werte in den Settern der beiden BulletClimb-Variablen ersetzen.

    Problem gelöst.

    Gruß und schönes Restwochenende.
    Bilder
    • 1.png

      449,6 kB, 1.928×1.048, 19 mal angesehen
Unreal®, Unreal Engine, the circle-U logo and the Powered by Unreal Engine logo are trademarks or registered trademarks of Epic Games, Inc. in the United States and elsewhere.