1
1
import pygame
2
2
import pygame .gfxdraw
3
3
import glm
4
+ import pywavefront
4
5
5
6
6
7
class Camera :
@@ -22,6 +23,18 @@ def __init__(self) -> None:
22
23
self .vertices = []
23
24
self .faces = []
24
25
26
+ def load_obj (self , path ):
27
+ o = pywavefront .Wavefront (path )
28
+ vert_arr = []
29
+ for v in o .vertices :
30
+ self .vertices .append (glm .vec3 (* v ))
31
+ for mat_name , mat in o .materials .items ():
32
+ for i in range (0 , len (mat .vertices ), 9 ):
33
+ v1 = (mat .vertices [i ], mat .vertices [i + 1 ], mat .vertices [i + 2 ])
34
+ v2 = (mat .vertices [i + 3 ], mat .vertices [i + 4 ], mat .vertices [i + 5 ])
35
+ v3 = (mat .vertices [i + 6 ], mat .vertices [i + 7 ], mat .vertices [i + 8 ])
36
+ self .faces .append ((o .vertices .index (v1 ), o .vertices .index (v2 ), o .vertices .index (v3 )))
37
+
25
38
26
39
class Cube (Mesh ):
27
40
def __init__ (self ) -> None :
@@ -84,16 +97,34 @@ def draw_mesh_lines(surface, mesh, vp_matrix):
84
97
pygame .gfxdraw .line (surface , int (c .x ), int (c .y ), int (b .x ), int (b .y ), (255 , 255 , 255 ))
85
98
pygame .gfxdraw .line (surface , int (a .x ), int (a .y ), int (c .x ), int (c .y ), (255 , 255 , 255 ))
86
99
100
+ def draw_mesh_triangles (surface , mesh , vp_matrix ):
101
+ width , height = surface .get_size ()
102
+
103
+ world_matrix = glm .mat4 (1 )
104
+ world_matrix = glm .translate (world_matrix , mesh .pos )
105
+ world_matrix = glm .rotate (world_matrix , mesh .rot .x , glm .vec3 (1 , 0 , 0 ))
106
+ world_matrix = glm .rotate (world_matrix , mesh .rot .y , glm .vec3 (0 , 1 , 0 ))
107
+ world_matrix = glm .rotate (world_matrix , mesh .rot .z , glm .vec3 (0 , 0 , 1 ))
108
+ world_matrix = glm .scale (world_matrix , mesh .scale )
109
+
110
+ for face in mesh .faces :
111
+ a ,b ,c = (glm .project (mesh .vertices [i ], world_matrix , vp_matrix , glm .vec4 (0 , 0 , width , height )) for i in face )
112
+ pygame .gfxdraw .filled_trigon (surface , int (a .x ), int (a .y ), int (b .x ), int (b .y ), int (c .x ), int (c .y ), (255 , 255 , 255 , 40 ))
113
+
114
+
87
115
def main ():
88
116
pygame .init ()
117
+ clock = pygame .time .Clock ()
89
118
pygame .display .set_caption ("minimal program" )
90
119
size = width , height = (800 , 600 )
91
120
screen = pygame .display .set_mode (size )
92
- mesh = Cube ()
93
- mesh2 = Cube ()
94
- mesh2 .pos = glm .vec3 (1 , 1 , 1 )
121
+ #mesh = Cube()
122
+ #mesh2 = Cube()
123
+ #mesh2.pos = glm.vec3(1, 1, 1)
124
+ mesh = Mesh ()
125
+ mesh .load_obj ("data/teapot.obj" )
126
+ mesh .scale = glm .vec3 (.02 , .02 , .02 )
95
127
camera = Camera ()
96
- camera .pos = glm .vec3 (0 , 0 , - 10 )
97
128
running = True
98
129
99
130
while running :
@@ -109,32 +140,32 @@ def main():
109
140
keys = pygame .key .get_pressed ()
110
141
movement = glm .vec3 (0 , 0 , 0 )
111
142
if keys [pygame .K_w ]:
112
- movement += camera .dir * .01
143
+ movement += camera .dir * .1
113
144
if keys [pygame .K_s ]:
114
- movement -= camera .dir * .01
145
+ movement -= camera .dir * .1
115
146
if keys [pygame .K_a ]:
116
- movement += glm .normalize (glm .cross (camera .dir , camera .up )) * .01
147
+ movement += glm .normalize (glm .cross (camera .dir , camera .up )) * .1
117
148
if keys [pygame .K_d ]:
118
- movement -= glm .normalize (glm .cross (camera .dir , camera .up )) * .01
149
+ movement -= glm .normalize (glm .cross (camera .dir , camera .up )) * .1
119
150
if keys [pygame .K_SPACE ]:
120
- movement += camera .up * .01
151
+ movement += camera .up * .1
121
152
if keys [pygame .K_LSHIFT ]:
122
- movement -= camera .up * .01
153
+ movement -= camera .up * .1
123
154
124
155
camera .pos += movement
125
156
126
- mesh .rot .x += 0.001
127
- mesh .rot .y += 0.002
128
- mesh .rot .z += 0.003
157
+ mesh .rot .x += 0.01
158
+ mesh .rot .y += 0.02
159
+ mesh .rot .z += 0.03
129
160
130
161
screen .fill ((0 , 0 , 0 ))
131
162
132
163
vp_matrix = glm .mat4 (1 )
133
164
vp_matrix = vp_matrix * glm .perspectiveFovLH (glm .radians (45 ), width , height , .1 , 100 )
134
165
vp_matrix = vp_matrix * glm .lookAt (camera .pos , camera .target , camera .up )
135
166
136
- for m in mesh , mesh2 :
137
- draw_mesh_lines (screen , m , vp_matrix )
167
+ for m in mesh ,:
168
+ draw_mesh_triangles (screen , m , vp_matrix )
138
169
139
170
origin = glm .project (glm .vec3 (0 , 0 , 0 ), glm .mat4 (1 ), vp_matrix , glm .vec4 (0 , 0 , width , height ))
140
171
for v in glm .vec3 (1 , 0 , 0 ), glm .vec3 (0 , 1 , 0 ), glm .vec3 (0 , 0 , 1 ):
@@ -146,10 +177,9 @@ def main():
146
177
pass
147
178
148
179
font = pygame .font .Font (pygame .font .get_default_font (), 20 )
149
- screen .blit (font .render (f"camera pos: f{ camera .pos } " , True , (255 , 255 , 0 )), (5 , 5 ))
150
- screen .blit (font .render (f"camera target: f{ camera .target } " , True , (255 , 255 , 0 )), (5 , 20 ))
151
-
180
+ screen .blit (font .render (str (int (clock .get_fps ())), True , (255 , 255 , 0 )), (5 , 5 ))
152
181
pygame .display .flip ()
182
+ clock .tick (60 )
153
183
154
184
155
185
if __name__ == "__main__" :
0 commit comments