Jump to content
Unity Insider Forum

Was sind Voxel?


skee

Recommended Posts

Also natürlich weiß ich, was Voxel sind, aber ich hab teilweise noch Verständnisprobleme wenn es um die Visualisierung geht.

Grundsätzlich sind ja Voxel erstmal nichts anderes als Punkte im 3D Raum, die irgendwie visualisiert werden. Und da hakt es dann bei mir?

Nach meinem Verständnis könnte man ja einen Voxel zB mit einem Unity-Cube visualisieren oder mit einer Spehere oder was auch immer. Wenn man jetzt aber etwas komplexere Strukturen hat, hat man ja schnell eine ganze Menge Cubes/Spheres und Performancetechnisch wird das Ganze dann ja eher suboptimal. Aber wenn man bei irgendwelchen Voxeldemos genau hinschaut, sind die Strukturen ja oft doch aus ganz vielen ganz kleinen Blöcken zusammengesetzt.

Kann mir bitte jemand erklären, wie das mit der Visualisierung funktioniert und wie das funktioniert, dass man etwas aus abertausenden kleinen Dingern zusammensetzt und das ganze dann doch noch flüssig läuft?

 

Danke :)

 

Skee

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich hoffe ich sag alles richtig, ich hab mich noch nicht allzu intensiv mit Voxel Terrains beschäftigt, wenn nicht darf man mich gern verbessern :o

 

Wenn du dir mal ein Tutorial durchliest (z.B. das hier: http://forum.unity3d...rrain-c.198651/) wirst du recht bald feststellen, dass hier ein bisschen in die Trickkiste gegriffen wird bzw. eigentlich ist es nur logisch ^^

@edit:

Es gibt zu diesem Tutorial meines Wissens nach eine neuere Version, deren Link hier auch irgendwo mal gepostet wurde.

 

Ich denke es gibt 2 Dinge die dabei eine entscheidende Rolle spielen.

 

1) Alles was nicht sichtbar ist wird ausgeblendet.

Du siehst also nur die Oberfläche und alle darunter liegenden Faces, Collider, ... werden ausgeblendet/deaktiviert.

Wenn du dir mal Creativerse anschaust (ein Spiel auf Steam, das z.B. von Gronkh und Sarazar mom auch Let's Played wird) oder auch Landmark (ein Spiel von SoE mittlereile Daybreak) kannst du manchmal sehen, dass man durch die Map durchsehen kann weil eben alles ausgeblendet wird außer das was der User momentan tatsächlich sieht ^^

Wenn die Kamera z.B. bugt oder sowas, sieht man darüber hinaus ^^

@edit:

"Ausgeblendet" ist hier das falsche Wort.. Geometrie die man nicht sieht, wird auch gar nicht erst generiert.

 

2) Alle Objekte sollten das selbe Material verwenden

Damit du unterschiedliche Blocktypen anzeigen lassen kannst, solltest du dafür einen Texture Atlas benutzen, wobei darauf alle deine Blocktypentexturen drauf sind und du lediglich die passende Stelle anzeigen lässt.

 

@edit:

https://scrawkblog.f...xelterrain1.jpg

 

Hier sieht man ganz gut wie sowas dann im Endeffekt aussieht..

Du lässt dir jeweils nur die Oberflächen anzeigen. Oben hast du dein Terrain und unten drunter sind ein paar Höhlen die man auch noch anzeigen lässt (hat was mit dem Algorithmus zu tun, der sich Marching Cubes nennt).

Alles dazwischen also das ganze Felsmassiv ist komplett ausgeblendet, da man das eh nie sieht ^^

 

Du weißt ja vielleicht, dass man so ein Voxel Terrain in Chunks unterteilt um nicht das ganze Terrain neu berechnen zu müssen wenn man was an 1 Stelle (=Cube) verändert ^^

Und wenn man sich reingräbt wird das entsprechende Chunk (also ein kleiner Ausschnitt des Voxels Terrain z.B. ein 16x16x16 Cubes großer Block) neu berechnet und wieder in das Terrainmesh eingegliedert.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ist eigentlich recht simple man benutzt für gewöhnlich chunks und für jeden chunk erzeugst du ein Mesh.

 

z.B. Minecraft:

 

