Hi,
kennt sich jemand mit Voxel aus? Ich experimentiere gerade mit der Sichtbarkeit von Würfeln.
Dabei erstelle ich grundlegend einen 3D - Raster (im Beispiel 16 x 16 x 16). Der erstellte Bereich hat also 4096 Würfel. Die von der Kamera erfasste Fläche hat im Grunde jedoch nur
((16 x 16) * 3) - (3 * 16) = 720 Würfel
Ich rechne da: Grundfläche x 3 - der Überschneidungen der Flächen
Jetzt stellt sich für mich die Frage, wie ich die von der Kamera sichtbaren Bereiche errechnen kann?
Ich habe mit X_COLLISIONRAY experimentiert, aber ich bin mir rein vom Aufbau her nicht ganz sicher.
Hat jemand eine Idee, wie man sowas angehen kann? Hier mal der Code, mit dem ich experimentiere:
// --------------------------------- //
// Project: voxel
// Start: Tuesday, October 01, 2013
// IDE Version: 11.322
// SETCURRENTDIR("Media") // go to media files
TYPE cube_type
typ
x
y
z
active
ENDTYPE
GLOBAL cube[] AS cube_type
GLOBAL anzahl, sichtbar, size_total
main()
FUNCTION main:
CreateCube(0, 1, RGB(255, 0, 0))
CreateCube(1, 1, RGB(0, 255, 0))
CreateCube(2, 1, RGB(0, 0, 255))
size_total = 16
create_base_chunk(size_total)
WHILE TRUE
X_MAKE3D 1, 1000, 45
X_CAMERA 25, 25, 20, 0, 0, 0
sichtbar = 0
draw_chunk(size_total)
X_MAKE2D
PRINT "Anzahl: " + anzahl, 0, 0
PRINT "Sichtbar: " + sichtbar, 0, 20
SHOWSCREEN
WEND
ENDFUNCTION
FUNCTION draw_chunk: size
FOREACH c IN cube[]
IF c.active = TRUE
INC sichtbar, 1
X_MOVEMENT c.x - (size/2), c.z - (size/2), c.y - (size/2)
X_DRAWOBJ c.typ, 0
ENDIF
NEXT
ENDFUNCTION
FUNCTION create_base_chunk: size
LOCAL tmp_x, tmp_y, tmp_z
LOCAL c AS cube_type
LOCAL hit
FOR tmp_x = 0 TO size - 1
FOR tmp_y = 0 TO size - 1
FOR tmp_z = 0 TO size - 1
c.typ = RND(2)
c.x = tmp_x
c.y = tmp_y
c.z = tmp_z
c.active = TRUE
DIMPUSH cube[], c
INC anzahl, 1
NEXT
NEXT
NEXT
ENDFUNCTION
// ------------------------------------------------------------- //
// -=# CREATECUBE #=-
// ------------------------------------------------------------- //
FUNCTION CreateCube: num, sz, col
// Diese Variablen sind als LOCAL definiert:
// num, sz,
sz=sz/2
X_OBJSTART num
// Front Face
X_OBJADDVERTEX sz, -sz, sz, 1, 0, col
X_OBJADDVERTEX -sz, -sz, sz, 0, 0, col
X_OBJADDVERTEX sz, sz, sz, 1, 1, col
X_OBJADDVERTEX -sz, sz, sz, 0, 1, col
X_OBJNEWGROUP
// Back Face
X_OBJADDVERTEX -sz, sz, -sz, 1, 1, col
X_OBJADDVERTEX -sz, -sz, -sz, 1, 0, col
X_OBJADDVERTEX sz, sz, -sz, 0, 1, col
X_OBJADDVERTEX sz, -sz, -sz, 0, 0, col
X_OBJNEWGROUP
// Top Face
X_OBJADDVERTEX -sz, sz, sz, 0, 0, col
X_OBJADDVERTEX -sz, sz, -sz, 0, 1, col
X_OBJADDVERTEX sz, sz, sz, 1, 0, col
X_OBJADDVERTEX sz, sz, -sz, 1, 1, col
X_OBJNEWGROUP
// Bottom Face
X_OBJADDVERTEX sz, -sz, -sz, 0, 1, col
X_OBJADDVERTEX -sz, -sz, -sz, 1, 1, col
X_OBJADDVERTEX sz, -sz, sz, 0, 0, col
X_OBJADDVERTEX -sz, -sz, sz, 1, 0, col
X_OBJNEWGROUP
// Right face
X_OBJADDVERTEX sz, sz, -sz, 1, 1, col
X_OBJADDVERTEX sz, -sz, -sz, 1, 0, col
X_OBJADDVERTEX sz, sz, sz, 0, 1, col
X_OBJADDVERTEX sz, -sz, sz, 0, 0, col
X_OBJNEWGROUP
// Left Face
X_OBJADDVERTEX -sz, -sz, sz, 1, 0, col
X_OBJADDVERTEX -sz, -sz, -sz, 0, 0, col
X_OBJADDVERTEX -sz, sz, sz, 1, 1, col
X_OBJADDVERTEX -sz, sz, -sz, 0, 1, col
X_OBJNEWGROUP
X_OBJEND
ENDFUNCTION // sz
lg
W.