Voxel rendering
-
Gewissermaßen hat es ja schon ne ausdehnung. Wenn ich dem Volume sage es hat eine Tiefe von 128 besteht dieses aus 128 Schichten in der Tiefe wobei jeder Voxel eine Ausdehnung von 1³ hat.
Was ich mich aber grad frage ist, wie ich es nun mit der kollision mache. Benutzt man einfach ein Ray das man vom Bildschirm aus abschießt, oder ein Viewfrustum, das für jedes Pixel gebildet wird?
Und wie testet man dann generell die Kollision? Werden die Voxel dann als AA-Bounding Boxes behandelt?
-
@this->that
die ausdehnung ist dann 1/128 vom volume pro achse (bezogen auf mein beispiel oben)kollision ist
const static voxel EMPTY = 0; if(VoxelVolume[x+y*VOLUME_WIDTH+z*VOLUME_WIDTH*VOLUME_HEIGHT]!=EMPTY) { //collision }
zu raycasting in 2.5D gibt es massig tutorials
http://www.permadi.com/tutorial/raycast/index.html
http://www.student.kuleuven.be/~m0216922/CG/raycasting.html
in medizin:
http://www.daimi.au.dk/~trier/?page_id=98jetzt nur noch in 3d implementieren und tadaaa
-
const static voxel EMPTY = 0; if(VoxelVolume[x+y*VOLUME_WIDTH+z*VOLUME_WIDTH*VOLUME_HEIGHT]!=EMPTY) { //collision }
Ja so erkenne ich ob das Voxel leer ist oder nicht, aber wie schaut es nun mit der eigentlichen kollision aus. Ich muss ja für jedes Pixel ein Ray schießen und auf Kollision mit einem Voxel prüfen. Nun ist aber die Frage, als was man nun ein Voxel betrachtet. Ich kann mir grad nur so vorstellen, das jedes Voxel eben eine Bounding Box ist, und das Ray auf kollision mit dem Voxel geprüft wird. Aber das ist vermutlich viel zu langsam?
-
Potatoman schrieb:
... wie schaut es nun mit der eigentlichen kollision aus....
steht in den links
-
rapso schrieb:
das model von id software: http://www.rapso.de/ranz/vox/035.png (nicht von den farben irrefuehren lassen, das model ist so hoch aufgeloest wie id software das machte, ich habe leider nicht die texturen bekommen, sondern nur das model und deswegen pro 50x50 voxel eine farbe anhand der z-tiefe vergeben, deswegen sieht das aus wie holz fasern... in etwa..)
Gibts das frei verfügbar oder woher hattest du das?
-
TyRoXx schrieb:
this->that schrieb:
Braucht ein Voxel nicht auch noch eine Ausdehnung?
Wenn ich das richtig verstehe, ist ein Voxel ein Pixel in 3D. Da gibt es einfach keine Ausdehnung.
Ich würde sagen: jain,.. nach definition ja, aber wenn ich mich grob an den c't artikel über raytracing erinnere, wird der raum in verschiedene quader geteilt, ein unterquader hat dann die eigenschaft ein voxel zu sein, leer zu sein oder aus verschiedene weitere unterquader zu bestehen. Das hilft die Speichergröße zu reduzieren etc. pepe....
Software lösungen habe ich in vielen links gesehen, aber gibt es die möglichkeit auch hardware beschleunigt dies auf den bildschirm zu legen? (á la openGL?)
Seid gegrüßt
-
Potatoman schrieb:
...Ich muss ja für jedes Pixel ein Ray schießen und auf Kollision mit einem Voxel prüfen. Nun ist aber die Frage, als was man nun ein Voxel betrachtet. Ich kann mir grad nur so vorstellen, das jedes Voxel eben eine Bounding Box ist, und das Ray auf kollision mit dem Voxel geprüft wird. Aber das ist vermutlich viel zu langsam?
Du könntest dir erstmal einen Octree oder sowas basteln, so das du ganze Areale gleich ausschliessen kannst in denen ohnehin nur "Luft" drin ist
Mit der Ray-Voxel Prüfung beginnst du dann im ersten nicht-leeren Quader den der Strahl durchquert. Hab das selbst noch nie gemacht, aber so in der Art stell ich mir das vor
Und ja: Ein Voxel ist gewissermaßen eine Bounding Box - ein "volumetric pixel" halt
-
ich habe mal auch noch ne frage, da das thema mich auch interessiert:
Nehmen wir an ich hätte aus voxel mir ne sphäre gebastelt, seitlich trifft licht auf diese. Nun müsste über die Orthogonale der reflexionswinkel bestimmt werden. Voxel sind doch aber Achteckige (infinitisimal kleine) Volumina mit "harten" kannten. Wie kann da der "richtige" Reflexionswinkel berechnet werden? Oder wird über die "möglich" benachbarten voxel eine ebene gefittet um dann über den tangentialraum die nötigen informationen zu ziehen?
Über links bin ich auch dankbar
greetz
-
Ein Voxel kann auch sowas wie eine Normale speichern
-
zeusosc schrieb:
ich habe mal auch noch ne frage, da das thema mich auch interessiert:
Nehmen wir an ich hätte aus voxel mir ne sphäre gebastelt, seitlich trifft licht auf diese. Nun müsste über die Orthogonale der reflexionswinkel bestimmt werden. Voxel sind doch aber Achteckige (infinitisimal kleine) Volumina mit "harten" kannten. Wie kann da der "richtige" Reflexionswinkel berechnet werden? Oder wird über die "möglich" benachbarten voxel eine ebene gefittet um dann über den tangentialraum die nötigen informationen zu ziehen?
Über links bin ich auch dankbar
greetz
Mann kann z.B. über den gradient die richtung der normalen ausrechnen, das ist aber eher für volumen und nicht direkt voxeldaten. Kann mir aber vorstellen dass man da ähnliches machen kann. (halbwissen und so)