パーソナルブログメモリ

a = [1, 1]
for _ in "*" * 999: a += [sum(a[-2:])]
print(a)

箱をまわしてみる

2018-03-22 | pygame
Zバッファなし
遠い昔、ブログがなかったころ、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()


最新の画像もっと見る

コメントを投稿

ブログ作成者から承認されるまでコメントは反映されません。