Python 3D碰撞检测墙体盒边界超出实际范围的解决方案咨询
碰撞边界异常修复方案
核心问题定位
现有代码存在3处逻辑错误直接导致碰撞边界错位:
- 碰撞半径计算逻辑完全错误:
xRad/zRad应该取墙体X轴宽度、Z轴深度的一半,而非墙体坐标pos.x/pos.z的一半,pos是墙体的位置坐标,和墙体尺寸没有关联 - 碰撞判定条件写反:现有逻辑是只要相机在墙体左/下侧就会被强制拉到边界上,正确逻辑应该是只有相机超出墙体边界时才做位置修正
- 无意义的
-0.5偏移:这个硬编码的偏移量就是你遇到的隐形碰撞线的来源,平白缩小了碰撞范围,仅当你需要给相机预留碰撞半径时才需要设置该值
修正后代码
首先你需要给墙体对象增加尺寸属性,比如wall.size.x是墙体X轴宽度,wall.size.z是墙体Z轴深度,修正后的碰撞代码如下:
# 可根据相机自身碰撞体积调整该偏移,无特殊需求设为0即可 collision_offset = 0.0 for wall in self.walls: # 计算墙体X、Z方向的半宽 x_half = wall.size.x / 2 - collision_offset z_half = wall.size.z / 2 - collision_offset # 墙体左右边界坐标 x_min = wall.pos.x - x_half x_max = wall.pos.x + x_half # 墙体前后边界坐标 z_min = wall.pos.z - z_half z_max = wall.pos.z + z_half # 相机超出右边界时,拉回右边界 if self.camera.eye.x >= x_max: self.camera.eye.x = x_max # 相机超出左边界时,拉回左边界 if self.camera.eye.x <= x_min: self.camera.eye.x = x_min # 相机超出前边界时,拉回前边界 if self.camera.eye.z >= z_max: self.camera.eye.z = z_max # 相机超出后边界时,拉回后边界 if self.camera.eye.z <= z_min: self.camera.eye.z = z_min
额外调整说明
如果你的墙体是1单位宽度的标准墙,直接把x_half/z_half设为0.5即可,不需要额外读取尺寸属性。
内容的提问来源于stack exchange,提问作者Nickell
相关产品推荐
相关产品推荐

