plane_3D_demo/main.py

89 lines
1.9 KiB
Python

# 3D cube
# by mibi88
from line import *
import math
#width(3)
# unsed some code from https://www.mfitzp.com/creating-a-3d-rotating-cube-with-micropython-and-oled-display/
vertices = [
[1,0,1],
[2,0,-1],
[0,0,-1],
[1,1,-1],
]
edges = [
[0, 1],
[0, 2],
[0, 3],
[1, 2],
[2, 3],
[1, 3],
]
a=0
def rotate_x(sx, sy, sz, deg):
rad = deg * math.pi / 180
cosa = math.cos(rad)
sina = math.sin(rad)
y = sy * cosa - sz * sina
z = sy * sina + sz * cosa
return [sx, y, z]
def rotate_y(sx, sy, sz, angle):
rad = angle * math.pi / 180
cosa = math.cos(rad)
sina = math.sin(rad)
z = sz * cosa - sx * sina
x = sz * sina + sx * cosa
return [x, sy, z]
def rotate_z(sx, sy, sz, angle):
rad = angle * math.pi / 180
cosa = math.cos(rad)
sina = math.sin(rad)
x = sx * cosa - sy * sina
y = sx * sina + sy * cosa
return [x, y, sz]
def project(sx, sy, sz, px, py, fov = 60, viewer_distance = 8):
factor = fov / (viewer_distance + sz)
x = sx * factor + px
y = -sy * factor + py
return [x, y]
def render(vertices, edges, rx, ry, rz, px, py, fov = 60, viewer_distance = 6):
rx = rx%360
ry = ry%360
rz = rz%360
points = []
for i in vertices:
i = rotate_x(i[0], i[1], i[2], rx)
i = rotate_y(i[0], i[1], i[2], ry)
i = rotate_z(i[0], i[1], i[2], rz)
pos = project(i[0], i[1], i[2], px, py, fov, viewer_distance)
points.append(pos)
#clear()
for i in edges:
line(points[i[0]], points[i[1]])
def draw():
clear_screen()
global a
global vertices, edges
#render(vertices, edges, 345, a, 0, 32, 16)
render(vertices, edges, a, a, 0, 64, 32)
a+=1
show_screen()
while 1:
draw()
"""for i in range(1000):
pass"""
"""draw()"""