4 | 4 |
from OpenGL.GL import *
|
5 | 5 |
from OpenGL.GLU import *
|
6 | 6 |
|
7 | |
def draw_voxels(voxel_map):
|
|
7 |
def voxels_to_quads(voxel_map):
|
8 | 8 |
max_i, max_j, max_k = voxel_map.voxels.shape
|
|
9 |
quads = []
|
9 | 10 |
|
10 | 11 |
def point(i, j, k):
|
11 | |
glVertex3f(
|
|
12 |
return np.array((
|
12 | 13 |
voxel_map.lo[0] + i * voxel_map.resolution,
|
13 | 14 |
voxel_map.lo[1] + j * voxel_map.resolution,
|
14 | 15 |
voxel_map.lo[2] + k * voxel_map.resolution,
|
15 | |
)
|
16 | |
|
17 | |
glColor3fv((1., 0.7, 0.))
|
18 | |
glBegin(GL_QUADS)
|
|
16 |
))
|
19 | 17 |
|
20 | 18 |
for j in range(max_j):
|
21 | 19 |
for k in range(max_k):
|
|
26 | 24 |
continue
|
27 | 25 |
last_val = val
|
28 | 26 |
if val == 1:
|
29 | |
glNormal3f(1, 0, 0)
|
|
27 |
norm = np.array((1, 0, 0))
|
30 | 28 |
else:
|
31 | |
glNormal3f(-1, 0, 0)
|
32 | |
point(i, j, k)
|
33 | |
point(i, j+1, k)
|
34 | |
point(i, j+1, k+1)
|
35 | |
point(i, j, k+1)
|
|
29 |
norm = np.array((-1, 0, 0))
|
|
30 |
quads.append(([
|
|
31 |
point(i, j, k),
|
|
32 |
point(i, j+1, k),
|
|
33 |
point(i, j+1, k+1),
|
|
34 |
point(i, j, k+1),
|
|
35 |
], norm))
|
36 | 36 |
if last_val:
|
37 | |
glNormal3f(-1, 0, 0)
|
38 | |
point(i+1, j, k)
|
39 | |
point(i+1, j+1, k)
|
40 | |
point(i+1, j+1, k+1)
|
41 | |
point(i+1, j, k+1)
|
|
37 |
quads.append(([
|
|
38 |
point(i+1, j, k),
|
|
39 |
point(i+1, j+1, k),
|
|
40 |
point(i+1, j+1, k+1),
|
|
41 |
point(i+1, j, k+1),
|
|
42 |
], np.array((-1, 0, 0))))
|
42 | 43 |
|
43 | 44 |
for i in range(max_i):
|
44 | 45 |
for k in range(max_k):
|
|
49 | 50 |
continue
|
50 | 51 |
last_val = val
|
51 | 52 |
if val == 1:
|
52 | |
glNormal3f(0, 1, 0)
|
|
53 |
norm = np.array((0, 1, 0))
|
53 | 54 |
else:
|
54 | |
glNormal3f(0, -1, 0)
|
55 | |
point(i, j, k)
|
56 | |
point(i+1, j, k)
|
57 | |
point(i+1, j, k+1)
|
58 | |
point(i, j, k+1)
|
|
55 |
norm = np.array((0, -1, 0))
|
|
56 |
quads.append(([
|
|
57 |
point(i, j, k),
|
|
58 |
point(i+1, j, k),
|
|
59 |
point(i+1, j, k+1),
|
|
60 |
point(i, j, k+1),
|
|
61 |
], norm))
|
59 | 62 |
if last_val:
|
60 | |
glNormal3f(0, -1, 0)
|
61 | |
point(i, j+1, k)
|
62 | |
point(i+1, j+1, k)
|
63 | |
point(i+1, j+1, k+1)
|
64 | |
point(i, j+1, k+1)
|
|
63 |
quads.append(([
|
|
64 |
point(i, j+1, k),
|
|
65 |
point(i+1, j+1, k),
|
|
66 |
point(i+1, j+1, k+1),
|
|
67 |
point(i, j+1, k+1),
|
|
68 |
], np.array((0, -1, 0))))
|
65 | 69 |
|
66 | 70 |
for i in range(max_i):
|
67 | 71 |
for j in range(max_j):
|
|
72 | 76 |
continue
|
73 | 77 |
last_val = val
|
74 | 78 |
if val == 1:
|
75 | |
glNormal3f(0, 0, 1)
|
|
79 |
norm = np.array((0, 0, 1))
|
76 | 80 |
else:
|
77 | |
glNormal3f(0, 0, -1)
|
78 | |
point(i, j, k)
|
79 | |
point(i+1, j, k)
|
80 | |
point(i+1, j+1, k)
|
81 | |
point(i, j+1, k)
|
|
81 |
norm = np.array((0, 0, -1))
|
|
82 |
quads.append(([
|
|
83 |
point(i, j, k),
|
|
84 |
point(i+1, j, k),
|
|
85 |
point(i+1, j+1, k),
|
|
86 |
point(i, j+1, k),
|
|
87 |
], norm))
|
82 | 88 |
if last_val:
|
83 | |
glNormal3f(0, 0, -1)
|
84 | |
point(i, j, k+1)
|
85 | |
point(i+1, j, k+1)
|
86 | |
point(i+1, j+1, k+1)
|
87 | |
point(i, j+1, k+1)
|
|
89 |
quads.append(([
|
|
90 |
point(i, j, k+1),
|
|
91 |
point(i+1, j, k+1),
|
|
92 |
point(i+1, j+1, k+1),
|
|
93 |
point(i, j+1, k+1),
|
|
94 |
], np.array((0, 0, -1))))
|
|
95 |
|
|
96 |
return quads
|
|
97 |
|
|
98 |
def draw_quads(quads, rot):
|
|
99 |
glPushMatrix()
|
|
100 |
glColor3fv((1., 0.7, 0.))
|
|
101 |
glRotatef(4, 1, 0, 0)
|
|
102 |
|
|
103 |
glPushMatrix()
|
|
104 |
glRotatef(rot, 0, 1, 0)
|
|
105 |
glBegin(GL_QUADS)
|
|
106 |
for quad, normal in quads:
|
|
107 |
glNormal3f(*normal)
|
|
108 |
for pt in quad:
|
|
109 |
glVertex3f(*pt)
|
88 | 110 |
glEnd()
|
|
111 |
glPopMatrix()
|
|
112 |
|
|
113 |
glPopMatrix()
|
89 | 114 |
|
90 | 115 |
def show_voxels(voxel_map):
|
91 | 116 |
dist = -np.linalg.norm(voxel_map.hi - voxel_map.lo)
|
|
117 |
w = 800
|
|
118 |
h = 800
|
92 | 119 |
pygame.init()
|
93 | |
pygame.display.set_mode((640,480), OPENGL|DOUBLEBUF)
|
|
120 |
pygame.display.set_mode((w, h), OPENGL|DOUBLEBUF)
|
|
121 |
|
94 | 122 |
glEnable(GL_DEPTH_TEST)
|
95 | |
glClearColor(.7, .7, .7, 1.)
|
|
123 |
glClearColor(.2, .2, .3, 1.)
|
|
124 |
|
|
125 |
glMatrixMode(GL_PROJECTION)
|
|
126 |
glLoadIdentity()
|
|
127 |
gluPerspective(45.0, float(w) / float(h), 0.1, 100.0)
|
|
128 |
glTranslatef(0.0, -2.0, dist)
|
|
129 |
|
|
130 |
glMatrixMode(GL_MODELVIEW)
|
|
131 |
glLoadIdentity()
|
96 | 132 |
|
97 | 133 |
glEnable(GL_LIGHTING)
|
98 | 134 |
glEnable(GL_LIGHT0)
|
99 | 135 |
glLightfv(GL_LIGHT0, GL_AMBIENT, (.2, .2, .2, 1.))
|
100 | |
glLightfv(GL_LIGHT0, GL_POSITION, (0., dist, -dist, 1.))
|
|
136 |
glLightfv(GL_LIGHT0, GL_POSITION, (dist, dist, 0, 1.))
|
101 | 137 |
glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, (1., .5, 0., 1.))
|
102 | 138 |
glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, (1., 1., 1., 1.))
|
103 | 139 |
glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, (50.,))
|
104 | 140 |
|
105 | |
glMatrixMode(GL_PROJECTION)
|
106 | |
gluPerspective(45.0, 640 / 480.0, 0.1, 100.0)
|
107 | |
glTranslatef(0.0, -2.0, dist)
|
108 | |
glRotatef(25, 1, 0, 0)
|
109 | |
|
|
141 |
quads = voxels_to_quads(voxel_map)
|
|
142 |
rot = 0
|
110 | 143 |
while True:
|
111 | 144 |
event = pygame.event.poll()
|
112 | |
if event.type == QUIT or (event.type == KEYDOWN and event.key == K_ESCAPE):
|
|
145 |
if event.type == QUIT or (
|
|
146 |
event.type == KEYDOWN and event.key == K_ESCAPE):
|
113 | 147 |
break
|
114 | 148 |
|
115 | 149 |
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
|
116 | |
glRotatef(1, 0, 1, 0)
|
117 | 150 |
|
118 | |
draw_voxels(voxel_map)
|
|
151 |
draw_quads(quads, rot)
|
119 | 152 |
pygame.display.flip()
|
120 | |
pygame.time.wait(0)
|
|
153 |
pygame.time.wait(3)
|
|
154 |
rot += 2.
|