如何在导入的 3D 波前 OBJ 文件上实现对象碰撞

How to implement object collision on imported wavefront OBJ files in 3D

我正在 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 几何网格作为碰撞检测数据并不是一个好主意。通常我们这样做的方法是有一个更简单的碰撞几何体(理想情况下由简单的图元组成,例如盒子,圆柱体,球体,平面 - 尽管在某些情况下可以使用三网格) .然后 player/camera 通常表示为胶囊,我们根据几何体测试胶囊。在 3D 中实现这种形式的碰撞检测 真的 很难。

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

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

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