我一直在为我正在做的 3D 事物创建碰撞检测问题。
我进行碰撞检测的方式是,首先将旧的 xyz 坐标存储到变量中,然后调用移动函数,然后调用碰撞函数。如果移动后发生碰撞,相机 - 就像在播放器中(现在)一样 - 将被设置回旧的 xyz 坐标。
我希望角色能够沿着立方体的侧面“滑动”——这样如果你在 x 轴上发生碰撞,你仍然可以沿着 z 轴轻微滑动。然而,在拐角处,角色完全停止了——因为同时存在 x 和 z 碰撞。我决定为 z 和 x 碰撞创建单独的变量以阻止这种情况的发生,但现在我可以在拐角处进入立方体内部 - 但只能在 X 轴上。我不知道如何解决这个问题,我尝试了各种各样的东西(比如代码中的最新变量),但我就是无法弄清楚。帮助将不胜感激。这是代码的相关部分:
def otherCollision(self,x,y,z):
print(float(Camera.x))
xcol = 0
zcol = 0
latest = 0
if (-Camera.x >= cubez[0][0] - 1) and \
(-Camera.x <= cubez[0][0] + cubez[0][3] + 1) and \
(-Camera.z >= cubez[0][2] - 1) and \
(-Camera.z <= cubez[0][2] + cubez[0][5] + 1):
if (-Camera.x >= cubez[0][0] - 1) and \
(-Camera.x <= cubez[0][0]) or \
(-Camera.x <= cubez[0][0] - 1 + cubez[0][3] + 2) and \
(-Camera.x >= cubez[0][0] - 1 + cubez[0][3] + 1): #>
#Camera.x = x
xcol = 1
latest = 1
if (-Camera.z >= cubez[0][2] - 1) and \
(-Camera.z <= cubez[0][2]) or \
(-Camera.z <= cubez[0][2] - 1 + cubez[0][5] + 2) and \
(-Camera.z >= cubez[0][2] - 1 + cubez[0][5] + 1): #>=
#Camera.z = z
zcol = 1
latest = 2
if xcol == 1 and zcol == 0:
Camera.x = x
if zcol == 1 and xcol == 0:
Camera.z = z
if xcol == 1 and zcol == 1 and latest == 2:
Camera.x = x
if xcol == 1 and zcol == 1 and latest == 1:
Camera.z = z
值得一提的是,cubez
列表中有一个列表——第一个索引是对象的编号,下一个索引是我们要查找的值。他们是,按顺序,x,y,z,width,height,depth
。
我正在使用 pyglet 1.2alpha,但我认为这与帖子不太相关,因为很明显问题出在我的逻辑上。