三维包围盒碰撞检测算法-Python(OBB-SAT)

想实现一个检测三维包围盒是否发生碰撞的功能,因为目标是任意方向的三维包围盒,即没有和坐标轴对齐的旋转包围盒,所以考虑采用检测OBB碰撞的SAT算法,但找了很久没找到现成的python代码,就比着别人写的C++版本自己写了python的代码。

1.原理

参考该博客

2.代码实现

import numpy as np

class OBB:
    def __init__(self,point_set:np.ndarray):
        self.pos=(point_set[0]+point_set[6])/2 #包围盒中心点位置
        self.axisX=self.__norm(point_set[1]-point_set[0]) #包围盒x轴的方向向量
        self.axisY=self.__norm(point_set[3]-point_set[0]) #包围盒y轴的方向向量
        self.axisZ=self.__norm(point_set[0]-point_set[4]) #包围盒z轴的方向向量
        self.half_size=np.array([self.__get_distance(point_set[0],point_set[1])/2,
                                 self.__get_distance(point_set[0],point_set[3])/2,
                                 self.__get_distance(point_set
  • 0
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
OBB碰撞检测算法的原理是基于包围的相交检测,通过判断两个旋转的包围是否相交来确定碰撞情况。 以下是OBB碰撞检测算法的基本原理: 1. 包围定义:每个物体(例如车辆)都被定义为一个旋转的包围,通常是一个矩形或长方体。包围由中心点、尺寸(长度、宽度和高度)和旋转角度(通常表示为欧拉角或四元数)来确定。 2. 包围的表示:包围可以使用矩阵变换来表示。通过将包围的中心和尺寸与旋转矩阵相乘,可以将包围从局部坐标系转换到世界坐标系。 3. 碰撞检测:通过检测两个包围是否相交来判断碰撞情况。两个包围相交的条件是:它们在三个坐标轴上的投影相交。即,两个包围在X轴、Y轴和Z轴上的投影都有重叠部分。 4. 投影检测:为了检测投影是否相交,可以使用包围的顶点或边在投影轴上的最小和最大值。通过计算两个包围在每个轴上的投影,并比较它们的最小和最大值,可以确定是否相交。 使用OBB碰撞检测算法时,需要注意以下几点: - 确定包围的正确性和准确性,以确保它们能够正确地表示物体的形状和方向。 - 选择合适的碰撞检测策略,可以采用分离轴定理(Separating Axis Theorem)或其他相应的算法来进行检测。 - 在实际应用中,可能需要考虑包围的更新和优化策略,以提高碰撞检测的效率和准确性。 总之,OBB碰撞检测算法通过比较旋转的包围在各个轴上的投影,来判断物体之间是否发生碰撞。这种算法在自动驾驶等领域中被广泛应用于车辆碰撞检测和避免碰撞的实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值