XNA - Einfache 3D-Map anhand von 2D-Array erstellen

  • C#

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von Mangafreak1995.

    XNA - Einfache 3D-Map anhand von 2D-Array erstellen

    Angenommen, ich hab ein int-Array, das so aussieht:

    Quellcode

    1. 1 1 1 1 1
    2. 1 0 0 0 1
    3. 1 1 0 0 1
    4. 1 0 1 0 1
    5. 1 1 1 1 1

    Wie ich das in 2D umsetze, ist mir klar, aber ich möchte anhand des Arrays ne einfache 3D-Karte erstellen, in der eine 0 für nichts und eine 1 für einen Würfel, bzw. ne Wand steht.
    Welche Methoden gibt es, das so zu realisieren?
    Was verstehst du unter "realisieren" denn genau? Also wo hakt es? Ist ja im Moment eher so: 2D-Array -> A miracle occurs -> 3D-Karte.
    Soll diese 3d-Karte auch als Array dargestellt werden, das also aus dem ersten Array erstellt werden soll?

    Skybird schrieb:

    Das sind ja Ubisoftmethoden hier !

    Soll das etwa soetwas wie Minecraft werden?^^

    Nunja, ich denke was du suchst nennt sich Instancing...
    Ansonsten könnte man die auch - ich denke aber eher, wenn es sich um etwas nicht dynamisches handelt - einfach alles in ein VertexBuffer packen, ein VertexBuffer ist performanter als viele kleine....Das würde heißen die Dreiecke schön selber erstellen ;)
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    eine liste (oder ein array) mit vektoren, die die koordinaten eines definierten eckpunktes eines jeden würfels enthält. so sparst du die information darüber, wo keine würfel sind.

    was günstiger ist, hängt vom würfel-freiraum-verhältnis ab.
    Ich bin jetzt kein Spieleentwickler, aber ich würde mir einen Block (Mesh) vorstellen, der 50*50*50 misst.
    Dann:
    In 2 verschachtelten for-schleifen durch das Array laufen.

    C#-Quellcode

    1. int[,] arr = new int[4, 4] {
    2. {1,1,1,1},
    3. {0,0,0,1},
    4. {1,0,0,0},
    5. {1,1,1,1}
    6. };
    7. int blockWidth = 50;
    8. for(int xa = 0; xa < 5, xa++)
    9. {
    10. for(int ya = 0; ya < 5; ya++)
    11. {
    12. if(arr[xa,ya] == 1)
    13. {
    14. var targetPoint = new Vector3(x*blockWidth, 0, y*blockWidth); //assuming: x, y, z
    15. //TODO:
    16. //Neuen Mesh mit diesen KOs erzeugen
    17. //oder so.
    18. }
    19. }
    20. }

    Kann aber auch anders funtkionieren, bin gerade etwas stoned.
    Von meinem iPhone gesendet

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „nikeee13“ ()

    Wofür brauchst du denn die 3D-Map ? Kollision ? Zeichnen ?
    ok, sofern dann alles an einem Stück zusammenhängt würde ich das ganze aus dreiecken zusammensetzen lassen, dabei alles wie im array auch einfach einmal durchgehen, von links nach rechts, von oben nach unten(oder umgekehrt)...
    ich denke das sollte ganz hilfreich sein: riemers.net/eng/Tutorials/XNA/…eries3/Triangle_strip.php
    Wofür brauchst du denn die 3D-Map ? Kollision ? Zeichnen ?

    Meistens ja wohl für beides?
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Du bastelst also auch an einem Wolfenstein 3D^^

    Soetwas ähnliches habe ich auch mal gemacht, sofern du vorhast ein Voxelgatter zu rendern.
    Wenn die maximale Höhe der Welt 32 Voxel beträgt könntest du deinen 2D-Integer-Array dafür nutzen. Ein Integer ist ja eine 32Bit Zahl (wem erzähl ich das? xD) und bingo, du musst nur noch auslesen ob Bit #x 1 oder 0 ist und weißt, wie mit dem Voxel zu verfahren ist.
    Ob das noch Performant genug ist weiß ich nicht. Kann mir aber schon vorstellen, dass es recht flott läuft..

    Ich glaube, dass wäre mal wieder die Ultimative Bastler-Variante. Für den Menschen sind die Integer-Werte auf jeden Fall nichtmehr lesbar^^

    Es gibt ja ein "Voxelstein3D" - da ist es irgendwie mittels OcTrees gelöst. Trotzdem unglaublich, denn im endeffekt ist ja jeder einzelne Voxel doch da...

    Welche MapDimensionen schweben dir denn vor?

    jvbsl schrieb:

    Wofür brauchst du denn die 3D-Map ? Kollision ? Zeichnen ?

    Meistens ja wohl für beides?
    Naja, ich sehe aber nicht heraus, was er nun wissen will.