Ein Chunk besteht aus 16x256x16 Blöcke wenn du nun einen Chunk renderst gehst du diese dreidimensonale Array durch einfach 0 = Luft, 1 = Stein. Jedes mal wenn du einen 1 Block hast schaust du welche seiten an einen 0 Block grenzen und für diese Seite fügst du 4 Vertex und 2 Triangles hinzu. Am Ende wenn du das ganze Array durch hast nimmst du die Vertex und Triangles und tust sie in ein Unity Mesh fertig ist dein Chunk.

 

Für Texturen empfiehlt sich ein Texture Atlas (es gibt in unity funktionen Texturen zu kompinieren, bei diesen bekommst du auch die Position der Texturen als Rect[] wieder raus). Dann musst du nur für jede Blockseite die du zeichnest die Texture coordinaten angeben.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Voxel wird aus den begriffen volumetric und Pixel abgeleitet demnach sind Voxel Berechnungen mit einem Volumen.

Wärend man bei einem Unity Cube zb eine UV benutzt und hier mit Pixel arbeitet kommen bei Voxel noch eine dritte Dimension dazu.

Voxel bestehen auch nicht aus Edges und vertecies sondern aus einem Begrenzungsflächenmodell dies wird auch b-rep pder pbrep bezeichnet.

(Sorry für die fachausdrücke aber wenn du googelst wirst du über die beriffe und die funktionweise mehr Infos finden.)

 

Voxel sind sind strenggenommen also Volumenpixel.

Bei einem Voxel werden Positionen nicht expliziet gezeichnet (per Koordinante) sondern aus der Postionen anderer Würfel hergeleitet.

Wie oben schon beschireben wurde kann daraus dann zb ein Chunk erreichnet werden.

 

Hier gibt es auch zwei unterschiedliche Verfahren das direkte und indirekte Verfahren, beim direkten Verfahren wird direkt mit den Volumensätze gearbeit es wird hierbei keine Geometrie erzeugt oder gerendet Bei dem Verfahrung wird eine Annährung über den Volume Redering Intergral der bis zum gewünschten Ergebniss durchgeführt.

 

Bei dem Verfahren kann man vor allem Objekte genierieren die keine Schartfen Kanten haben zb Wolken,Feuer, Nebel innere Organe die zb mit einem CT oder MRT visualierisert werden können.

Dieses Verfahren kommt Hauptsächlich in der Medizin zum Einsetz.

 

Bei Spielen wird mit dem Indirekten Verfahren gearbeitet dabeibei werden Flächen (ISOflächen) aus einem Datensatz verarbeitet.

 

Wenn du genau wissen willst wie das funktioniert dann schau dir den Marching Square Algorithmus an und danach den Marching Cubes Algorithmus.

 

der Squares Algorithmus ist das selbe wie der der Cubes nur das beim Square 2D Flächen berechnet werden und beim Cubes eben 3D Cubes aus dem Basis Datensatz herraus.

 

Was passiert mit Hilfe des Marching Cubes Algorithmuses innerhalb eines Voxels ?

 

Ein Voxel ist demnach eine nicht sichtbare Hülle in der innerhalb eine Berechnung stattfindet. Es werden also innerhalb des Voxel Flächengezeichnet wie eine Spinne die innerhalb einer Kiste ein Spinnennetz baut.

Nach der Berechnung wird geprüft wie die Welche nem dem gerade berechneten Voxel aussehen muss.

 

Der Knackpunkt dabei ist das dabei NUR die flächen gezeichnet werden die man wirklich braucht UND die nur wirklich von der Kamera sichtbar sind.

 

Dazu solltest dir dann unbedingt noch OCtrees anschauen bei diesem Verfahren wird geprüft ob mindest ein Eckpunkt innerhalb des 3D Objektes liegen. Ist dies nicht der fall wird der Voxel nicht weiter beachtet und es wird der nächste Voxel berechnet.

Bei der Berechnung werden also vor allem Leere Voxel nicht beachtet und aus der Berechnung aussortiert.

 

Zuletzt laufen weitere Berechnung darüber zb das Hidden Surface Removal das ist in Unity unter dem begriff Camera Occlusion Culling bekannt.

