Python PyGame做3d游戏吗?

Python PyGame做3d游戏吗?,python,3d,pygame,Python,3d,Pygame,我似乎到处都找不到这个问题的答案。我知道你必须使用PyOpenGL或类似的东西来做OpenGL的东西,但我想知道是否有可能在没有任何其他依赖项的情况下制作非常基本的3D图形。不,Pygame是SDL的包装器,SDL是一个2D api。Pygame不提供任何3D功能,可能永远也不会提供 Python的3D库包括和,尽管它们的使用可能相当复杂,尤其是后者。好吧,如果你能做2d,你总是可以做3D。所有3d实际上都是倾斜的二维表面,给人的印象是你在看有深度的东西。真正的问题是它能做得好吗,你会愿意吗。浏

我似乎到处都找不到这个问题的答案。我知道你必须使用PyOpenGL或类似的东西来做OpenGL的东西,但我想知道是否有可能在没有任何其他依赖项的情况下制作非常基本的3D图形。

不,Pygame是SDL的包装器,SDL是一个2D api。Pygame不提供任何3D功能,可能永远也不会提供


Python的3D库包括和,尽管它们的使用可能相当复杂,尤其是后者。

好吧,如果你能做2d,你总是可以做3D。所有3d实际上都是倾斜的二维表面,给人的印象是你在看有深度的东西。真正的问题是它能做得好吗,你会愿意吗。浏览pyGame文档一段时间后,它看起来只是一个SDL包装器。SDL不适用于3d编程,因此真正问题的答案是,不,我甚至不会尝试。

Python Soya可以在pygame表面上渲染3d图形。

您可以仅使用pygame进行伪3d游戏(如“末日”):

如果你浏览pygame.org网站,你可能会发现更多用python和pygame完成的“3d”游戏


然而,如果你真的想进入3d编程领域,你应该研究OpenGl、Blender或任何其他真正的3d库。

如果你想要3d投影功能和所有这些东西,你必须使用3d API,但如果你想做一个基本的3d外观,我推荐Peter的网站教程:

Pygame本来就不打算做3d,但是有一种方法可以使用任何2d图形库进行3d。您所需要的只是以下函数,该函数将三维点转换为二维点,允许您通过在屏幕上绘制线来生成任何三维形状

def convert_to_2d(point=[0,0,0]):
    return [point[0]*(point[2]*.3),point[1]*(point[2]*.3)]

这被称为伪3d,或2.5d。这是可以做到的,但速度可能很慢,而且非常难做到,因此建议您使用3d库。

为PyGame制作3d驱动程序很容易。PyGame拥有一些用于3D游戏开发的资产。
我现在正在使用PyGame开发Py3D驱动程序。当我完成时,我将向您显示下载Py3D的链接。我试着用PyGame制作3D游戏,我只需要PyGame的一个小插件。你认为必须使用SDL、PyOpenGL、OpenGL、PyQt5、Tkinter是错误的。他们制作3D游戏都是错误的。OpenGL和PyOpenGL或Panda3D非常难学。我在那些车手身上玩的所有游戏都很糟糕。PyQt5和Tkinter不是制作游戏的驱动程序,但它们有插件。不要试图对那些车手耍花招。我们需要使用数学模块的所有驱动程序都很难。你可以很容易地为他们制作小插件,我想每个人都可以在1-2周内为PyGame制作驱动程序。

你所看到的3D实际上是2D游戏。毕竟,你在看你的屏幕,通常是2D的。虚拟世界(3D)投影到一个平面上,然后显示在屏幕上。然后我们的大脑将2D图像转换成3D图像(就像他们对我们眼睛的图像所做的那样),使其看起来像3D图像

所以制作3D游戏相对容易:你只需使用多维矩阵创建一个虚拟世界,然后将每个循环投影到2D平面上,并显示在屏幕上


你可以在3D程序(使用pygame)中使用的一个教程是。

pygame只是一个用于更改像素颜色的库(以及一些其他用于编程游戏的有用内容)。您可以通过在屏幕上快速显示图像或直接设置像素的颜色来实现这一点

正因为如此,用pygame编写2D游戏很容易,因为以上就是您真正需要的。但3D游戏只是将一些3D对象“挤压”(渲染)成2D,以便在屏幕上显示。因此,要仅使用pygame制作3D游戏,您必须自己处理此渲染,包括所有必要的复杂矩阵数学

这不仅会因为涉及到巨大的处理能力而运行缓慢,而且还需要编写一个大规模的3D渲染/光栅化引擎。由于python被解释,它的速度会更慢。正确的方法是使用(Py)opengl在GPU上运行这个过程


所以,是的,仅使用pygame制作3D在技术上是可行的,但绝对不推荐。我建议您学习Panda3D或类似的3D引擎。

您可以这样制作:

