AS3.0 で 3D プログラミングを1から勉強する (3) - 透視投影CommentsAdd Star

うお、すげえ。…と言うわけでこの前のプログラムにパースをつけてみる。

#!/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):
        interval = self.viewPoint.get()*100 / (self.viewPoint.get()*100 + float(z))
        x = x*interval
        y = y*interval
        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))
        if orgR==0:
            return (x,y)
        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.viewPoint = Tkinter.Scale(self.window, from_=1, to=100,
                                       orient=Tkinter.HORIZONTAL)
        self.viewPoint.bind("<ButtonRelease-1>",self.angleChanged)
        self.viewPoint.bind("<ButtonPress-1>",self.angleChanged)
        self.viewPoint.bind("<B1-Motion>",self.angleChanged)
        self.viewPoint.set(100)
        self.viewPoint.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()