想实现一个检测三维包围盒是否发生碰撞的功能,因为目标是任意方向的三维包围盒,即没有和坐标轴对齐的旋转包围盒,所以考虑采用检测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