# coding=utf-8 #必須指定 # df_maze.py # 21-02-07 cube3.py # 21-02-09 cube5.py #!/usr/bin/env python import numpy as np import sys , traceback , os import pdb from collections import deque import math from struct import * import copy import random if sys.version[0] == '2': import Tkinter as tk else: import tkinter as tk import random from p3drect import Room3d class example(): def __init__(self): self.rm3d = Room3d() # class Room3dの実体化 self.rm3d.c0.bind("",self.quit) self.rm3d.c0.bind("",self.initmx) self.rm3d.c0.bind("" ,self.keyup) # 視点の高さ変更 self.rm3d.c0.bind("" ,self.keydown) self.packtoggle = False self.packsizel = 100.0 self.packsizes = 80.0 self.hoge = self.generate_packman() # cubeの生成 # スプライトオブジェクトの生成 self.packsizel = 10.0 self.packsizes = 16.0 self.subcube = self.generate_packman(psc='#dd34f1') self.run() # 視点の回転処理 tk.mainloop() def quit(self,event=None): print ("quit") self.rm3d.c0.destroy() sys.exit() def keyup(self,event=None): self.za += 10 print ("za=",self.za) def keydown(self,event=None): self.za -= 10 print ("za=",self.za) def initmx(self,event=None): self.rm3d.initmx = True def run(self): inc = 01.0 pl = 0 self.rl = 200.0 # 視線の回転半径 self.za = 100.0 # 視線の高さ初期値 self.sp = 2.0 self.rotanginc = (np.pi/180.0) * self.sp self.rotdir = 0 # 0:stay 1:inc 2:dec self.runstep = 0 subcubepos = 0 self.rm3d.dest = [ 0,0,0] # 視線の先の座標 while True: xa = 0.0 xa2 = 0.0 self.rotang = 0.0 while True: self.rm3d.cposx = np.sin(xa)*self.rl + self.rm3d.dest[0] self.rm3d.cposy = np.cos(xa)*self.rl + self.rm3d.dest[1] self.rm3d.cposz = self.za self.rm3d.cpos = [ self.rm3d.cposx , self.rm3d.cposy , self.rm3d.cposz] # スプライトオブジェクトの位置指定 subhoge = self.rm3d.solve_pack(self.subcube[0],[subcubepos,20,120]) # hoge = self.rm3d.solve(self.hoge[0]) # 含まれるレクタングルをスクリーンに射影 doge = self.rm3d.reorder(hoge,subhoge) # 陰線処理とスプライトオブジェクトの混合 boge = self.rm3d.shift2center(doge) # 拡大率を自動調節 self.rm3d.drawwall(boge) # 表示 xa2 += (0.2*np.pi/360.0) # 視点を円周上で回転 xa = xa2 % 2*np.pi self.runstep += 1 if self.runstep > 360: self.startflag = True subcubepos += 1 # スプライトオブジェクトの座標を指定 if subcubepos > 140: subcubepos = -140 pass def generate_packman(self,psc='#ffff00'): self.psc = psc if self.packtoggle: self.ps = self.packsizel self.packtoggle = False else: self.ps = self.packsizes self.packtoggle = True # object format # [ # plane [ # obj [ # apec[x,y,z] , # apec[x,y,z] , # apec[x,y,z] , # apec[x,y,z] , # [媒介変数格納用], # [色], # [予備] # solveには、planeのレイヤで渡す packman = [[ [[-self.ps,-self.ps,-self.ps],[+self.ps,-self.ps,-self.ps], [+self.ps,+self.ps,-self.ps],[-self.ps,+self.ps,-self.ps],[0],[self.psc],[0] ], [[-self.ps,-self.ps,+self.ps],[+self.ps,-self.ps,+self.ps], [+self.ps,+self.ps,+self.ps],[-self.ps,+self.ps,+self.ps],[0],[self.psc],[0] ], [[-self.ps,-self.ps,-self.ps],[+self.ps,-self.ps,-self.ps], [+self.ps,-self.ps,+self.ps],[-self.ps,-self.ps,+self.ps],[0],[self.psc],[0] ], [[-self.ps,+self.ps,-self.ps],[+self.ps,+self.ps,-self.ps], [+self.ps,+self.ps,+self.ps],[-self.ps,+self.ps,+self.ps],[0],[self.psc],[0] ], [[-self.ps,-self.ps,-self.ps],[-self.ps,+self.ps,-self.ps], [-self.ps,+self.ps,+self.ps],[-self.ps,-self.ps,+self.ps],[0],[self.psc],[0] ], [[+self.ps,-self.ps,-self.ps],[+self.ps,+self.ps,-self.ps], [+self.ps,+self.ps,+self.ps],[+self.ps,-self.ps,+self.ps],[0],[self.psc],[0] ], ]] return packman def HelloWorld(): print ("Hello World!") ex = example() if __name__=="__main__": HelloWorld()