Python 如何在导入的三维波前OBJ文件上实现对象碰撞

Python 如何在导入的三维波前OBJ文件上实现对象碰撞,python,pygame,pyopengl,opengl-compat,Python,Pygame,Pyopengl,Opengl Compat,我正在用pyGame制作一个3D迷宫游戏,在一个OBJ文件中制作环境,并使用pyGame网站上的OBJFileLoader将其加载到我的游戏中。但是,当我实现运动控制时,摄影机会穿过模型。如何检测相机和模型之间的碰撞,以便修复碰撞 我曾考虑过使用矩形碰撞检测,但我能找到的所有实现都是在2D中实现的,在3D中很难实现,而且使用obj文件也没有让它变得更容易。我还读过一些文章,说我可以使用光线追踪,但我找不到任何与在pyGame中使用光线投射相关的东西 下面是我在主循环中控制游戏中移动的代码 whi

我正在用pyGame制作一个3D迷宫游戏,在一个OBJ文件中制作环境,并使用pyGame网站上的OBJFileLoader将其加载到我的游戏中。但是,当我实现运动控制时,摄影机会穿过模型。如何检测相机和模型之间的碰撞,以便修复碰撞

我曾考虑过使用矩形碰撞检测,但我能找到的所有实现都是在2D中实现的,在3D中很难实现,而且使用obj文件也没有让它变得更容易。我还读过一些文章,说我可以使用光线追踪,但我找不到任何与在pyGame中使用光线投射相关的东西

下面是我在主循环中控制游戏中移动的代码

while 1:
    for event in pygame.event.get():
        if event.type == QUIT:
            sys.exit()
        if event.type == KEYUP and event.key == K_ESCAPE:
            sys.exit()

    time_passed = clock.tick()
    time_passed_seconds = time_passed / 1000.

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
    glLoadIdentity()

    pressed = pygame.key.get_pressed()

    rotation_direction.set(0.0, 0.0, 0.0)
    movement_direction.set(0.0, 0.0, 0.0)

    if pressed[K_a]:
        rotation_direction.y = +1.0
    elif pressed[K_d]:
        rotation_direction.y = -1.0
    if pressed[K_w]:
        movement_direction.z = -1.0
    elif pressed[K_s]:
        movement_direction.z = +1.0

    # Calculate rotation matrix and multiply by camera matrix
    rotation = rotation_direction * rotation_speed * time_passed_seconds
    rotation_matrix = Matrix44.xyz_rotation(*rotation)
    camera_matrix *= rotation_matrix

    # Calcluate movment and add it to camera matrix translate
    heading = Vector3(camera_matrix.forward)
    movement = heading * movement_direction.z * movement_speed
    camera_matrix.translate += movement * time_passed_seconds

    # Upload the inverse camera matrix to OpenGL
    glLoadMatrixd(camera_matrix.get_inverse().to_opengl())

    glCallList(obj.gl_list)

    pygame.display.flip()

我很困惑如何才能真正阻止用户穿过墙壁,我需要这样做才能让我制作的迷宫游戏真正发挥作用。

一般来说,使用3D几何网格作为碰撞检测数据不是一个好主意。通常我们这样做的方式是使用更简单的碰撞几何体(理想情况下由简单的基本体组成,如长方体、圆柱体、球体、平面-尽管在某些情况下可以使用三网格)。播放器/摄像机通常表示为一个胶囊,我们根据几何体测试胶囊。在3D中实现这种形式的碰撞检测非常困难

如果可以将迷宫游戏归结为二维问题(例如,自上而下视图),则定义一组定义迷宫轮廓的二维线,并将玩家/摄像机视为一个圆

即使是2D场景也很困难。为了确定最近的交点,最好的系统需要求解大量的联立方程组。随着迷宫大小的增加,解决这个问题的复杂性变得非常令人不快(即,您需要使用某种形式的空间分区,如BSP树、四叉树等)


这是一个非常困难的问题,这就是为什么大多数理智的人会简单地利用物理引擎为他们进行这些计算。我可能会建议您首先尝试使用一个简单的2D物理引擎,例如Box2D。如果您绝对需要3D碰撞检测,那么您可能希望查看PhysX、bullet或Havok

根据迷宫的布局,您可以做出一些简化的假设。从自上而下的角度来看,它本质上是“2D”吗?它遵循网格吗?这是第一人称透视图(在这种情况下,相机可以被视为点或边界球体)还是第三人称透视图(在这种情况下,您可以制作表示对象边界的简化网格,而不是逐个三角形测试实际网格本身)?