def convert_2d(x,y,z,地平线):
d=1-(z/地平线)
返回x*d,y*d
def绘制点列表(lst):
''假设lst是一个3维点的列表,如[(0,0,0),(1,6,2)。。。
让我们以200为地平线,它可以给我们一个非常干净的3D“
对于lst中的x、y、z:
pygame.draw.circle(屏幕,颜色,转换为2d(x,y,z,200),1)
但是它不是很快。如果你想要快速,试着用C++/SDL2或C实现。 Pygame不太适合3d图形。

简单: 只需绘制一组多边形,如:

导入pygame
screen=pygame.display.set_模式((100100))
尽管如此:
屏幕填充((0,0,0))
Pos=[(10,10)、(20,10)、(20,20)、(10,20)]
#第一面(前面)是红色的
pygame.draw.polygon(屏幕,(225,0,0),位置)
#白色轮廓
pygame.draw.lines(屏幕,(225,225,225),位置)
#蓝色的第二面(背面)
Pos2=[(Pos[0[0]]+2.5,Pos[0[1]]+2.5),(Pos2[0[0]+5,Pos2[0[1]],(Pos2[1[0]],Pos2[1[1]+5),(Pos2[0]],Pos2[0[1]+5)]
pygame.draw.polygon(屏幕,(0,0,225),位置2)
pygame.draw.lines(屏幕,(225,225,225),位置2)
#第三面(左边,但只有两条线(不是真的))为绿色
Pos3=[Pos[0],Pos2[0],Pos2[3],Pos[3]]
pygame.draw.polygon(屏幕,(0,225,0),位置3)
pygame.draw.lines(屏幕,(225,225,225),位置3)
#第四面(右侧)为紫色
位置4=[Pos[1],Pos2[1],Pos2[2],Pos[2]]
pygame.draw.polygon(屏幕,(225,025),位置4)
pygame.draw.lines(屏幕,(225,225,225),位置4)
pygame.display.flip()
&这里有一个简单的立方体&我很快就会知道
    import pygame
    from pygame.locals import *

    from OpenGL.GL import *
    from OpenGL.GLU import *

    import random

    vertices = ((1, -1, -1),(1, 1, -1),(-1, 1, -1),(-1, -1, -1),(1, -1, 1),(1, 1, 1),(-1, -1, 1),(-1, 1, 1))
edges = ((0,1),(0,3),(0,4),(2,1),(2,3),(2,7),(6,3),(6,4),(6,7),(5,1),(5,4),(5,7))
    surfaces = ((0,1,2,3),(3,2,7,6),(6,7,5,4),(4,5,1,0),(1,5,7,2),(4,0,3,6))
    colors = ((1,0,0),(0,1,0),(0,0,1),(0,1,0),(1,1,1),(0,1,1),(1,0,0),(0,1,0),(0,0,1),(1,0,0),(1,1,1),(0,1,1),)

   
    def set_vertices(max_distance, min_distance = -20):
        x_value_change = random.randrange(-10,10)
        y_value_change = random.randrange(-10,10)
        z_value_change = random.randrange(-1*max_distance,min_distance)
        new_vertices = []
        for vert in vertices:
            new_vert = []
            new_x = vert[0] + x_value_change
            new_y = vert[1] + y_value_change
            new_z = vert[2] + z_value_change
            new_vert.append(new_x)
            new_vert.append(new_y)
            new_vert.append(new_z)
            new_vertices.append(new_vert)
        return new_vertices
            
        


    def Cube(vertices):
        glBegin(GL_QUADS)
        for surface in surfaces:
            x = 0

            for vertex in surface:
                x+=1
                glColor3fv(colors[x])
                glVertex3fv(vertices[vertex])
        glEnd()
        glBegin(GL_LINES)
        for edge in edges:
            for vertex in edge:
                glVertex3fv(vertices[vertex])
        glEnd()

    def main():
        pygame.init()
        display = (800,600)
        pygame.display.set_mode(display, DOUBLEBUF|OPENGL)
        max_distance = 100
        gluPerspective(45, (display[0]/display[1]), 0.1, max_distance)
        glTranslatef(random.randrange(-5,5),random.randrange(-5,5), -40)
        #object_passed = False
        x_move = 0
        y_move = 0
        cube_dict = {}

        for x in range(50):
            cube_dict[x] =set_vertices(max_distance)

        #glRotatef(25, 2, 1, 0)

        
        x = glGetDoublev(GL_MODELVIEW_MATRIX)
        camera_x = x[3][0]
        camera_y = x[3][1]
        camera_z = x[3][2]
        button_down = False
        while True:
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    pygame.quit()
                    quit()
                if event.type == pygame.MOUSEMOTION:
                    if button_down == True:
                        print(pygame.mouse.get_pressed())
                        glRotatef(event.rel[1], 1, 0, 0)
                        glRotatef(event.rel[0], 0, 1, 0)
            
            for event in pygame.mouse.get_pressed():
                # print(pygame.mouse.get_pressed())
                if pygame.mouse.get_pressed()[0] == 1:
                    button_down = True
                elif pygame.mouse.get_pressed()[0] == 0:
                    button_down = False

           

            glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT)


            for each_cube in cube_dict:
                Cube(cube_dict[each_cube])

            pygame.display.flip()
            pygame.time.wait(10)

    main()
    pygame.quit()
    quit()