Zバッファなし
遠い昔、ブログがなかったころ、Javaで箱を使って関節っぽい演算をしてロボットっぽいものを歩かせたりしたこともあったのを思い出す。
ただどうやって実装していたのか?
油断していると自分の技術のスパイラルが小さくなって、自分の中にオーパーツが生まれつつある。
遠い昔、ブログがなかったころ、Javaで箱を使って関節っぽい演算をしてロボットっぽいものを歩かせたりしたこともあったのを思い出す。
ただどうやって実装していたのか?
油断していると自分の技術のスパイラルが小さくなって、自分の中にオーパーツが生まれつつある。
import pygame import math import copy import random pygame.init() window_size = (800, 600) clock = pygame.time.Clock() screen = pygame.display.set_mode(window_size) print (pygame.ver) class Point: def __init__(self,x,y,z): self.x=x self.y=y self.z=z class Box: def __init__(self,co,size,point): self.tten=[] self.tten.append((-1,-1,1)) self.tten.append((1,-1,1)) self.tten.append((1,-1,-1)) self.tten.append((-1,-1,-1)) self.tten.append((-1,1,1)) self.tten.append((1,1,1)) self.tten.append((1,1,-1)) self.tten.append((-1,1,-1)) self.poly=[] self.poly.append([0,1,2,3]) self.poly.append([4,5,6,7]) self.poly.append([1,2,6,5]) self.poly.append([0,3,7,4]) self.poly.append([0,1,5,4]) self.poly.append([3,2,6,7]) self.xy8=[] self.wk8=[] self.co=co self.resize(size,size,size) self.point = point self.th=0 self.ths=random.randint(-30,30) def resize(self,sx,sy,sz): for i in range(8): x,y,z=self.tten[i] self.tten[i]=(x*sx,y*sy,z*sz) def draw(self,screen): self.toWk() ct=math.cos(self.th*3.1415/360) st=math.sin(self.th*3.1415/360) self.turnY(ct,st) self.shift(self.point) self.conv3d2d() for i in range(6): xy4=[] for j in range(4): xy4.append( self.xy8[self.poly[i][j]] ) pygame.draw.polygon(screen, self.co, xy4) def conv3d2d(self): del self.xy8[:] for i in range(len(self.wk8)): x,y,z=self.wk8[i] self.xy8.append(self.conv(x,y,z)) def conv(self,x,y,z): d=200 rx=x*d/(d+z)+400 ry=y*d/(d+z)+300 return (rx,ry) def toWk(self): self.wk8=copy.deepcopy(self.tten) def backWk(self): self.tten=copy.deepcopy(self.wk8) def shift(self,point): for i in range(len(self.wk8)): x,y,z=self.wk8[i] self.wk8[i]=(x+point.x,y+point.y,z+point.z) def pointSet(self,x,y,z): self.point = Point(x,y,z) def turnY(self,ct,st): for i in range(len(self.wk8)): x,y,z=self.wk8[i] rx=x*ct-z*st rz=x*st+z*ct self.wk8[i]=(rx,y,rz) def turnZ(self,ct,st): for i in range(len(self.wk8)): x,y,z=self.wk8[i] rx=x*ct-y*st ry=x*st+y*ct self.wk4[i]=(rx,ry,z) def turnX(self,ct,st): for i in range(len(self.wk8)): x,y,z=self.wk8[i] ry=y*ct-z*st rz=y*st+z*ct self.wk4[i]=(x,ry,rz) def boxAll(): for i in range(1000): b.append( Box((250,200,60),50,Point(0,0,0)) ) for x in range(10): for y in range(10): for z in range(10): b[x*100+y*10+z].pointSet(x*500-2500,y*500-2000,800+z*500) b=[] def main(): boxAll() bg_color = (0, 0, 0) end_game = False tn=0 while not end_game: tn+=1 for event in pygame.event.get(): if event.type == pygame.QUIT: end_game = True screen.fill(bg_color) for i in range(1000): b[i].co=(random.randint(180,230),random.randint(180,230),random.randint(180,230)) b[i].draw(screen) b[i].th+=b[i].ths if b[i].th>360:b[i].th-=360 if b[i].th<0:b[i].th+=360 pygame.display.flip() clock.tick(5) pygame.quit() quit() main()