我遇到碰撞检测问题我一直在为我正在做的3D事情创作。
我进行碰撞检测的方法是,首先将旧的xyz坐标存储到变量中,然后调用移动函数,然后调用碰撞函数。如果在移动后发生碰撞,则相机 - 如播放器(现在) - 将被设置回旧的x y z坐标。
我希望角色能够沿着立方体的一侧“滑动” - 这样如果你在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,但我不认为这与帖子非常相关,显然问题在于我的逻辑。
答案 0 :(得分:0)
我认为最好的解决方案是为你的演员添加一个力度属性(&#34;字符&#34;或者#34;相机&#34;在你的例子中?)。然后根据碰撞,将速度属性归零。
给出一个像这样的简单向量类:
class Vector(object):
def __init__(self, x=0.0, y=0.0, z=0.0):
self.x = x
self.y = y
self.z = z
......你的演员看起来像这样:
class Actor(object):
def __init__(self):
self.pos = Vector()
self.vel = Vector()
现在,当您更新场景时,请执行以下步骤(根据您的示例抽象):
vel
属性。vel
属性。pos
中的数据更新演员vel
。以下示例为简单起见使用了2D世界(z
始终为0
),并且更新的常数时间步长(dt
被视为1秒)。
class Actor(object):
#(...)
def update(self, dt=1):
# Step 1 - assumes a constant movement to the top right
self.vel.x = 1
self.vel.y = 1
# Step 2 - cube is your collision tested object
cube = Cube()
new_pos = self.pos + (self.vel * dt)
if new_pos.x > cube.left and new_pos.x < cube.right:
self.vel.x = 0
if new_pos.y > cube.bottom and new_pos.y < cube.top:
self.vel.y = 0
# Step 3
self.pos += self.vel * dt
首先,你应该得到这样的工作。当它正常运行时,为你的actor添加一个边界框,以便在侧面而不是在中心上执行碰撞。