Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import tkinter
- from tkinter import filedialog as fd
- import math
- class Program(object):
- def __init__(self):
- self.matica = [[100,0,0,0],[0,-100,0,0],[0,0,100,0],[300,200,0,1]]
- self.zaciatok = [[1,0,0,0],[0,1,0,0],[0,0,0,0],[-300,-200,0,1]]
- self.spat = [[1,0,0,0],[0,1,0,0],[0,0,0,0],[300,200,0,1]]
- self.angle = math.radians(5)
- self.subor = ""
- self.report = ""
- master = tkinter.Tk()
- self.g = tkinter.Canvas(height= 400, width = 600, bg = "white")
- self.red = tkinter.StringVar()
- self.green = tkinter.StringVar()
- self.blue = tkinter.StringVar()
- self.intenzita_value = tkinter.StringVar()
- self.x_surad=tkinter.StringVar()
- self.y_surad=tkinter.StringVar()
- self.z_surad=tkinter.StringVar()
- self.color=''
- self.light = [100,0,0]
- self.rendered = False
- self.sila=10
- self._oldvaluex=0
- self._oldvaluey=0
- self._oldvaluez=0
- self.kolkox=0
- self.vrcholy=[]
- self.posx=0
- self.posz=0
- self.posy=0
- self.color=''
- self.rgb=None
- self.sila=10
- self.sur_svetla=[3,3,5]
- self.g.grid(row=0,column=0,columnspan=20)
- load_button = tkinter.Button(master, text="LOAD .obj FILE", command=self.load)
- load_button.grid(row=1,column=1)
- draw_button = tkinter.Button(master, text="DRAW", command=self.draw)
- draw_button.grid(row=2,column=1)
- txplus_button = tkinter.Button(master, text="x+", command=self.trans_x)
- txplus_button.grid(row=1,column=2)
- txminus_button = tkinter.Button(master, text="x-", command=lambda:self.trans_x(False))
- txminus_button.grid(row=1,column=3)
- typlus_button = tkinter.Button(master, text="y+", command=self.trans_y)
- typlus_button.grid(row=2,column=2)
- tyminus_button = tkinter.Button(master, text="y-", command=lambda:self.trans_y(False))
- tyminus_button.grid(row=2,column=3)
- tzplus_button = tkinter.Button(master, text="z+", command=self.trans_z)
- tzplus_button.grid(row=3,column=2)
- tzminus_button = tkinter.Button(master, text="z-", command=lambda:self.trans_z(False))
- tzminus_button.grid(row=3,column=3)
- splus_button = tkinter.Button(master, text="scale+", command=self.scale)
- splus_button.grid(row=1,column=4)
- sminus_button = tkinter.Button(master, text="scale-", command=lambda:self.scale(False))
- sminus_button.grid(row=2,column=4)
- rxplus_button = tkinter.Button(master, text="rotate x+", command=self.rot_x)
- rxplus_button.grid(row=1,column=5)
- rxminus_button = tkinter.Button(master, text="rotate x-", command=lambda:self.rot_x(False))
- rxminus_button.grid(row=1,column=6)
- ryplus_button = tkinter.Button(master, text="rotate y+", command=self.rot_y)
- ryplus_button.grid(row=2,column=5)
- ryminus_button = tkinter.Button(master, text="rotate y-", command=lambda:self.rot_y(False))
- ryminus_button.grid(row=2,column=6)
- rzplus_button = tkinter.Button(master, text="rotate z+", command=self.rot_z)
- rzplus_button.grid(row=3,column=5)
- rzminus_button = tkinter.Button(master, text="rotate z-", command=lambda:self.rot_z(False))
- rzminus_button.grid(row=3,column=6)
- self.label_intenzita=tkinter.Label(master,text="Intenzita:")
- self.label_intenzita.grid(row=4,column=7)
- self.intenzita=tkinter.Entry(master,textvariable=self.intenzita_value,width=8)
- self.intenzita.grid(row=4,column=8)
- self.label_x=tkinter.Label(master,text=" X: ")
- self.label_x.grid(row=1,column=9)
- self.vstup_x=tkinter.Entry(master,textvariable=self.x_surad,width=8)
- self.vstup_x.grid(row=1,column=10)
- self.label_y=tkinter.Label(master,text=" Y: ")
- self.label_y.grid(row=2,column=9)
- self.vstup_y=tkinter.Entry(master,textvariable=self.y_surad,width=8)
- self.vstup_y.grid(row=2,column=10)
- self.label_z=tkinter.Label(master,text=" Z: ")
- self.label_z.grid(row=3,column=9)
- self.vstup_z=tkinter.Entry(master,textvariable=self.z_surad,width=8)
- self.vstup_z.grid(row=3,column=10)
- self.re_paint=tkinter.Button(master,width=15,text="WireFrame",command=self.repaint)
- self.re_paint.grid(row=2,column=7)
- self.render=tkinter.Button(master,width=15,text="Render",command=self.render)
- self.render.grid(row=1,column=7)
- tkinter.mainloop()
- def draw(self):
- self.g.delete("all")
- self.zaciatok = [[1,0,0,0],[0,1,0,0],[0,0,1,0],[-300,-200,0,1]]
- self.spat = [[1,0,0,0],[0,1,0,0],[0,0,1,0],[300,200,0,1]]
- if self.subor == "":
- self.report = self.g.create_text(85,390, text = "No file loaded", font = "Arial 20", fill = "red")
- return
- if self.report:
- self.g.delete(self.report)
- t = open(self.subor, "r")
- pole = list()
- for riadok in t:
- pole_riadok = riadok.strip().split()
- if pole_riadok[0] in "vf":
- pole.append(pole_riadok)
- self.vertices = list()
- self.edges = list()
- for prvok in pole:
- if prvok[0] == "v":
- prvok.append("1")
- prvok = [prvok[1],prvok[2],prvok[3],prvok[4]]
- novy_bod = self.nasob_maticou(prvok, self.matica,False)
- self.vertices.append((novy_bod[0], novy_bod[1], novy_bod[2], novy_bod[3]))
- elif prvok[0] == "f":
- points = [(self.vertices[int(x)-1][0],self.vertices[int(x)-1][1]) for x in prvok[1:]]
- points2 = [(self.vertices[int(x)-1][0],self.vertices[int(x)-1][1],self.vertices[int(x)-1][2] ) for x in prvok[1:]]
- if len(points) >=3:
- self.edges.append((self.g.create_polygon(points,fill = "", outline = "black"),points2))
- else:
- self.edges.append((self.g.create_line(points),points2))
- def repaint(self):
- if self.rendered:
- if self.red.get():
- if 0<=int(self.red.get())<=255:
- self.color[0]=int(self.red.get())
- if self.green.get():
- if 0<=int(self.green.get())<=255:
- self.color[1]=int(self.green.get())
- if self.blue.get():
- if 0<=int(self.blue.get())<=255:
- self.color[2]=int(self.blue.get())
- if self.intenzita_value.get():
- if 0<=float(self.intenzita_value.get())<1:
- self.intenzita=float(self.intenzita_value.get())
- if self.x_surad.get():
- self.light[0]=int(self.x_surad.get())
- if self.y_surad.get():
- self.light[1]=int(self.y_surad.get())
- if self.z_surad.get():
- self.light[2]=int(self.z_surad.get())
- self.re_draw()
- def render(self):
- try:
- farba=tkinter.colorchooser.askcolor()
- self.g.delete('all')
- self.rgb=farba[0]
- self.color=farba[1]
- self.kresli()
- except:
- self.color=''
- pass
- def farba(self,intenzita):
- a=self.rgb[0]*intenzita
- b=self.rgb[1]*intenzita
- c=self.rgb[2]*intenzita
- a=round(a,0)
- b=round(b,0)
- c=round(c,0)
- farba='#{0:02x}{1:02x}{2:02x}'.format(int(a), int(b), int(c))
- return farba
- def kresli(self):
- vidit=0
- i=0
- if self.color!='':
- for p in self.edges:
- vidit=self.vektor(p[1])
- print(p[1])
- i=self.intensity(p[1])
- if vidit < 0:
- if i >0 and i <1:
- self.color=self.farba(i)
- elif i>=1:
- self.color='white'
- elif i<=0:
- self.color='black'
- self.g.create_polygon(p,fill=self.color,outline=self.color)
- else:
- for p in self.pocitanie():
- for j in range(len(p)):
- p[j]=p[j][:2]
- self.g.create_polygon(p,fill=self.color,outline='black')
- def re_draw(self):
- edges_temp = list()
- for prvok in self.edges:
- farba = self.get_color(prvok[1])
- edges_temp.append((self.g.create_polygon(prvok[1],fill = farba, outline = "black"),prvok[1]))
- self.edges = edges_temp
- def intensity(self,pole):
- v1=self.svetlo(pole)
- v2=self.vektor1(pole)
- return (v1[0]*v2[0]+v1[1]*v2[1]+v1[2]*v2[2])*self.sila
- def stredny_bod(self,pole):
- print("styri")
- if len(pole)==3:
- print("styri1")
- return [(pole[0][0]+pole[1][0]+pole[2][0])/3,(pole[0][1]+pole[1][1]+pole[2][1])/3,(pole[0][2]+pole[1][2]+pole[2][2])/3]
- if len(pole)==4:
- print("styri2")
- return [(pole[0][0]+pole[1][0]+pole[2][0]+pole[3][0])/4,(pole[0][1]+pole[1][1]+pole[2][1]+pole[3][1])/4,(pole[0][2]+pole[1][2]+pole[2][2]+pole[3][2])/4]
- def vektor1(self,pole):
- s_vektor1=[0,0,0]
- s_vektor2=[0,0,0]
- v1=[]
- normal=[]
- for i in pole:
- v1.append(i)
- s_vektor1[0]=v1[1][0]-v1[0][0]
- s_vektor1[1]=v1[1][1]-v1[0][1]
- s_vektor1[2]=v1[1][2]-v1[0][2]
- s_vektor2[0]=v1[2][0]-v1[0][0]
- s_vektor2[1]=v1[2][1]-v1[0][1]
- s_vektor2[2]=v1[2][2]-v1[0][2]
- normal=[(s_vektor1[1]*s_vektor2[2])-(s_vektor1[2]*s_vektor2[0]),(s_vektor1[2]*s_vektor2[0])-(s_vektor1[0]*s_vektor2[2]),(s_vektor1[0]*s_vektor2[1])-(s_vektor1[1]*s_vektor2[0])]
- velkost=(normal[0]**2+normal[1]**2+normal[2]**2)**(1/2)
- normal[0]=normal[0]/velkost
- normal[1]=normal[1]/velkost
- normal[2]=normal[2]/velkost
- return normal
- def svetlo(self,pole):
- print("som tu3")
- v1=self.stredny_bod(pole)
- smer=[0,0,0]
- smer[0]= self.sur_svetla[0]-v1[0]
- smer[1]= self.sur_svetla[1]-v1[1]
- smer[2]= self.sur_svetla[2]-v1[2]
- velkost=(smer[0]**2+smer[1]**2+smer[2]**2)**(1/2)
- smer[0]=smer[0]/velkost
- smer[1]=smer[0]/velkost
- smer[2]=smer[0]/velkost
- return smer
- def vektor(self,pole):
- print("aj tu")
- s_vektor1=[0,0,0]
- s_vektor2=[0,0,0]
- v1=[]
- normal=[]
- for i in pole:
- v1.append(i)
- s_vektor1[0]=v1[1][0]-v1[0][0]
- s_vektor1[1]=v1[1][1]-v1[0][1]
- s_vektor1[2]=v1[1][2]-v1[0][2]
- s_vektor2[0]=v1[2][0]-v1[1][0]
- s_vektor2[1]=v1[2][1]-v1[1][1]
- s_vektor2[2]=v1[2][2]-v1[1][2]
- normal=[(s_vektor1[1]*s_vektor2[2])-(s_vektor1[2]*s_vektor2[0]),(s_vektor1[2]*s_vektor2[0])-(s_vektor1[0]*s_vektor2[2]),(s_vektor1[0]*s_vektor2[1])-(s_vektor1[1]*s_vektor2[0])]
- kam=[0,0,1]
- uhol=kam[0]*normal[0]+kam[1]*normal[1]+kam[2]*normal[2]
- return uhol
- def nasob_maticou(self, bod, matica,normal = True):
- if normal == False:
- novy_bod = [None, None, None, None]
- novy_bod[0] = float(bod[0])*matica[0][0] + float(bod[1])*matica[1][0] + float(bod[2])*matica[2][0] + float(bod[3])*matica[3][0]
- novy_bod[1] = float(bod[0])*matica[0][1] + float(bod[1])*matica[1][1] + float(bod[2])*matica[2][1] + float(bod[3])*matica[3][1]
- novy_bod[2] = float(bod[0])*matica[0][2] + float(bod[1])*matica[1][2] + float(bod[2])*matica[2][2] + float(bod[3])*matica[3][2]
- novy_bod[3] = float(bod[0])*matica[0][3] + float(bod[1])*matica[1][3] + float(bod[2])*matica[2][3] + float(bod[3])*matica[3][3]
- return novy_bod
- else:
- novy_bod = [None, None, None, None]
- novy_bod[0] = bod[0]*matica[0][0] + bod[1]*matica[1][0] + bod[2]*matica[2][0] + bod[3]*matica[3][0]
- novy_bod[1] = bod[0]*matica[0][1] + bod[1]*matica[1][1] + bod[2]*matica[2][1] + bod[3]*matica[3][1]
- novy_bod[2] = bod[0]*matica[0][2] + bod[1]*matica[1][2] + bod[2]*matica[2][2] + bod[3]*matica[3][2]
- novy_bod[3] = bod[0]*matica[0][3] + bod[1]*matica[1][3] + bod[2]*matica[2][3] + bod[3]*matica[3][3]
- return novy_bod
- def trans_x(self,normal = True):
- self.g.delete("all")
- if normal:
- trans = [[1,0,0,0],[0,1,0,0],[0,0,1,0],[5,0,0,1]]
- self.zaciatok[3][0] -= 5
- self.spat[3][0] += 5
- else:
- trans = [[1,0,0,0],[0,1,0,0],[0,0,1,0],[-5,0,0,1]]
- self.zaciatok[3][0] += 5
- self.spat[3][0] -= 5
- edges_new = list()
- for prvok in self.edges:
- nove_pole = list()
- nove_pole2 = list()
- for bod in prvok[1]:
- bod = (bod[0],bod[1],bod[2],1)
- new_bod = self.nasob_maticou(bod,trans)
- nove_pole.append((new_bod[0],new_bod[1], new_bod[2]))
- nove_pole2.append((new_bod[0],new_bod[1]))
- edges_new.append((self.g.create_polygon(nove_pole2,fill = "", outline = "black"),nove_pole))
- self.edges = edges_new
- def trans_y(self, normal = True):
- self.g.delete("all")
- if normal:
- trans = [[1,0,0,0],[0,1,0,0],[0,0,1,0],[0,5,0,1]]
- self.zaciatok[3][1] -= 5
- self.spat[3][1] += 5
- else:
- trans = [[1,0,0,0],[0,1,0,0],[0,0,1,0],[0,-5,0,1]]
- self.zaciatok[3][1] += 5
- self.spat[3][1] -= 5
- edges_new = list()
- for prvok in self.edges:
- nove_pole = list()
- nove_pole2 = list()
- for bod in prvok[1]:
- bod = (bod[0],bod[1],bod[2],1)
- new_bod = self.nasob_maticou(bod,trans)
- nove_pole.append((new_bod[0],new_bod[1], new_bod[2]))
- nove_pole2.append((new_bod[0],new_bod[1]))
- edges_new.append((self.g.create_polygon(nove_pole2,fill = "", outline = "black"),nove_pole))
- self.edges = edges_new
- def trans_z(self, normal = True):
- self.g.delete("all")
- if normal:
- trans = [[1,0,0,0],[0,1,0,0],[0,0,1,0],[0,0,5,1]]
- self.zaciatok[3][2] -= 5
- self.spat[3][2] += 5
- else:
- trans = [[1,0,0,0],[0,1,0,0],[0,0,1,0],[0,0,-5,1]]
- self.zaciatok[3][2] += 5
- self.spat[3][2] -= 5
- edges_new = list()
- for prvok in self.edges:
- nove_pole = list()
- nove_pole2 = list()
- for bod in prvok[1]:
- bod = (bod[0],bod[1],bod[2],1)
- new_bod = self.nasob_maticou(bod,trans)
- nove_pole.append((new_bod[0],new_bod[1], new_bod[2]))
- nove_pole2.append((new_bod[0],new_bod[1]))
- edges_new.append((self.g.create_polygon(nove_pole2,fill = "", outline = "black"),nove_pole))
- self.edges = edges_new
- def scale(self, normal = True):
- self.g.delete("all")
- if normal:
- scale = [[1.1,0,0,0],[0,1.1,0,0],[0,0,1.1,0],[0,0,0,1]]
- else:
- scale = [[0.9,0,0,0],[0,0.9,0,0],[0,0,0.9,0],[0,0,0,1]]
- edges_new = list()
- self.start()
- for prvok in self.edges:
- nove_pole = list()
- for bod in prvok[1]:
- bod = (bod[0],bod[1],bod[2],1)
- new_bod = self.nasob_maticou(bod,scale)
- nove_pole.append((new_bod[0],new_bod[1], new_bod[2]))
- points = [(x[0],x[1]) for x in nove_pole]
- edges_new.append((None,nove_pole))
- self.edges = edges_new
- self.back()
- def rot_x(self, normal = True):
- self.g.delete("all")
- if normal:
- rotation = [[1,0,0,0],
- [0,math.cos(self.angle),-math.sin(self.angle),0],
- [0,math.sin(self.angle),math.cos(self.angle),0],
- [0,0,0,1]]
- else:
- rotation = [[1,0,0,0],
- [0,math.cos(self.angle),math.sin(self.angle),0],
- [0,-math.sin(self.angle),math.cos(self.angle),0],
- [0,0,0,1]]
- edges_new = list()
- self.start()
- for prvok in self.edges:
- nove_pole = list()
- for bod in prvok[1]:
- bod = (bod[0],bod[1],bod[2],1)
- new_bod = self.nasob_maticou(bod,rotation)
- nove_pole.append((new_bod[0],new_bod[1], new_bod[2]))
- points = [(x[0],x[1]) for x in nove_pole]
- edges_new.append((None,nove_pole))
- self.edges = edges_new
- self.back()
- def rot_y(self, normal = True):
- self.g.delete("all")
- if normal:
- rotation = [[math.cos(self.angle),0,-math.sin(self.angle),0],
- [0,1,0,0],
- [math.sin(self.angle),0,math.cos(self.angle),0],
- [0,0,0,1]]
- else:
- rotation = [[math.cos(self.angle),0,math.sin(self.angle),0],
- [0,1,0,0],
- [-math.sin(self.angle),0,math.cos(self.angle),0],
- [0,0,0,1]]
- edges_new = list()
- self.start()
- for prvok in self.edges:
- nove_pole = list()
- for bod in prvok[1]:
- bod = (bod[0],bod[1],bod[2],1)
- new_bod = self.nasob_maticou(bod,rotation)
- nove_pole.append((new_bod[0],new_bod[1], new_bod[2]))
- points = [(x[0],x[1]) for x in nove_pole]
- edges_new.append((None,nove_pole))
- self.edges = edges_new
- self.back()
- def rot_z(self, normal = True):
- self.g.delete("all")
- if normal:
- rotation = [[math.cos(self.angle),-math.sin(self.angle),0,0],
- [math.sin(self.angle),math.cos(self.angle),0,0],
- [0,0,1,0],
- [0,0,0,1]]
- else:
- rotation = [[math.cos(self.angle),math.sin(self.angle),0,0],
- [-math.sin(self.angle),math.cos(self.angle),0,0],
- [0,0,1,0],
- [0,0,0,1]]
- edges_new = list()
- self.start()
- for prvok in self.edges:
- nove_pole = list()
- for bod in prvok[1]:
- bod = (bod[0],bod[1],bod[2],1)
- new_bod = self.nasob_maticou(bod,rotation)
- nove_pole.append((new_bod[0],new_bod[1], new_bod[2]))
- points = [(x[0],x[1]) for x in nove_pole]
- edges_new.append((None,nove_pole))
- self.edges = edges_new
- self.back()
- def start(self):
- edges_new = list()
- for prvok in self.edges:
- nove_pole = list()
- for bod in prvok[1]:
- bod = (bod[0],bod[1],bod[2],1)
- new_bod = self.nasob_maticou(bod,self.zaciatok)
- nove_pole.append((new_bod[0],new_bod[1], new_bod[2]))
- points = [(x[0],x[1]) for x in nove_pole]
- edges_new.append((None,nove_pole))
- self.edges = edges_new
- def back(self):
- edges_new = list()
- for prvok in self.edges:
- nove_pole = list()
- for bod in prvok[1]:
- bod = (bod[0],bod[1],bod[2],1)
- new_bod = self.nasob_maticou(bod,self.spat)
- nove_pole.append((new_bod[0],new_bod[1], new_bod[2]))
- points = [(x[0],x[1]) for x in nove_pole]
- edges_new.append((self.g.create_polygon(points,fill = "", outline = "black"),nove_pole))
- self.edges = edges_new
- def load(self):
- self.subor = fd.askopenfilename()
- if self.subor[-4:] != ".obj":
- if self.report:
- self.g.delete(self.report)
- self.report = self.g.create_text(110,385, text = "Wrong file format", font = "Arial 20" , fill = "red")
- self.subor = ""
- else:
- if self.report:
- self.g.delete(self.report)
- self.report = self.g.create_text(140,390, text = "File loaded...let's draw", font = "Arial 20")
- a = Program()
- #a.draw("square.obj")
- #a.draw("cylinder.obj")
- #a.draw("monkey.obj")
- #a.draw("Buzz.obj")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement