obb碰撞检测算法代码
时间: 2023-10-15 21:03:45 浏览: 36
以下是一个简单的基于obb的碰撞检测算法代码示例:
```cpp
bool obbCollision(const OBB& obb1, const OBB& obb2) {
// 计算两个obb的中心点距离
Vector3d t = obb2.center - obb1.center;
// 对obb1的三个轴进行遍历
for (int i = 0; i < 3; i++) {
// 计算obb1在当前轴上的投影长度
float r1 = obb1.axis[i].dot(obb1.half_size);
// 计算obb2在当前轴上的投影长度
float r2 = obb2.axis[i].dot(obb2.half_size);
// 两个obb在当前轴上的投影长度之和
float r = r1 + r2;
// 中心点距离在当前轴上的投影长度
float t_len = abs(t.dot(obb1.axis[i]));
// 如果中心点距离在当前轴上的投影长度大于两个obb在当前轴上的投影长度之和,则没有碰撞
if (t_len > r) {
return false;
}
}
// 对obb2的三个轴进行遍历
for (int i = 0; i < 3; i++) {
// 计算obb1在当前轴上的投影长度
float r1 = obb1.axis[i].dot(obb1.half_size);
// 计算obb2在当前轴上的投影长度
float r2 = obb2.axis[i].dot(obb2.half_size);
// 两个obb在当前轴上的投影长度之和
float r = r1 + r2;
// 中心点距离在当前轴上的投影长度
float t_len = abs(t.dot(obb2.axis[i]));
// 如果中心点距离在当前轴上的投影长度大于两个obb在当前轴上的投影长度之和,则没有碰撞
if (t_len > r) {
return false;
}
}
// 对obb1和obb2的叉积轴进行遍历
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
// 叉积轴
Vector3d axis = obb1.axis[i].cross(obb2.axis[j]);
// 计算obb1和obb2在当前轴上的投影长度之和
float r = obb1.axis[i].dot(obb1.half_size) + obb2.axis[j].dot(obb2.half_size);
// 中心点距离在当前轴上的投影长度
float t_len = abs(t.dot(axis));
// 如果中心点距离在当前轴上的投影长度大于两个obb在当前轴上的投影长度之和,则没有碰撞
if (t_len > r) {
return false;
}
}
}
// 所有轴都没有发现碰撞,则认为两个obb发生了碰撞
return true;
}
```