Meine Fragen zu 3D in GM:Studio

  • Win

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Meine Fragen zu 3D in GM:Studio

    Hallo :)

    In diesem Thread, werde ich nach und nach meine Fragen zu 3D Programmierung in GM:S stellen.
    Ich mache das, weil ich das Forum nicht mit Fragen "zu müllen" möchte.

    Hier sind auch schon ein paar Fragen:

    1) Wie kann ich die Kamera in der First Person Sicht nach links/rechts drehen ? (Bild dazu im Anhang)

    2) Ich habe die ganze Zeit überlegt wie man die Source engine für Models von Menschen nachmachen könnte (Animation und Physics).
    Da es schlecht mit Skeleton geht, könnte man doch theoretisch die Gliedmaßen in Modellen aufteilen. Beine, Arme, Körper und Kopf.
    Diese Teile teilt man dann wieder in 2 Modelle. Dann könnte man ein Skript schreiben wo man Bewegungsabläufe in z.B. eine
    Textdatei schreibt die ausgelesen wird. Dann könnte ein code z.B. so aussehen: move_arm_1(x,y,z,x_rotate,y_rotate,z_rotate)
    und der erste Teil vom arm wird dann mit "transform" modifiziert. (Ich hoffe ihr versteht was ich meine... sonst mach ich noch ein
    Bild dazu ^^). Würde das gut aussehen ? Und wie wäre die Performance wenn man z.B. 3 Charaktere hat mit je 10 -12 Modellen
    als Gliedmaßen ? Dadurch könnte man sich das animieren in Blender sparen und physics wie bei CS:S wären dann auch möglich
    (wenn jemand tot ist, das man die Arme usw. bewegt ...)


    3) Kann man mehrere Texturen kombinieren ? Also, wenn ich eine Person anschieße und Blut spritzt, dass ich die Textur von der
    Person so verändern kann (mit codes), das Blut an der Stelle erscheint, wo ich hingeschossen habe.
    Das wäre cool, wenn das gehen würde. Ich weiß, das man auch das model nehmen kann und mit dem einen Blutfleck drüber
    zeichnen lassen kann, aber das ist zu performance lastig.


    4) Wie funktionieren 3D surfaces in Studio und wie kann ich eins erstellen ?

    5) Wie kann ich am besten Motion Blur einbauen ohne DLL ? Ich hatte schon ein paar versuche
    die aber durch Performance Problemen in die hose gingen :/ Ich habe immer 3 Bilder aus der Surface genommen und die
    dann mit verschiedenen Alpha-Werten übereinander gelegt. Es hat funktioniert, nur hatte ich 20 fps ^^


    6) Schatten: Wie kann ich schatten wie in diesem Video einbauen ?
    youtube.com/watch?v=f0GP8HVRd-w
    Auch dort habe ich mich versucht aber einfach mal 0 hinbekommen... Man muss anscheinend Shader benutzen, wovon
    ich keine Ahnung habe und auch keine vernünftigen Tutorials gefunden habe.
    Hat jemand eine Idee oder ein Example/Tutorial für mich ? Es sollte einfach sein, sonst verstehe ich nur Bahnhof :D
    Sprich: Nicht zu complexe schatten, einfach nur den normalen Schatten ohne extra effekte oder sonst was. Er muss nicht
    einmal dynamisch sein.


    7) AA: Bei einem Video von LEWA habe ich gesehen wie er dank der Surface AA hinbekommen hat. Ich habe es auch versucht
    und wieder ein mal scheitert es ... Ich habe eine Surface erstellt die doppelt so groß ist wie mein Bildschirm (=3840x2160)
    und die dann durch surface strechet auf mein Bildschirm dargestellt (=0,0,1920,1080). Leider wurde nur 1/4 von meinem Bildschirm
    gefüllt und der rest war schwarz. Der AA-Effekt war da, aber leider war das Bild viel zu klein.
    Bilder
    • test.jpg

      271,58 kB, 1.920×1.080, 310 mal angesehen

    Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von Nico001 ()

  • 1) Wie kann ich die Kamera in der First Person Sicht nach links/rechts drehen ? (Bild dazu im Anhang)

    Durch das verändern des UP-Vektors in der 3D Projektion (xup,yup und zup) man kann mit ein wenig googeln nachlesen wie das funktioniert.
    (Oder du experimentiertst selbst mit den werten rum. Hab ich damals gemacht.)

    2) Ich habe die ganze Zeit überlegt wie man die Source engine für Models von Menschen nachmachen könnte (Animation und Physics).
    Da es schlecht mit Skeleton geht, könnte man doch theoretisch die Gliedmaßen in Modellen aufteilen. Beine, Arme, Körper und Kopf.
    Diese Teile teilt man dann wieder in 2 Modelle. Dann könnte man ein Skript schreiben wo man Bewegungsabläufe in z.B. eine
    Textdatei schreibt die ausgelesen wird. Dann könnte ein code z.B. so aussehen: move_arm_1(x,y,z,x_rotate,y_rotate,z_rotate)
    und der erste Teil vom arm wird dann mit "transform" modifiziert. (Ich hoffe ihr versteht was ich meine... sonst mach ich noch ein
    Bild dazu ^^). Würde das gut aussehen ? Und wie wäre die Performance wenn man z.B. 3 Charaktere hat mit je 10 -12 Modellen
    als Gliedmaßen ? Dadurch könnte man sich das animieren in Blender sparen und physics wie bei CS:S wären dann auch möglich
    (wenn jemand tot ist, das man die Arme usw. bewegt ...)


    Könnte man machen. Dazu müsstest du aber ein komplett eigenes Animationssystem schreiben. Du wirst dich da also (insbesondere wenn du Bones voneinander abhängig machen möchtest)
    etwas mit model rotationen und transformationen auseinander setzen müssen (und wie du diese d3d_... Funktionen miteinander kombinierst.)
    Das sind alles im Prinzip "vereinfachte" Matrix-calculationen.
    Das System was du beschrieben hat hat jedoch einen nachteil: Draw-calls. Jedes Bewegende Stück an deinem Modell (bzw. jeder "split" in deinem Modell)
    wäre ein eigener Draw-call den die CPU verarbeiten müsste. > Kann bei höheren Zahlen stark auf die Performance gehen.
    Ich weiss nicht ob du das System nur für deinen Charakter verwenden möchtest, oder ob allemöglichen NPCs animieren könntest.
    Nehmen wir einen "einfachen" Soldaten her:
    Wenn wir uns vorstellen dass der Rump 2 Draw-call braucht , jedes Bein 3 (ober-unterschenkel und fuß) und der Arm auch 3, + den Kopf (1 Draw-call), dann hat
    1 NPC schon alleine 2+3+3+3+3+1 = 15 Draw-calls. > Du wirst da ziemlich schnell die CPU auslasten.

    3) Kann man mehrere Texturen kombinieren ? Also, wenn ich eine Person anschieße und Blut spritzt, dass ich die Textur von der
    Person so verändern kann (mit codes), das Blut an der Stelle erscheint, wo ich hingeschossen habe.
    Das wäre cool, wenn das gehen würde. Ich weiß, das man auch das model nehmen kann und mit dem einen Blutfleck drüber
    zeichnen lassen kann, aber das ist zu performance lastig.

    Damit habe ich mich ehrlich gesagt selber noch nicht befasst. Du wirst da aber (wenn du es richtig machen möchtest) um etwas komplexere Mathematik nicht drumerum kommen.
    Letztendlich müssen Decals (wie z.B: Blut) in realtime erstellt und dann korrekt an der jeweiligen Stelle auf dem 3D Modell gemappt werden. (In kombination mit shadern)
    Habe mich damit aber noch nie auseinandergesetzt.
  • Danke für deine Antwort :)

    Bei Nr. 2 habe ich mir schon gedacht, dass es starke Nachteile bei der Performance haben wird.

    Nummero 1 funktioniert leider immer noch nicht. Ich habe gestern schon eine Stunde rumexperimentiert, aber da
    sich meine Kamera um die Z-Achse dreht, geht es nicht so, wie ich es will.

    Code:

    GML-Quellcode

    1. d3d_set_projection_ext(x,y,z+29, x+cos(direction*pi/180),y-sin(direction*pi/180),z+tan(degtorad(zdirection+global.recoil))+29, 0,0,1,obj_gun.anglezoom,view_wview[0]/view_hview[0],1,600)


    Der Up-Vektor Z ist auf 1. Den rest habe ich mal auf 1 gestellt, um zu sehen wie es aussieht. Je nach Richtung (Z-Achse) hatte ich auch den gewünschten view. Aber wie gesagt, nur bei einer bestimmten Richtung.
  • Nico001 schrieb:

    Der Up-Vektor Z ist auf 1. Den rest habe ich mal auf 1 gestellt, um zu sehen wie es aussieht. Je nach Richtung (Z-Achse) hatte ich auch den gewünschten view. Aber wie gesagt, nur bei einer bestimmten
    Richtung.


    Der Up vektor sollte ein Einheitsvektor sein. (Sprich: Eine gesamtlänge von 1 )
    Sprich: Wenn du auf der x achse den vektor erhöhst, musst du dazu die 1 auf der z-achse verringern.

    Ich bin mir nicht sicher ob der Code richtig ist, aber du könntest mal versuchen diese berechnung zu verwenden:

    GML-Quellcode

    1. zup = cos(degtorad(cam_rot));
    2. xup = sin(degtorad(obj_player.direction)) * sin(degtorad(cam_rot));
    3. yup = cos(degtorad(obj_player.direction)) * sin(degtorad(cam_rot));


    "obj_player.direction" ist die Richtung in welche die kamera schaut (die rotation der kamera um die z-achse). "cam_rot" ist die seitliche camera rotation/neigung.
    0 = keine neigung. Alles zwischen -90 und +90 rotiert die Kamera nach links und rechts.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von LEWA ()

  • Neue Fragen:

    Hier sind ein paar neue Fragen die sich in dieser Woche angesammelt haben:


    5) Wie kann ich am besten Motion Blur einbauen ohne DLL ? Ich hatte schon ein paar versuche
    die aber durch Performance Problemen in die hose gingen :/ Ich habe immer 3 Bilder aus der Surface genommen und die
    dann mit verschiedenen Alpha-Werten übereinander gelegt. Es hat funktioniert, nur hatte ich 20 fps ^^


    6) Schatten: Wie kann ich schatten wie in diesem Video einbauen ?
    youtube.com/watch?v=f0GP8HVRd-w
    Auch dort habe ich mich versucht aber einfach mal 0 hinbekommen... Man muss anscheinend Shader benutzen, wovon
    ich keine Ahnung habe und auch keine vernünftigen Tutorials gefunden habe.
    Hat jemand eine Idee oder ein Example/Tutorial für mich ? Es sollte einfach sein, sonst verstehe ich nur Bahnhof :D
    Sprich: Nicht zu complexe schatten, einfach nur den normalen Schatten ohne extra effekte oder sonst was. Er muss nicht
    einmal dynamisch sein.


    7) AA: Bei einem Video von LEWA habe ich gesehen wie er dank der Surface AA hinbekommen hat. Ich habe es auch versucht
    und wieder ein mal scheitert es ... Ich habe eine Surface erstellt die doppelt so groß ist wie mein Bildschirm (=3840x2160)
    und die dann durch surface strechet auf mein Bildschirm dargestellt (=0,0,1920,1080). Leider wurde nur 1/4 von meinem Bildschirm
    gefüllt und der rest war schwarz. Der AA-Effekt war da, aber leider war das Bild viel zu klein.


    Entweder ist es echt kompliziert, oder ich bin einfach zu blöde :headtouch: :D

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Nico001 ()

  • Ich werde dass mal einfach beantworten damit das Topic halbwegs als "erledigt" gelten kann.
    (und falls jemand darüber in der zukunft stolpert auch gleich die antworten parrat hat)

    5) Wie kann ich am besten Motion Blur einbauen ohne DLL ? Ich hatte schon ein paar versuche
    die aber durch Performance Problemen in die hose gingen :/ Ich habe immer 3 Bilder aus der Surface genommen und die
    dann mit verschiedenen Alpha-Werten übereinander gelegt. Es hat funktioniert, nur hatte ich 20 fps ^^

    Dies ist eine der möglichen technicken. Was man auch noch machen kann ist die Bewegungsrichtung der maus am bildschirm auszulesen und dementsprechend in entgegengesetzter Richtung den Frame-buffer (also die Surface)
    mehrere male mit abnehmenden Alpha-wert zu zeichnen.
    Performance sollte kein Problem sein, solange man auf einer Maschine mit Windows 7 oder drunter arbeitet. Windows 8 hat aus irgendeinem Grund extreme performanceeinbußen wenn es mit Surfaces handhabt.

    6) Schatten: Wie kann ich schatten wie in diesem Video einbauen ?
    youtube.com/watch?v=f0GP8HVRd-w
    Auch dort habe ich mich versucht aber einfach mal 0 hinbekommen... Man muss anscheinend Shader benutzen, wovon
    ich keine Ahnung habe und auch keine vernünftigen Tutorials gefunden habe.
    Hat jemand eine Idee oder ein Example/Tutorial für mich ? Es sollte einfach sein, sonst verstehe ich nur Bahnhof :D
    Sprich: Nicht zu complexe schatten, einfach nur den normalen Schatten ohne extra effekte oder sonst was. Er muss nicht
    einmal dynamisch sein.

    Dies funktioniert allesamt mit shadern. Die techick die hier verwendet wurde nennt sich "Shadowmapping".
    Der Source code zu diesem Shader (für GMS) ist bereits draußen. Hier ist der Link: Klick
    Frag mich allerdings nicht wie genau das funktioniert. Es wird dort durch das Multiplizieren verschiedener Projektionsmatrizen eine "Verzerrungsmatrix" errechnet welche dann anhand des Depthbuffers
    erkennen kann, welche Pixel am Bildschirm im Schatten sind und welche nicht.

    7) AA: Bei einem Video von LEWA habe ich gesehen wie er dank der Surface AA hinbekommen hat. Ich habe es auch versucht
    und wieder ein mal scheitert es ... Ich habe eine Surface erstellt die doppelt so groß ist wie mein Bildschirm (=3840x2160)
    und die dann durch surface strechet auf mein Bildschirm dargestellt (=0,0,1920,1080). Leider wurde nur 1/4 von meinem Bildschirm
    gefüllt und der rest war schwarz. Der AA-Effekt war da, aber leider war das Bild viel zu klein.

    Diese Art des Anti-Aliasings habe ich nur verwendet, da der interne AA Algorithmus in GM 8.1 mit Surfaces nicht kompaktibel war.
    Bei GM: Studio ist dies aber behoben worden. Rufe dort einfach "display_reset()" mit der jeweiligen AA stufe als Parameter auf um AA einzuschalten. Funktioniert soweit ich weiss auch mit Surfaces.
    Daher sollte man die von dir oben beschriebene Methode meiden da sie mittlerweile unnötig- und zusätzlich auch noch wesentlich performancelastiger ist als das interne AA.
  • 5) Gut, da werde ich dann einige Versuche starten. Danke!

    6) Das Example hatte bei mir enorme bugs und war sehr performance lastig. Ich habe das ganze jetzt mit Realtime
    shadows gemacht ?! Das ganze funktioniert so:
    Eine Surface nimmt alle 3D Objekte von oben auf.
    Dann wird der Hintergrund weg gemacht, die Objekte werden schwarz gefärbt und bekommen einen alpha wert.
    Diese Surface wird dann als "floor" leicht über den normalen "floor" dargestellt.

    7)
    Diese Art des Anti-Aliasings habe ich nur verwendet, da der interne AA Algorithmus in GM 8.1 mit Surfaces nicht kompaktibel war.
    Bei GM: Studio ist dies aber behoben worden. Rufe dort einfach "display_reset()" mit der jeweiligen AA stufe als Parameter auf um AA einzuschalten. Funktioniert soweit ich weiss auch mit Surfaces.
    Daher sollte man die von dir oben beschriebene Methode meiden da sie mittlerweile unnötig- und zusätzlich auch noch wesentlich performancelastiger ist als das interne AA.


    Funktioniert leider nicht :/ meine Surface wird dann falsch dargestellt, oder eine Fehlermeldung erscheint.

    Danke für die Antwort :)


    EDIT: Mir fällt gerade ein, das man eine Textur in ein Surface einpacken kann und z.B. Blutspritzer auch und das ganze dann
    auf ein Model zeichnen lassen kann. Das würde dann Frage 3 beantworten ^^
  • Benutzer online 1

    1 Besucher