gpt4 book ai didi

c++ - 使用扫掠 AABB 交叉算法解决碰撞法线

转载 作者:太空狗 更新时间:2023-10-29 21:44:59 24 4
gpt4 key购买 nike

所以我有以下扫掠 AABB 碰撞检测算法,一切正常(基于 this article)

我的问题是如何确定碰撞正常,或者换句话说,aabb0aabb1 碰撞的盒子的一侧?

我在 Google 上查找了高低,但无济于事。我需要碰撞的法线,所以我可以确定如何在碰撞后“滑动”aabb0。 (aabb0 是玩家的边界框,aabb1 是世界某处的静态 block )。

aabb0 是玩家的边界框。d0aabb0 的位移。aabb1 是世界中的静态 block 。d1aabb1 的位移(始终为 0)。u0u1 是第一次和最后一次碰撞时间。

template<typename T>
intersect_type_t intersects(const aabb_t<T> aabb0, const T& d0, const aabb_t<T>& aabb1, const T& d1, float32_t& u0, float32_t& u1)
{
auto v = glm::value_ptr((d1 - d0));
auto amin = glm::value_ptr(aabb0.min);
auto amax = glm::value_ptr(aabb0.max);
auto bmin = glm::value_ptr(aabb1.min);
auto bmax = glm::value_ptr(aabb1.max);
vec3_t u_0(FLT_MAX);
vec3_t u_1(FLT_MIN);

if(intersects(aabb0, aabb1) != intersect_type_t::disjoint)
{
u0 = u1 = 0;
return intersect_type_t::intersect;
}

for(size_t i=0; i < 3; ++i)
{
if(v[i] == 0)
{
u_0[i] = 0;
u_1[i] = 1;
continue;
}

if(amax[i] < bmin[i] && v[i] < 0)
u_0[i] = (amax[i] - bmin[i]) / v[i];

else if(bmax[i] < amin[i] && v[i] > 0)
u_0[i] = (amin[i] - bmax[i]) / v[i];

if(bmax[i] > amin[i] && v[i] < 0)
u_1[i] = (amin[i] - bmax[i]) / v[i];

else if(amax[i] > bmin[i] && v[i] > 0)
u_1[i] = (amax[i] - bmin[i]) / v[i];
}

u0 = glm::compMax(u_0);
u1 = glm::compMin(u_1);

return u0 >= 0 && u1 <= 1 && u0 <= u1 ? intersect_type_t::intersect : intersect_type_t::disjoint;
}

最佳答案

将我的返回函数替换为以下内容:

auto result = u0 >= 0 && u1 <= 1 && u0 <= u1 ? intersect_type_t::intersect : intersect_type_t::disjoint;

if(normal != nullptr && result == intersect_type_t::intersect)
{
auto normal_value_ptr = glm::value_ptr(*normal);
for(size_t i = 0; i < 3; ++i)
{
if(u_0[i] == u0)
{
normal_value_ptr[i] = v[i] > 0 ? 1.f : -1.f;
break;
}
}
}

return result;

关于c++ - 使用扫掠 AABB 交叉算法解决碰撞法线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18689618/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com