# 3D cube # by mibi88 from PLANE.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()"""