3D Alpha

  • GM 7

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

  • Hi, Leute,

    vielleicht hab ihr ja das hier gesehen. Hier hatte ich ein Problem, dass ich Objekte, die nach der Wand, die transparent wird erstellt wurden nicht durchsehen konnte. Aber dieses Problem konnte ich mit der Depth lösen. Nun hab ich aber ein paar weiter Probleme mit dem Alpha. Sie sind zwar nur klein und nicht so besonders störend, aber ich hätte sie trotzdem gerne gefixt.

    Würde ein

    GML-Quellcode

    1. with (all) depth = 1;
    2. depth = 0;
    3. obj_camera.depth = 100;
    4. //Draw Code
    5. with (all) depth = 0;
    6. obj_camera.depth = 100;

    in jedem Draw Event helfen?

    Bitte antwortet :)

    Danke im Voraus,
    Lightning the Hedgehog
    :| < Hallo. Nein ich bin nicht die Signatur, ich putze hier nur.
  • Nein, es geht so nicht. Denn der depthwert wird, logischer weise, nachdem alle Events aller Instanzen ausgeführt wurde, geändert. Da der Depthwert ja die Reihenfolge der Ausführungen beeinflusst.

    Alternativen: ich mache immer das Drawevent eines Objektes als Script. (Wenn es um 3D geht). Und dann habe ich ein Objekt, dass ausschließlich für das drawen zuständig ist. Das kann dann die Scripte in der gewünschten Reihenfolge aufrufen und auch diese Reihenfolge dynamisch ändern.

    Eine weiter alternative wäre es, die Drawevents manuell zu steuern. Dafür musst du erst ein mal das automatische ausführen des Drawevents entfernen. set_automatic_draw(false); Und jetzt dann mit event_perform(); aufrufen, wenn du findest es soll aufgerufen werden. Danach dann screen_refresh(); hinterher schmeißen, damit das gedrawte auch auf dem Schirm zu sehen ist. Wie du siehst, ist das Drawevent eigentlich nur ein ganz normales Stepevent, dass bloß als allerletztes aufgerufen wird und den Screen nach dem Event "refreshd".

    Ich finde die erste Lösung deutlich besser, da sie übersichtlicher ist und nicht so.. ich sag mal geschlampt ist.

    MfG SDX
  • Danke für deine Antwort :)

    Also bräucht ich da für jedes Objekt, das etwas drawt ein Skript? Und brauch ich da überhaupt noch die Depth?
    :| < Hallo. Nein ich bin nicht die Signatur, ich putze hier nur.
  • Natürlich braucht mal noch die Depth, da diese auch die Reihenfolge der anderen Events bestimmt. (Zb auch das Stepevent)

    Und genau: Du legst einfach für jedes Object, dass im Moment etwas mit dem drawen zu tun hat, einen Script an. In diesen Script packst du den Inhalt des jeweiligen objects. Zb scr_draw_obj_foo(), scr_draw_obj_bar(), scr_draw_obj_buz()..

    Natürlich dürfen die Objekte dann kein kein drawevent mehr haben. Dann kannst du, in einem drawevent eines anderen Objectes, diese Scripte ausführen. In der Reihenfolge, wie du es nun brauchst. Also, die die normal eine sehr hohe Depth bekommen hätten, werden zuerst ausgeführt. Vergiss aber bitte nicht, die variablen in den drawscripten anzupassen. Also was vorher einfach "varibable" war, muss zu "das_object_oder_instance_zu_dem_ich_gehoere.variable" werden.

    Soetwas ist natürlich ein großer eingriff in dein Projekt, daher sollte man mit so etwas in einem frühen stadium oder gar von anfang an anfangen.

    MfG SDX
  • Ja, mein Projekt ist schon ziemlich weit fortgeschritten, aber wenn das hilft dann mach ich das so rein. Aber ist das dann eigentlich nicht einfach ein Ersatz für die Depth? Ich will ja, das sich die transparenten Objekte mit dem dahinterliegenden vermischen; ist das da schon der Fall?
    :| < Hallo. Nein ich bin nicht die Signatur, ich putze hier nur.
  • Ich verstehe nicht ganz, was du mit vermischen meinst, aber wohl eher jein..

    Ich versuche mal ein ASCII Art Beispiel

    Quellcode

    1. halbtransparente fläche 1. halbtransparente fläche 2.
    2. | |
    3. | |
    4. | Kamera1 | -> | | <- | Kamera2 |
    5. | |
    6. | |
    7. zuerst gedrawt als zweites gedrawt


    Es kann egal was ist, nur eine der Kameras beide Flächen anzeigen. Dies resultiert ganz einfach aus dem genutzten Renderer, und ist eine art Grundsätzlichkeit. Aber, die Möglichkeit die du jetzt durch die Nutzung von dem von mir soeben genannten hast, ist, dass wenn du den Winkel änderst, auch die Reihenfolge der draws änderst. Um beim Ascii Beispiel zu bleiben: Jetzt wird nur alles "korrekt" (so wie der Mensch es eigentlich erwartet) angezeigt, wenn man durch Kamera2 guckt. Wenn man nun durch Kamera1 guckt, kannst du einfach die Reihenfolge der Flächen ändern. Also, dass die Fläche, die am nächsten zur Kamera ist, als letztes gedrawt wird. Da der GM nicht unmittelbar die Möglichkeit bietet nur einzelne Flächen gesteuert zu drawen ( wäre durch diesedll theoretisch möglich ) musst du halt Modell für Modell drawen. Der einzige Nachteil ist, dass mehrere transparente Flächen in einem Modell eventuell nicht so aussehen, "wie der Mensch es erwartet".

    MfG SDX

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

  • Danke für die Antwort, so langsam versteh ich das! Aber könnte man das nicht durch die Depth regeln?
    :| < Hallo. Nein ich bin nicht die Signatur, ich putze hier nur.
  • Naja, ich glaube kaum, dass das auch in GM7 funktioniert, denn sonst hätte das SDX sicher erwähnt... Trotzdem danke.
    :| < Hallo. Nein ich bin nicht die Signatur, ich putze hier nur.
  • Lightning the Hedgehog schrieb:

    Aber könnte man das nicht durch die Depth regeln?


    Jein: man kann, nur die Änderungen würden erst nächsten Step eintreten. Folglich gibt es einen Step, wo man diesen "Fehler" hat... also, die Korrektur hängt immer hinterher.

    Und es gibt kaum Unterschiede im 3D zwischen gm8 und gm7/gm6 (afaik nur die erlaubte Zahl von Flächen in einem Modell (von 330 zu kanpp 10 000))

    MfG SDX
  • Aber dann würde doch die Methode von Hellfish auch in GM7 funktionieren, falls sie in GM8 wirklich funktioniert.
    :| < Hallo. Nein ich bin nicht die Signatur, ich putze hier nur.
  • Benutzer online 3

    3 Besucher