|
0 |
import numpy as np
|
|
1 |
import pygame
|
|
2 |
from pygame.locals import *
|
|
3 |
|
|
4 |
from OpenGL.GL import *
|
|
5 |
from OpenGL.GLU import *
|
|
6 |
|
|
7 |
def draw_voxels(voxel_map):
|
|
8 |
max_i, max_j, max_k = voxel_map.voxels.shape
|
|
9 |
|
|
10 |
def point(i, j, k):
|
|
11 |
glVertex3f(
|
|
12 |
voxel_map.lo[0] + i * voxel_map.resolution,
|
|
13 |
voxel_map.lo[1] + j * voxel_map.resolution,
|
|
14 |
voxel_map.lo[2] + k * voxel_map.resolution,
|
|
15 |
)
|
|
16 |
|
|
17 |
glColor3fv((1., 0.7, 0.))
|
|
18 |
glBegin(GL_QUADS)
|
|
19 |
|
|
20 |
for j in range(max_j):
|
|
21 |
for k in range(max_k):
|
|
22 |
last_val = 0
|
|
23 |
for i in range(max_i):
|
|
24 |
val = voxel_map.voxels[i, j, k]
|
|
25 |
if val == last_val:
|
|
26 |
continue
|
|
27 |
last_val = val
|
|
28 |
if val == 1:
|
|
29 |
glNormal3f(1, 0, 0)
|
|
30 |
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)
|
|
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)
|
|
42 |
|
|
43 |
for i in range(max_i):
|
|
44 |
for k in range(max_k):
|
|
45 |
last_val = 0
|
|
46 |
for j in range(max_j):
|
|
47 |
val = voxel_map.voxels[i, j, k]
|
|
48 |
if val == last_val:
|
|
49 |
continue
|
|
50 |
last_val = val
|
|
51 |
if val == 1:
|
|
52 |
glNormal3f(0, 1, 0)
|
|
53 |
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)
|
|
59 |
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)
|
|
65 |
|
|
66 |
for i in range(max_i):
|
|
67 |
for j in range(max_j):
|
|
68 |
last_val = 0
|
|
69 |
for k in range(max_k):
|
|
70 |
val = voxel_map.voxels[i, j, k]
|
|
71 |
if val == last_val:
|
|
72 |
continue
|
|
73 |
last_val = val
|
|
74 |
if val == 1:
|
|
75 |
glNormal3f(0, 0, 1)
|
|
76 |
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)
|
|
82 |
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)
|
|
88 |
glEnd()
|
|
89 |
|
|
90 |
def show_voxels(voxel_map):
|
|
91 |
dist = -np.linalg.norm(voxel_map.hi - voxel_map.lo)
|
|
92 |
pygame.init()
|
|
93 |
pygame.display.set_mode((640,480), OPENGL|DOUBLEBUF)
|
|
94 |
glEnable(GL_DEPTH_TEST)
|
|
95 |
glClearColor(.7, .7, .7, 1.)
|
|
96 |
|
|
97 |
glEnable(GL_LIGHTING)
|
|
98 |
glEnable(GL_LIGHT0)
|
|
99 |
glLightfv(GL_LIGHT0, GL_AMBIENT, (.2, .2, .2, 1.))
|
|
100 |
glLightfv(GL_LIGHT0, GL_POSITION, (0., dist, -dist, 1.))
|
|
101 |
glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, (1., .5, 0., 1.))
|
|
102 |
glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, (1., 1., 1., 1.))
|
|
103 |
glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, (50.,))
|
|
104 |
|
|
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 |
|
|
110 |
while True:
|
|
111 |
event = pygame.event.poll()
|
|
112 |
if event.type == QUIT or (event.type == KEYDOWN and event.key == K_ESCAPE):
|
|
113 |
break
|
|
114 |
|
|
115 |
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
|
|
116 |
glRotatef(1, 0, 1, 0)
|
|
117 |
|
|
118 |
draw_voxels(voxel_map)
|
|
119 |
pygame.display.flip()
|
|
120 |
pygame.time.wait(0)
|