def projection_vectorielle(pt): vector = v.diference3D(pt, position) if PROJECTIONSHERIQUE: vector.normalize() vector.dot(FOV) z = v.scalar(vector, direction) else: # z = abs(v.scalar(vector, direction)) z = v.scalar(vector, direction) vector.dot(FOV / z) x = v.scalar(vector, Dx) y = v.scalar(vector, Dz) # x = x*(screen/2) + screenX/2 # y = y*(screen/2) + screenY/2 x = x * (screen / 2) + screenX / 2 y = y * (screen / 2) + screenY / 2 # if x<0 or y<0 or x>screen or y>screen: # print(x, y) if z < 0: x -= screenX / 2 y -= screenY / 2 return x * screenX, y * screenY return x, y
def generate_faces_colored(mesh, material): dots, faces = mesh faces_ = [] for face in faces: vect1 = v.diference3D(dots[face[0]], dots[face[1]]) vect2 = v.diference3D(dots[face[0]], dots[face[2]]) vect = v.cross3D(vect1, vect2) vect.normalize() c = apply_light(material.get_color(), (1 + v.scalar(vect, light)) / 2, material.get_light_power()) faces_.append(bs.Face(*get_vectors_face(face, dots), c, material)) return faces_
def update_mesh_3D(mesh): cinetique, mesh_ = mesh dots, faces = mesh_ r=resoluion+1 newDots = [] n = len(dots) for i in range(n): vz, az = cinetique[i] vector = dots[i] d = 0 xi, yi, zi = vector.get_coord() if i%r != r - 1: d+= dots[i+1].getZ() - zi elif solidWall: d+= dots[i-1].getZ() - zi if i%r != 0: d+= dots[i-1].getZ() - zi elif solidWall: d+= dots[i+1].getZ() - zi if i//r != r - 1: d+= dots[i+r].getZ() - zi elif solidWall: d+= dots[i-r].getZ() - zi if i//r != 0: d+= dots[i-r].getZ() - zi elif solidWall: d+= dots[i+r].getZ() - zi az=d/8 az/=2 vz+=az*dt zi+=vz*dt cinetique[i] = (vz, az) newDots.append( v.Vector3D(xi, yi, zi, False)) return cinetique, (newDots, faces)
def get_virtual_screen(direction, screenX, screenY): if direction.getX() == 0: Dx = v.Vector3D(1, 0, 0) else: x = direction.getX() y = direction.getY() rap = (y / x)**2 + 1 yi = 1 / ((rap)**0.5) if x < 0: yi *= -1 xi = (1 - (1 / rap))**0.5 Dx = v.Vector3D(xi, yi, 0) Dx.normalize() Dz = v.cross3D(direction, Dx) Dz.normalize() # rapport = screenX/screenX # Dz.dot(rapport) return Dx, Dz
def __init__(self, pt1, pt2, pt3, color, material=None): self.p1 = pt1 self.p2 = pt2 self.p3 = pt3 self.color = color self.material = material x = pt1.getX() + pt2.getX() + pt3.getX() y = pt1.getY() + pt2.getY() + pt3.getY() z = pt1.getZ() + pt2.getZ() + pt3.getZ() self.middle = v.Vector3D(x / 3, y / 3, z / 3) self.preRender = False self.pixelInner = [] self.pixelBorder = []
def get_vector(passage, vector): x, y, z = vector.get_coord() return v.Vector3D(*dot(passage, [[x], [y], [z]]))
def get_point(passage, point, position): x, y, z = point.get_coord() xp, yp, zp = position.get_coord() vecteur = [[x - xp], [y - yp], [z - zp]] return v.Vector3D(*dot(passage, vecteur))
dt = 1 time = 0 RECORDED = False bs.visualiseImage = True bs.animatedImage = True fileName ="test" resoluion = 10 itemResolution = 2 bs.FILL = True bs.LINE = True nbImages = 10 MOVEMOUSE = False p.PROJECTIONSHERIQUE = True p.FOV = 2 light = v.Vector3D(10,-5,-3) light.normalize() lightColor = ims.Color(200, 200, 200, 0.8) waterColorMin = ims.Color(0, 0, 50) waterColorMax = ims.Color(0, 0, 50) wallColorMin = ims.Color(96, 80, 80) wallColorMax = ims.Color(96, 80, 80) itemColorMin = ims.Color(107, 103, 0) itemColorMax = ims.Color(110, 110, 10) waterMaterial = ims.Material(waterColorMin, waterColorMax, 1) wallMaterial = ims.Material(wallColorMin, wallColorMax, 1) itemMaterial = ims.Material(itemColorMin, itemColorMax, 1)
def sorted_face(face): return -v.distance(face.middle, position)
# -*- coding: utf-8 -*- """ Created on Sat Mar 23 10:15:26 2019 @author: pierrehb """ import MyLibrairy.Vectors as v import MyLibrairy.imagesSavor as ims import MyLibrairy.basicScreen as bs light = v.Vector3D(0, 0, 0) position = v.Vector3D(0, 0, 0) direction = v.Vector3D(0, 0, 0) Dx = v.Vector3D(0, 0, 0) Dz = v.Vector3D(0, 0, 0) lightColor = ims.Color(0, 0, 0) screenX = 0 screenY = 0 screen = 0 PROJECTIONSHERIQUE = False FOV = 3 def get_virtual_screen(direction, screenX, screenY): if direction.getX() == 0: Dx = v.Vector3D(1, 0, 0) else: x = direction.getX() y = direction.getY() rap = (y / x)**2 + 1