Skip to content

Commit 3fe8e99

Browse files
committed
Initial commit
0 parents  commit 3fe8e99

File tree

7 files changed

+526
-0
lines changed

7 files changed

+526
-0
lines changed

README.rst

Whitespace-only changes.

poetry.lock

+378
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

py3d/__init__.py

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
__version__ = '0.1.0'

py3d/main.py

+119
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
import pygame
2+
import pygame.gfxdraw
3+
import glm
4+
5+
6+
class Camera:
7+
def __init__(self) -> None:
8+
self.pos = glm.vec3(0, 0, -10)
9+
self.dir = glm.vec3(0, 0, 1)
10+
self.up = glm.vec3(0, 1, 0)
11+
12+
@property
13+
def target(self):
14+
return self.pos + self.dir
15+
16+
17+
class Mesh:
18+
def __init__(self) -> None:
19+
self.pos = glm.vec3()
20+
self.rot = glm.vec3()
21+
self.scale = glm.vec3(1)
22+
self.vertices = []
23+
24+
25+
class Cube(Mesh):
26+
def __init__(self) -> None:
27+
super().__init__()
28+
self.vertices = [
29+
glm.vec3(-1.0, -1.0, 1.0),
30+
glm.vec3(1.0, -1.0, 1.0),
31+
glm.vec3(1.0, 1.0, 1.0),
32+
glm.vec3(-1.0, 1.0, 1.0),
33+
glm.vec3(-1.0, -1.0, -1.0),
34+
glm.vec3(1.0, -1.0, -1.0),
35+
glm.vec3(1.0, 1.0, -1.0),
36+
glm.vec3(-1.0, 1.0, -1.0),
37+
]
38+
39+
40+
def main():
41+
pygame.init()
42+
pygame.display.set_caption("minimal program")
43+
size = width, height = (800, 600)
44+
screen = pygame.display.set_mode(size)
45+
mesh = Cube()
46+
mesh2 = Cube()
47+
mesh2.pos = glm.vec3(1, 1, 1)
48+
camera = Camera()
49+
camera.pos = glm.vec3(0, 0, -10)
50+
running = True
51+
52+
while running:
53+
for event in pygame.event.get():
54+
if event.type == pygame.QUIT:
55+
running = False
56+
57+
mouse_rel = pygame.mouse.get_rel()
58+
if pygame.mouse.get_pressed()[0]:
59+
camera.dir = glm.rotateY(camera.dir, mouse_rel[0] * 0.01)
60+
camera.dir = glm.rotateX(camera.dir, mouse_rel[1] * 0.01)
61+
62+
keys = pygame.key.get_pressed()
63+
movement = glm.vec3(0, 0, 0)
64+
if keys[pygame.K_w]:
65+
movement += camera.dir * .01
66+
if keys[pygame.K_s]:
67+
movement -= camera.dir * .01
68+
if keys[pygame.K_a]:
69+
movement += glm.normalize(glm.cross(camera.dir, camera.up)) * .01
70+
if keys[pygame.K_d]:
71+
movement -= glm.normalize(glm.cross(camera.dir, camera.up)) * .01
72+
if keys[pygame.K_SPACE]:
73+
movement += camera.up * .01
74+
if keys[pygame.K_LSHIFT]:
75+
movement -= camera.up * .01
76+
77+
camera.pos += movement
78+
79+
mesh.rot.x += 0.001
80+
mesh.rot.y += 0.002
81+
mesh.rot.z += 0.003
82+
83+
screen.fill((0, 0, 0))
84+
85+
vp_matrix = glm.mat4(1)
86+
vp_matrix = vp_matrix * glm.perspectiveFovLH(glm.radians(45), width, height, .1, 100)
87+
vp_matrix = vp_matrix * glm.lookAt(camera.pos, camera.target, camera.up)
88+
89+
for m in mesh, mesh2:
90+
world_matrix = glm.mat4(1)
91+
world_matrix = glm.translate(world_matrix, m.pos)
92+
world_matrix = glm.rotate(world_matrix, m.rot.x, glm.vec3(1, 0, 0))
93+
world_matrix = glm.rotate(world_matrix, m.rot.y, glm.vec3(0, 1, 0))
94+
world_matrix = glm.rotate(world_matrix, m.rot.z, glm.vec3(0, 0, 1))
95+
world_matrix = glm.scale(world_matrix, m.scale)
96+
97+
for v in m.vertices:
98+
point = glm.project(v, world_matrix, vp_matrix, glm.vec4(0, 0, width, height))
99+
if 0 < point.x < width and 0 < point.y < height:
100+
pygame.gfxdraw.pixel(screen, int(point.x), int(point.y), (255, 255, 255))
101+
102+
origin = glm.project(glm.vec3(0, 0, 0), glm.mat4(1), vp_matrix, glm.vec4(0, 0, width, height))
103+
for v in glm.vec3(1, 0, 0), glm.vec3(0, 1, 0), glm.vec3(0, 0, 1):
104+
p = glm.project(v, glm.mat4(1), vp_matrix, glm.vec4(0, 0, width, height))
105+
try:
106+
pygame.gfxdraw.line(screen, int(origin.x), int(origin.y), int(p.x), int(p.y),
107+
(v * glm.vec3(255, 255, 255)))
108+
except:
109+
pass
110+
111+
font = pygame.font.Font(pygame.font.get_default_font(), 20)
112+
screen.blit(font.render(f"camera pos: f{camera.pos}", True, (255, 255, 0)), (5, 5))
113+
screen.blit(font.render(f"camera target: f{camera.target}", True, (255, 255, 0)), (5, 20))
114+
115+
pygame.display.flip()
116+
117+
118+
if __name__ == "__main__":
119+
main()

pyproject.toml

+23
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
[tool.poetry]
2+
name = "py3d"
3+
version = "0.1.0"
4+
description = ""
5+
authors = ["Mariano Lambir <[email protected]>"]
6+
7+
[tool.poetry.dependencies]
8+
python = "^3.10"
9+
pygame = "^2.1.2"
10+
numpy = "^1.23.0"
11+
pyrr = "^0.10.3"
12+
PyGLM = "^2.5.7"
13+
14+
[tool.poetry.dev-dependencies]
15+
pytest = "^5.2"
16+
17+
[build-system]
18+
requires = ["poetry-core>=1.0.0"]
19+
build-backend = "poetry.core.masonry.api"
20+
21+
[tool.pyright]
22+
venvPath="/home/mlambir/.cache/pypoetry/virtualenvs"
23+
venv="py3d-pzUNBTHX-py3.10"

tests/__init__.py

Whitespace-only changes.

tests/test_py3d.py

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
from py3d import __version__
2+
3+
4+
def test_version():
5+
assert __version__ == '0.1.0'

0 commit comments

Comments
 (0)