猫史档案馆


【Python作品分享】pygame 三维立方体旋转【作品秀】

用户:豪爽的力士甲虫xWlZ豪爽的力士甲虫xWlZ查看:0 回复:1 评论:0 创建时间:2020-08-09T23:10:36


【作品展示】

center_image

 

【作品介绍】

通过简单的数学旋转矩阵计算和投影矩阵运算在2d平面上显示出三维立方体

 

【作品源代码】

import pygame
import math
pygame.init()

def projected3dto2d(distance,p3d):
    z=1/(distance-p3d[2])
    projection=[
        [z,0,0],       
        [0,z,0]
    ]
    projected=[0,0]
    for i in range(2):
        for j in range(2):
            projected[i]+=projection[j][i]*p3d[j]

    return projected

def rotateY(deg,p3d):
    rotation=[
        [math.cos(deg),0,-math.sin(deg)],
        [0,1,0],
        [math.sin(deg),0,math.cos(deg)]
    ]
    rotated=[0,0,0]
    for i in range(3):
        for j in range(3):
            rotated[i] += rotation[j][i]*p3d[j]
    return rotated
    pass

def draw(background,deg):

    points=[
        [100, 100, 100],
        [-100, 100, 100],
        [100, -100, 100],
        [-100, -100, 100],
        [100, 100, -100],
        [-100, 100, -100],
        [100, -100, -100],
        [-100, -100, -100],
    ]
    
    for c in points:
        projected = projected3dto2d(512,rotateY(deg,c))
        for c in range(2):
            projected[c] = projected[c]*400
        pygame.draw.circle(background, (255, 255, 255),(int(projected[0]+320), int(projected[1])+240), 10)
    

    for c in range(4):
        connect(points[c],points[c+4],deg,background)
        connect(points[c*2],points[c*2+1],deg,background)

    connect(points[0],points[2],deg,background)
    connect(points[1],points[3],deg,background)
    connect(points[4],points[6],deg,background)
    connect(points[5],points[7],deg,background)


def connect(pa,pb,deg,background):
    a=projected3dto2d(512,rotateY(deg,pa))
    b=projected3dto2d(512,rotateY(deg,pb))
    for c in range(2):
        a[c]=a[c]*400
        b[c]=b[c]*400
    pygame.draw.line(background,(255,255,255),(a[0]+320,a[1]+240),(b[0]+320,b[1]+240),4)
    

def main():
    degs=0
    screen = pygame.display.set_mode((喵0, 480))
    pygame.display.set_caption("3d cube By Zhao")


    clock = pygame.time.Clock()
    keepgoing=1
    while keepgoing:
        clock.tick(60)
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                keepgoing = 0
        
        degs+=3.1415926/320

        background = pygame.Surface(screen.get_size())
        background = background.convert()

        draw(background,degs)
        screen.blit(background, (0, 0))
        pygame.display.flip()

main()

 

【提示】

部分含有Python第三方库相关内容的作品,在海龟编辑器网页端无法运行哦!如遇到这种情况,可以打开下面的链接,下载海龟编辑器客户端:

https://python.codemao.cn


回复

上一页1 页 / 共 1下一页
lsk666666lsk666666

w c m b a!!!

是个dalao

点赞0


评论