3D: Primitives

  • GM 8

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

  • 3D: Primitives

    Guten Tag,

    ich habe mich nun etwas mit den d3d-Funktionen von GML beschäftigt,
    und wollte nun ein primitive erstellen:

    GML-Quellcode

    1. test_obj=d3d_model_create()
    2. d3d_model_primitive_begin(test_obj,pr_pointlist)
    3. d3d_model_vertex(test_obj,x-5,y-5,z)
    4. d3d_model_vertex(test_obj,x-5,y+5,z)
    5. d3d_model_vertex(test_obj,x+5,y+5,z)
    6. d3d_model_vertex(test_obj,x+5,y-5,z)
    7. d3d_model_vertex(test_obj,x-5,y-5,z+10)
    8. d3d_model_vertex(test_obj,x-5,y+5,z+10)
    9. d3d_model_vertex(test_obj,x+5,y+5,z+10)
    10. d3d_model_vertex(test_obj,x+5,y-5,z+10)
    11. d3d_model_primitive_end(test_obj)
    Alles anzeigen


    wenn ich dieses Primitive aber drawen will,
    kommt nichts.
    Was genau mache ich falsch?
    Dieser Beitrag wurde bereits 8.675.628 mal editiert, zuletzt von »levarris07« (Heute, 11:33)
  • Ich kenne mich zwar nicht so ganz im 3D Bereich des Game Makers aus, aber es könnte doch an der

    GML-Quellcode

    1. d3d_model_primitive_begin(test_obj,pr_pointlist)

    Zeile liegen.

    Das letzte Argument sagt glaube ich aus, dass du die einzelnen Vertices als "punkte" zeichnen lassen möchtest. Punkte haben aber (wenn schon) eine sehr geringe Fläche. vl sieht man sie bei dir einfach nicht.
    Versuch mal andere befehle zu benutzen:
    pr_pointlist, pr_linelist, pr_linestrip,pr_trianglelist,pr_trianglestrip oder pr_trianglefan


    /Edit:
    u.a. würde ich trianglestrip und trianglefan ausprobieren.
  • Habe ich bereits,
    das ergebnis bei pr_linelist waren relativ ungeordnete Linien.

    edit:
    ich habe alles ausprobiert, man sieht zwar was, aber das sieht mehr nach einem zerknülltem Stück Papier aus, als nach einem Quadrat.
    Dieser Beitrag wurde bereits 8.675.628 mal editiert, zuletzt von »levarris07« (Heute, 11:33)
  • Ich habe einmal eine Fläche in 3D mit den Primitives gezeichnet.
    so sah der Code aus:


    GML-Quellcode

    1. x1 = x;
    2. x2 = x+50;
    3. y1 = y;
    4. y2 = y+50;


    GML-Quellcode

    1. var ttt;
    2. ttt = background_get_texture(texture_a);
    3. d3d_primitive_begin_texture(pr_trianglestrip,ttt);
    4. d3d_vertex_texture(x1,y1,0,0,0);
    5. d3d_vertex_texture(x2,y1,0,0,1);
    6. d3d_vertex_texture(x1,y2,0,1,0);
    7. d3d_vertex_texture(x2,y2,0,1,1);
    8. d3d_primitive_end();


    Man muss dabei ziemlich auf die Reihenfolge der Vertices achten, sonst wird das Modell womöglich falsch dargestellt.
    Bei einem Rechteck müsste man die Vertices so anordnen:
    1. links oben
    2. rechts oben
    3. links unten
    4. rechts unten.

    /Edit: Das hängt gaube ich damit zusammen dass er die Punkte miteinander verbinden muss. bei trianglestrip z.B: macht er aus je 3 Vertices ein Dreieck was eine Fläche besitzt.
    Wenn man also eine Falsche anordnung der Punkte angibt, verbindet er die Punkte in einer falschen Reihenfolge. Dies war wahrscheinlich auch der Grund wieso bei mir die Fläche auch falsch gezeichnet wurde.

    /Edit 2:
    z.B: Hier:
    LINK
    V1 > V2 >V0 Nun hat er 3 Punkte, er verbindet V0 (letzte) mit V1 (erste) und du hast ein Dreieck. Jetzt gibst du ihn noch V3 an, und er verbindet die letzten 3 angegebenen Punkte
    V2 >V0 > V3. Jetzt V3 mit V2 verbinden und du hast wieder ein Dreieck.

    Ein Rechteck besteht im 3-Dimensionalen Raum auch eigentlich aus 2 Dreiecken.


    Ich hoffe ich habe jetzt nicht zu viel Müll verzapft. XD

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

  • Ein Rechteck besteht im 3-Dimensionalen Raum auch eigentlich aus 2 Dreiecken.
    Das weiß ich ;) (=Polygone)

    Deine Erklärung mit den Vertex-Punkten hab ich grade nicht so kapiert. :)
    Bei einem Quadrat ist die Anordnung (in der Mathematik) doch so:
    Spoiler anzeigen
    unten rechts vorne (A)
    unten links vorne (B)
    unten links hinten (C)
    unten rechts hinten(D)
    oben rechts vorne (E)
    oben links vorne (F)
    oben links hinten (G)
    oben rechts hinten(H)


    edit:

    Hab mal das hier ausprobiert:
    Spoiler anzeigen

    GML-Quellcode

    1. d3d_model_primitive_begin(test_obj,pr_trianglelist)
    2. d3d_model_vertex_texture(test_obj,x+5,y+5,z,0,0)
    3. d3d_model_vertex_texture(test_obj,x-5,y+5,z,0,0)
    4. d3d_model_vertex_texture(test_obj,x-5,y-5,z,0,0)
    5. d3d_model_vertex_texture(test_obj,x-5,y-5,z,0,0)
    6. d3d_model_vertex_texture(test_obj,x+5,y-5,z,0,0)
    7. d3d_model_vertex_texture(test_obj,x+5,y+5,z,0,0)
    8. d3d_model_primitive_end(test_obj)
    Alles anzeigen



    Hier habe ich zwei Dreiecke zu einer Fläche gemacht.
    Das funktioniert, aber es kann doch nicht sein, mit dieser Methode größere Modelle zu machen.

    edit #2:
    Weiß hier wirklich keiner Bescheid, wie es besser geht?
    Dieser Beitrag wurde bereits 8.675.628 mal editiert, zuletzt von »levarris07« (Heute, 11:33)

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von levarris07 ()

  • Du hast völlig recht, auf diese weise würde es ziemlich lange dauern, kompliziertere Strukturen zu bauen - aber genau dafür gibt es ja Programme wie Blender.
    Dann kann man die Modelle mit Skripts im GM importieren, z.B. .obj Dateien mit dem hier, da gibts aber noch verschiedene andere Alternativen.
    Dann sollte es relativ einfach sein, gute Modelle zu verwenden und auch Texturen zu handhaben ist viel einfacher, was beim direkt - coden bei größeren Modellen ziemlich unmenschlich wäre.