■
ワイヤーフレーム表示。
下の方のスライダ(左からX軸、Y軸、Z軸)で読み込んだ(openボタン)ワイヤーフレームのデータを回転する。
#!/usr/bin/env python import Tkinter import tkFileDialog import math class wireFrame: def clickOpenFile(self): fileName = tkFileDialog.askopenfilename() self.openFile(fileName) def cnvMap(self,x,y,z): return (x-self.width/2,y*-1+self.height/2) def cnvCanvas(self,x,y,z): return (x+self.width/2,(y-self.height/2)*-1) def roll(self,x,y,degree): (orgX,orgY) = (x,y) orgR = math.sqrt(math.pow(orgX,2)+math.pow(orgY,2)) orgTheta = math.atan2(orgY/orgR,orgX/orgR) theta = math.radians(degree)+orgTheta x = math.cos(theta)*orgR y = math.sin(theta)*orgR return (x,y) def roll3DbySetting(self,x,y,z): x,y = self.roll(x,y,self.zAxisRollAngle.get()) y,z = self.roll(y,z,self.xAxisRollAngle.get()) x,z = self.roll(x,z,self.yAxisRollAngle.get()) return (x,y,z) def createObject(self,item): if item[0]=='line': (itemType,sx,sy,sz,ex,ey,ez) = (item[0], int(item[1]),int(item[2]),int(item[3]), int(item[4]),int(item[5]),int(item[6])) (rsx,rsy,rsz) = self.roll3DbySetting(sx,sy,sz) (rex,rey,rez) = self.roll3DbySetting(ex,ey,ez) (lineSx,lineSy) = self.cnvCanvas(rsx,rsy,rsz) (lineEx,lineEy) = self.cnvCanvas(rex,rey,rez) line = self.canvas.create_line(lineSx,lineSy, lineEx,lineEy, fill="red",width=3) self.objects.append((line,itemType,sx,sy,sz,ex,ey,ez)) else: pass pass def openFile(self,fileName): f = open(fileName) for row in f: row = row.replace('\n','') if row=='':continue item = row.split(',') obj = self.createObject(item) f.close() def angleChanged(self,event): for ii in range(len(self.objects)): item,itemType,sx,sy,sz,ex,ey,ez = self.objects[ii] (rsx,rsy,rsz) = self.roll3DbySetting(sx,sy,sz) (rex,rey,rez) = self.roll3DbySetting(ex,ey,ez) (lineSx,lineSy) = self.cnvCanvas(rsx,rsy,rsz) (lineEx,lineEy) = self.cnvCanvas(rex,rey,rez) self.canvas.coords(item,lineSx,lineSy,lineEx,lineEy) def __init__(self): self.window = Tkinter.Tk() self.width = 640 self.height = 480 self.canvas = Tkinter.Canvas(self.window,bg="white", width=self.width,height=self.height) self.canvas.pack() self.xAxisRollAngle = Tkinter.Scale(self.window, from_=0, to=360, orient=Tkinter.HORIZONTAL) self.xAxisRollAngle.bind("<ButtonPress-1>",self.angleChanged) self.xAxisRollAngle.bind("<ButtonRelease-1>",self.angleChanged) self.xAxisRollAngle.bind("<B1-Motion>",self.angleChanged) self.xAxisRollAngle.pack(side=Tkinter.LEFT); self.yAxisRollAngle = Tkinter.Scale(self.window, from_=0, to=360, orient=Tkinter.HORIZONTAL) self.yAxisRollAngle.bind("<ButtonPress-1>",self.angleChanged) self.yAxisRollAngle.bind("<ButtonRelease-1>",self.angleChanged) self.yAxisRollAngle.bind("<B1-Motion>",self.angleChanged) self.yAxisRollAngle.pack(side=Tkinter.LEFT); self.zAxisRollAngle = Tkinter.Scale(self.window, from_=0, to=360, orient=Tkinter.HORIZONTAL) self.zAxisRollAngle.bind("<ButtonRelease-1>",self.angleChanged) self.zAxisRollAngle.bind("<ButtonPress-1>",self.angleChanged) self.zAxisRollAngle.bind("<B1-Motion>",self.angleChanged) self.zAxisRollAngle.pack(side=Tkinter.LEFT); self.btnOpenFile = Tkinter.Button(self.window,text="open",command=self.clickOpenFile) self.btnOpenFile.pack(side=Tkinter.RIGHT) self.objects = [] self.window.mainloop() wireFrame()
読み込むデータはこんな感じ。
line,-100,100,-100,100,100,-100 line,100,100,-100,100,-100,-100 line,100,-100,-100,-100,-100,-100 line,-100,-100,-100,-100,100,-100 line,-100,100,-100,-100,100,100, line,100,100,-100,100,100,100, line,100,-100,-100,100,-100,100, line,-100,-100,-100,-100,-100,100, line,-100,100,100,100,100,100 line,100,100,100,100,-100,100 line,100,-100,100,-100,-100,100 line,-100,-100,100,-100,100,100