Dabei fallen dann alle Voxel weg die nicht von der Kamera gesehen werden können.

 

Wenn Voxel keine UV haben wie funktioniert dann die texturierung ?

 

Voxel werden durch Hieraische Texturierung oder Octree Texturen texturiert diese haben einen ähnlichen Speicherbedarf wie normale 2D Texturen genaueres findest du auch im Internet.

Alternativ gibt auch noch die Tiletress Verfahrten bei dem bei dem einzellne 2D Texturen auf jede Seite des Würfels projeziert werden zb aus einem 2D- Sheet herraus.

 

 

Das soll mal eine grobe Vorstellung sein was Voxel sind und wie sie funktionieren. Sorry nochmal für die ganzen Fachsprache aber Voxel sind nun mal kompliziert und ohne diese wüsst ich nicht wie ichs erklären soll.

WIe gesagt googel hilft dir weiter.

 

Viel Spass mit dem Informationen :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Sleepy, ich hab ein paar mal mit Mark über Voxel geschrieben, in der Hoffnung die Theorie grob zu verstehen, soweit ich das verstanden habe werden die Polygone nicht in den Voxeln berechnet, sondern die Voxel bilden einen Würfel (also aus 8 Voxel wird ein "Würfel" gebildet) und die Voxel tragen nun einen Iso Wert, befindet sich zwischen zwei Voxel ein Punkt mit anderem Iso Wert, wird zwischen den Positionen Interpoliert um einen Feature Point zu erhalten, 3 solcher Feature Points bilden dann jeweils ein Polygon.

Außerdem werden die Voxel wohl gar nicht erst in der Welt erzeugt sondern rein im Code als Index gespeichert.

 

Ansonsten funktioniert es eigentlich wie beim Modellieren, die ganzen entstandenen Polygone werden zu einem Mesh zusammengefasst.

 

Hoffe mal ich hab's richtig im Kopf, sonst ist Mark vermutlich umso enttäuschter :D

Link zu diesem Kommentar
Auf anderen Seiten teilen

Also so wie ich das verstanden hab, kann man sich ein Voxel so ähnlich vorstellen wie ein Pixel in einem Bild (Sind ja auch Verwandtschaften da) nur, dass ein Voxel noch eine 3. Dimension besitzt..

 

Also wenn man ein Bild hat gibt es ja unterschiedliche Farbwerte im Bild und um diese Unterschiede darstellen zu können, zerlegt man das Bild in winzig kleine Quadrate (typischerweise.. allerdings ist ein Pixel nicht Formgebunden) und diese bekommen dann einen Farbwert.. in der Gesamtheit ergibt sich dann ein Bild..

Im Gegensatz zum 2 Dimensionalen Pixel ist ein Voxel einfach ein, durch eine 3 Dimensionale Form, begrenzter Raum (Cube) der später nicht mit Farbe "gefüllt" (=> ist hier eigentlich der falsche Ausdruck) wird sondern mit Polygonen um ein Mesh zu erzeugen.

 

Wenn man den Marching Cubes Algorithmus ansieht wird das denke ich auch verständlicher..

Man hat z.B. einen Kopf den man visualisieren möchte.. Also macht man das ähnlich zu den Pixeln in einem Bild und zerlegt den 3D Raum in dem sich der Kopf befindet in kleine Voxel (meistens Cubes).

Je kleiner diese Voxel sind desto präziser kann man die Form des Kopfes herausarbeiten.

 

Ähnlich ist es bei einem Terrain.. Je kleiner ein Voxel ist desto "glatter" wird das Terrain später.

Durch spezielle Sonderregelung beim Marching Cubes (dass man z.B. eine Ecke wegschneidet indem man das Polygon diagonal durch den Voxel legt) wird das Objekt am ende noch glatter ^^

Aber das nur nebenbei..

 

Die Voxelgröße bestimmt also (wie auch die Pixelgröße) die "Auflösung" des dargestellten Objekts, das aber, wie gesagt, nicht durch die Voxel selber dargestellt wird, sondern durch Polygone die anhand des Voxelrasters konstruiert werden.

 

@edit:

http://upload.wikime...gcubes-head.png

 

Der Kopf wird also anhand der Voxel-Struktur aufgebaut indem an den Rändern der Voxel (oder auch mittendurch) ein Polygon gelegt wird.

 

@Sleepy:

Hab deinen Post übrigens nich sooo genau durchgelesen sry ^^

Sitz grad in der Arbeit..

 

Bin mal gespannt was hier noch so geschrieben wird ^^

Man lernt ja nie aus :D

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich habe vor ein paar jahren meine Facharbeit über Voxel im Bezug auf Computerspiele geschrieben was hängen gebleiben ist hab ich hier wieder gegeben.

Ja Voxel sind nicht einfach zu verstehen um im ersten Augeblick klingt das auch viel umständerlicher und aufwendiger als das normale Modellieren.

Aber troz den ganzen Algorithmen sind Voxel viel performanter als normale 3D Modelle.

Nachteile von Voxel sind das sie zb keine Vetecies besitzen das bedeutet man kann kein weight painting machen dies macht es unmöglich mit Voxeln einen Charakter zu Animieren.

 

Man sollte bei Voxel auch nicht an Minecraft denken da es keinen Beweis dafür gibt das Minecraft wirklich aus Voxeln besteht. Auch die Annahme das Voxel Cubes sind ist falsch. Voxel sind zwar Cubes aber keine 100% gefüllten Cubes meine Vorredner haben das ja auch schon erwähnt das innerhalb eines Cubes eine Teilfläche eines Modells dargestellt wird.

Das errechnete Ergebniss eines Voxel ist also normaleweise niemals ein Cube sondern eine Fläche innerhalb eines Cubes.

 

@DieKuensteDesBosses Jup das stimmt soweit alles nur ist alles noch viel komplizierter ;). In der Tat werden Marching Cubes aus einem Index im Code generiert dafür gibt es bei Marching Cubes ingesamt 256 Zustande. Es gibt also 2 hoch 8 = 256 Möglichkeiten eine Isofläche innerhalb eines Voxels zu berechnen. Berechnen ist in dem Fall falsch weil die Zustände nicht berechnet werden müssen sondern einfach aus einer Tabelle (Vorlage) genommen werden.

Mir anderen worten die Isoflächen müssen eigenlich gar nicht berechnet werden sondern werden aus einer Vorlage einfach eingefügt. Wie gesagt es gibt nur 256 Möglichkeiten wie eine Fläche innerhalb eines Cubes verlaufen könnte aber da manche verlaufsmodelle innerhalb des Cubes gleich sind kann man manche Isoflächen Spiegeln. Um sich das besser vorzustellen nehmen wir wieder einen Würfel mit 6 Seiten. Jede Seite dieses Würfels ist Identisch da Voxel alle gleich groß sind kann man den Cube von 6 Seiten auf eine Seite reduzieren. Somit gibt es bei 256 Möglichkeiten nur noch 15 Möglichkeiten.

 

 

Wer das genauer verstehen will muss sich den Maching Cubes Alorithmus genauer ansehen. Ich finde Marching Squares da einfacher zu verstehen und wer die verstanden hat versteht auch Marching Cubes.

 

Was Falsch ist:

Voxel sind keine Cubes die mit Pixeln oder Partikeln gefüllt ist. Richtig ist: Innerhalb eines Voxels werden flächen berechnet. viele Voxel ergeben dann ein komplexes 3D Modell.

 

Voxel sind Ideal für Terrain nicht nur im Minecraft Still sondern zb auch für Feld Überhänge oder ähnlichem.

Voxel sind ungeeignet für Animationen. Auch macht es wenig Sinn Gebäude in Spielen aus Voxel zu bauen.

 

Voxel kann man auch beliebig oft teilen und somit sehr feine und kleine Flächen darstellen. Voxel müssen also dann auch nicht diesem typischen Kanten klischee alla Minecraft gerechet werden sondern man kann auch sehr schöne runde (nicht eckige Modelle damit generieren.

 

 

Um sich das mal besser vorzustellen:

http://www.nekocake....oxel/voxel2.png

 

Die Quader Gitter sind die Voxel innerhalb diesen werden weitere Voxel erstellt (nicht sichtbar) und in diesen werden dann nach einigem Teilen Flächen generiert. Leere Voxel fliegen also raus und werden bei der Berechnung nicht berüücksichtigt.

 

http://docs.cryengin...55978000&api=v2

 

Voxel sind also sehr performant aber nicht unendlich performant wie man vielleicht auf den ersten Blck denken könnte wenn man sich genauer mit Voxel Beschäftigt.

 

Dazu gibt es zb Amfahls Gesetz.

Dazu ein beispiel:

Wenn 1 Mann 100 Stunden braucht um eine Glühbirne reinzudrehen wie lange brauchen dann 100 Mann ?

Mathematisch kann man diese Frage schnell klären aber sind 100 Mann Wirklich 100 mal schneller ?

 

Ebenso sieht das mit der Performance bei Voxeln aus irgend wie wird der Berechnungsaufwand um alles Performanter zu machen höher als der die Berechnung selbst. Ab diesem Zeitpunkt macht es keinen Sinn mehr alles performanter zu machen. :)

 

Wer mehr darüber wissen will sollte sich dazu Amdahls Gesetz anschauen da gibts bestimmt viele Informationen im Internet.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Über Marching Cubes hab ich erst wenig gelesen, mir wurde eher zu Dual Contouring geraten, und alle dazu gefundenen Artikel waren auch überzeugter vom Dual Contouring als von Marching Cubes Algorithmus.

Was mich noch interessieren würde, die Theorie scheinst du ja demnach, zumindest mit dem Marching Cubes Algorithmus, gut drauf zu haben, Sleepy.

Hast du sowas auch schoneinmal in Code umgesetzt ? (auch außerhalb von Unity würde mich interessieren) ich hatte es mal kurz versucht, wusste aber keinen wirklichen Ansatz, auch wenn man die Theorie grob beherrscht, habe im Internet auch leider nur ein einziges Projekt zu Dual Contouring gefunden, welches Source Code enthielt, leider nicht so super kommentiert...

 

 

Edit :

 

Mabenan, hatte schon gehört Matheess würde aktuell selbst ein Voxel basiertes Terrain für seine Engine schreiben, wollte ihn gerne auch mal Fragen, hab ihn bisher aber leider noch nicht angetroffen im Chat

Link zu diesem Kommentar
Auf anderen Seiten teilen

grob zu verstehen, soweit ich das verstanden habe werden die Polygone nicht in den Voxeln berechnet, sondern die Voxel bilden einen Würfel

 

Sorry hab ich erst später gesehen.

Das ist zum Teil richtig: Es werden große Voxel erstellt in diesen werden weitere kleinere Voxel erstellt diesen Prozess kann man beliebig oft wiederholen. Es entsteht sozusagen eine Verschachtelung aus Würfeln. In den kleinesten Würfeln werden dann die Isoflächen berechnet. Alle leeren Würfel und alle Würfel die keine keine andere Isoflächen berühren werden nicht mehr in die Berechnung mit einbezogen und werden nicht weiter beachtet.

 

Hast du sowas auch schoneinmal in Code umgesetzt ?

 

Nein wie gesagt ich hab darüber nur meine Facharbeit geschireben und danach nie wieder etwas von Voxeln wissen wollen.

Ich denke um das wirklich RICHTIG umsetzen zu kennen muss man sich genauer mit der Funktionweise und vor allem mit den Formeln beschäftigen. Im Assetstore gibt es dazu ja auch einge Projekte ich glaub meist kostenpflichtig.

 

Aber es gibt hier im Forum ein paar Leute die schon Voxel Terrains in Unity umgesetzt haben vielleicht melden die sich ja auch noch zu Wort.

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 5 months later...

Ich habe schon mal an sowas gearbeitet. Ist nicht eigentlich so schwer. Ist nur bissel aufwendig zu Coden. Allerdings habe ich keine Terrains erstellt oder so, sondern blockig artige Chunks.

Mich interessiert auch Terrains erstellen nicht so, da man mit Perlin Noise von Unity so oder so gute Sachen generieren kann^^.

 

Was mich aber sehr interessiert ist, wie das in Minecraft wurde mit den ganzen Props wie zum Beispiel Zäune. Die sind ja nicht quadratisch. Daher Frage ich mich, ob das ein eigener Mesh ist oder, ob da wirklich ein Trick dahinter ist.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...