gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 04:07:34 24 4
gpt4 key购买 nike

我正在 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 中实现这种形式的碰撞检测真的很困难。

如果可以将迷宫游戏归结为二维问题(例如自上而下的 View ),则定义一组定义迷宫轮廓的二维线,并处理播放器/相机作为一个圆圈。

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

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

关于python - 如何在导入的 3D 波前 OBJ 文件上实现对象碰撞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56975309/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com