-
-
Notifications
You must be signed in to change notification settings - Fork 100
/
Copy pathborder-cube.py
90 lines (75 loc) · 2.73 KB
/
border-cube.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
# -----------------------------------------------------------------------------
# Python and OpenGL for Scientific Visualization
# www.labri.fr/perso/nrougier/python+opengl
# Copyright (c) 2017, Nicolas P. Rougier
# Distributed under the 2-Clause BSD License.
# -----------------------------------------------------------------------------
import numpy as np
from glumpy import app, gl, glm, gloo
from glumpy.geometry import colorcube
vertex = """
uniform mat4 model; // Model matrix
uniform mat4 view; // View matrix
uniform mat4 projection; // Projection matrix
attribute vec4 color; // Vertex color
attribute vec3 position; // Vertex position
varying vec3 v_position; // Interpolated vertex position (out)
varying vec4 v_color; // Interpolated fragment color (out)
void main()
{
v_color = color;
v_position = position;
gl_Position = projection * view * model * vec4(position,1.0);
}
"""
fragment = """
varying vec4 v_color; // Interpolated fragment color (in)
varying vec3 v_position; // Interpolated vertex position (in)
void main()
{
float xy = min( abs(v_position.x), abs(v_position.y));
float xz = min( abs(v_position.x), abs(v_position.z));
float yz = min( abs(v_position.y), abs(v_position.z));
float b = 0.85;
if ((xy > b) || (xz > b) || (yz > b))
gl_FragColor = vec4(0,0,0,1);
else
gl_FragColor = v_color;
}
"""
window = app.Window(width=512, height=512, color=(1, 1, 1, 1))
@window.event
def on_draw(dt):
global phi, theta
window.clear()
# Filled cube
cube.draw(gl.GL_TRIANGLES, I)
# Rotate cube
theta += 1.0 # degrees
phi += -1.0 # degrees
model = np.eye(4, dtype=np.float32)
glm.rotate(model, theta, 0, 0, 1)
glm.rotate(model, phi, 0, 1, 0)
cube['model'] = model
@window.event
def on_resize(width, height):
cube['projection'] = glm.perspective(45.0, width / float(height), 2.0, 100.0)
@window.event
def on_init():
gl.glEnable(gl.GL_DEPTH_TEST)
V = np.zeros(8, [("position", np.float32, 3),
("color", np.float32, 4)])
V["position"] = [[ 1, 1, 1], [-1, 1, 1], [-1,-1, 1], [ 1,-1, 1],
[ 1,-1,-1], [ 1, 1,-1], [-1, 1,-1], [-1,-1,-1]]
V["color"] = [[0, 1, 1, 1], [0, 0, 1, 1], [0, 0, 0, 1], [0, 1, 0, 1],
[1, 1, 0, 1], [1, 1, 1, 1], [1, 0, 1, 1], [1, 0, 0, 1]]
V = V.view(gloo.VertexBuffer)
I = np.array([0,1,2, 0,2,3, 0,3,4, 0,4,5, 0,5,6, 0,6,1,
1,6,7, 1,7,2, 7,4,3, 7,3,2, 4,7,6, 4,6,5], dtype=np.uint32)
I = I.view(gloo.IndexBuffer)
cube = gloo.Program(vertex, fragment)
cube.bind(V)
cube['model'] = np.eye(4, dtype=np.float32)
cube['view'] = glm.translation(0, 0, -5)
phi, theta = 40, 30
app.run(framerate=60, framecount=360)