busyoGG / busyoGG.github.io

1 stars 0 forks source link

碰撞检测之胶囊体 - Busyo's Blog #32

Open busyoGG opened 7 months ago

busyoGG commented 7 months ago

https://busyo.buzz/article/721cc45e1056/

胶囊体检测原理 - Busyo - Busyo's Blog

Parano111d commented 6 months ago

您好 看了您最新修改的胶囊体的碰撞检测 请问有方法获取胶囊体和其他碰撞盒的碰撞法线和碰撞深度吗?

busyoGG commented 6 months ago

@Parano111d 您好 看了您最新修改的胶囊体的碰撞检测 请问有方法获取胶囊体和其他碰撞盒的碰撞法线和碰撞深度吗?

胶囊体碰撞有求出两个最近点,连接最近点就是碰撞法线了,深度如果是检测球型的碰撞就两个半径减去两个最近点距离(两个最近点都相当于球心),如果是和AABB或OBB检测就半径减去两个最近点距离(一个是球心一个是表面)

Parano111d commented 5 months ago

我在做这个胶囊体和OBB之间的排斥力的时候 如果只施加单一方向上的位移可以正确的被排斥,但如果同时施加两个及以上方向的位移就会穿透了(比如同时按住前进或者左/右 斜着碰撞墙体)。:P 请问这是什么原因构成的啊?

在 2024-04-16 13:24:57,"busyo" @.***> 写道:

@Parano111d 您好 看了您最新修改的胶囊体的碰撞检测 请问有方法获取胶囊体和其他碰撞盒的碰撞法线和碰撞深度吗?

胶囊体碰撞有求出两个最近点,连接最近点就是碰撞法线了,深度如果是检测球型的碰撞就两个半径减去两个最近点距离(两个最近点都相当于球心),如果是和AABB或OBB检测就半径减去两个最近点距离(一个是球心一个是表面)

— Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you were mentioned.Message ID: @.***>

Parano111d commented 5 months ago

我在做这个胶囊体和OBB之间的排斥力的时候 如果只施加单一方向上的位移可以正确的被排斥,但如果同时施加两个及以上方向的位移就会穿透了(比如同时按住前进或者左/右 斜着碰撞墙体)。:P 请问这是什么原因构成的啊?

顺带一提 所有排斥都是叠加了的 之前OBB和OBB都是用的这个方法 没有问题

在 2024-04-16 13:24:57,"busyo" @.***> 写道:

@Parano111d 您好 看了您最新修改的胶囊体的碰撞检测 请问有方法获取胶囊体和其他碰撞盒的碰撞法线和碰撞深度吗?

胶囊体碰撞有求出两个最近点,连接最近点就是碰撞法线了,深度如果是检测球型的碰撞就两个半径减去两个最近点距离(两个最近点都相当于球心),如果是和AABB或OBB检测就半径减去两个最近点距离(一个是球心一个是表面)

— Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you were mentioned.Message ID: @.***>

busyoGG commented 5 months ago

@Parano111d 我在做这个胶囊体和OBB之间的排斥力的时候 如果只施加单一方向上的位移可以正确的被排斥,但如果同时施加两个及以上方向的位移就会穿透了(比如同时按住前进或者左/右 斜着碰撞墙体)。:P 请问这是什么原因构成的啊?

顺带一提 所有排斥都是叠加了的 之前OBB和OBB都是用的这个方法 没有问题

在 2024-04-16 13:24:57,"busyo" @.***> 写道:

@Parano111d 您好 看了您最新修改的胶囊体的碰撞检测 请问有方法获取胶囊体和其他碰撞盒的碰撞法线和碰撞深度吗?

胶囊体碰撞有求出两个最近点,连接最近点就是碰撞法线了,深度如果是检测球型的碰撞就两个半径减去两个最近点距离(两个最近点都相当于球心),如果是和AABB或OBB检测就半径减去两个最近点距离(一个是球心一个是表面)

— Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you were mentioned.Message ID: @.***>

我这没有复现,看看碰撞法线和深度值有没有问题

Parano111d commented 5 months ago

有个疑问啊 我看您在blog里写的与OBB检测是 Vector3 closest2 = GetClosestPointOBB(closest1, data2); 而在最新Git项目里面用的是 Vector3 closest2 = GetClosestPointOBB(data1.center, data2); 请问具体应该用哪一个啊?

在 2024-04-18 16:51:35,"busyo" @.***> 写道:

@Parano111d 我在做这个胶囊体和OBB之间的排斥力的时候 如果只施加单一方向上的位移可以正确的被排斥,但如果同时施加两个及以上方向的位移就会穿透了(比如同时按住前进或者左/右 斜着碰撞墙体)。:P 请问这是什么原因构成的啊?

顺带一提 所有排斥都是叠加了的 之前OBB和OBB都是用的这个方法 没有问题

在 2024-04-16 13:24:57,"busyo" @.***> 写道:

@Parano111d 您好 看了您最新修改的胶囊体的碰撞检测 请问有方法获取胶囊体和其他碰撞盒的碰撞法线和碰撞深度吗?

胶囊体碰撞有求出两个最近点,连接最近点就是碰撞法线了,深度如果是检测球型的碰撞就两个半径减去两个最近点距离(两个最近点都相当于球心),如果是和AABB或OBB检测就半径减去两个最近点距离(一个是球心一个是表面)

— Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you were mentioned.Message ID: @.***>

我这没有复现,看看碰撞法线和深度值有没有问题

— Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you were mentioned.Message ID: @.***>

busyoGG commented 5 months ago

@Parano111d 有个疑问啊 我看您在blog里写的与OBB检测是 Vector3 closest2 = GetClosestPointOBB(closest1, data2); 而在最新Git项目里面用的是 Vector3 closest2 = GetClosestPointOBB(data1.center, data2); 请问具体应该用哪一个啊?

在 2024-04-18 16:51:35,"busyo" @.***> 写道:

@Parano111d 我在做这个胶囊体和OBB之间的排斥力的时候 如果只施加单一方向上的位移可以正确的被排斥,但如果同时施加两个及以上方向的位移就会穿透了(比如同时按住前进或者左/右 斜着碰撞墙体)。:P 请问这是什么原因构成的啊?

顺带一提 所有排斥都是叠加了的 之前OBB和OBB都是用的这个方法 没有问题

在 2024-04-16 13:24:57,"busyo" @.***> 写道:

@Parano111d 您好 看了您最新修改的胶囊体的碰撞检测 请问有方法获取胶囊体和其他碰撞盒的碰撞法线和碰撞深度吗?

胶囊体碰撞有求出两个最近点,连接最近点就是碰撞法线了,深度如果是检测球型的碰撞就两个半径减去两个最近点距离(两个最近点都相当于球心),如果是和AABB或OBB检测就半径减去两个最近点距离(一个是球心一个是表面)

— Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you were mentioned.Message ID: @.***>

我这没有复现,看看碰撞法线和深度值有没有问题

— Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you were mentioned.Message ID: @.***>

Vector3 closest2 = GetClosestPointOBB(closest1, data2); github项目更新了

Parano111d commented 5 months ago

感谢大佬解惑 现在胶囊体已经可以像角色控制器一样正常工作了 想请教一下 我现在还是遍历场景中所有的碰撞盒与角色控制器进行碰撞检测 请问有什么其他的方法可以节省性能的吗?

在 2024-04-18 21:10:33,"busyo" @.***> 写道:

@Parano111d 有个疑问啊 我看您在blog里写的与OBB检测是 Vector3 closest2 = GetClosestPointOBB(closest1, data2); 而在最新Git项目里面用的是 Vector3 closest2 = GetClosestPointOBB(data1.center, data2); 请问具体应该用哪一个啊?

在 2024-04-18 16:51:35,"busyo" @.***> 写道:

@Parano111d 我在做这个胶囊体和OBB之间的排斥力的时候 如果只施加单一方向上的位移可以正确的被排斥,但如果同时施加两个及以上方向的位移就会穿透了(比如同时按住前进或者左/右 斜着碰撞墙体)。:P 请问这是什么原因构成的啊?

顺带一提 所有排斥都是叠加了的 之前OBB和OBB都是用的这个方法 没有问题

在 2024-04-16 13:24:57,"busyo" @.***> 写道:

@Parano111d 您好 看了您最新修改的胶囊体的碰撞检测 请问有方法获取胶囊体和其他碰撞盒的碰撞法线和碰撞深度吗?

胶囊体碰撞有求出两个最近点,连接最近点就是碰撞法线了,深度如果是检测球型的碰撞就两个半径减去两个最近点距离(两个最近点都相当于球心),如果是和AABB或OBB检测就半径减去两个最近点距离(一个是球心一个是表面)

— Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you were mentioned.Message ID: @.***>

我这没有复现,看看碰撞法线和深度值有没有问题

— Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you were mentioned.Message ID: @.***>

用 Vector3 closest2 = GetClosestPointOBB(closest1, data2); github项目更新了

— Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you were mentioned.Message ID: @.***>

busyoGG commented 5 months ago

@Parano111d 感谢大佬解惑 现在胶囊体已经可以像角色控制器一样正常工作了 想请教一下 我现在还是遍历场景中所有的碰撞盒与角色控制器进行碰撞检测 请问有什么其他的方法可以节省性能的吗?

在 2024-04-18 21:10:33,"busyo" @.***> 写道:

@Parano111d 有个疑问啊 我看您在blog里写的与OBB检测是 Vector3 closest2 = GetClosestPointOBB(closest1, data2); 而在最新Git项目里面用的是 Vector3 closest2 = GetClosestPointOBB(data1.center, data2); 请问具体应该用哪一个啊?

在 2024-04-18 16:51:35,"busyo" @.***> 写道:

@Parano111d 我在做这个胶囊体和OBB之间的排斥力的时候 如果只施加单一方向上的位移可以正确的被排斥,但如果同时施加两个及以上方向的位移就会穿透了(比如同时按住前进或者左/右 斜着碰撞墙体)。:P 请问这是什么原因构成的啊?

顺带一提 所有排斥都是叠加了的 之前OBB和OBB都是用的这个方法 没有问题

在 2024-04-16 13:24:57,"busyo" @.***> 写道:

@Parano111d 您好 看了您最新修改的胶囊体的碰撞检测 请问有方法获取胶囊体和其他碰撞盒的碰撞法线和碰撞深度吗?

胶囊体碰撞有求出两个最近点,连接最近点就是碰撞法线了,深度如果是检测球型的碰撞就两个半径减去两个最近点距离(两个最近点都相当于球心),如果是和AABB或OBB检测就半径减去两个最近点距离(一个是球心一个是表面)

— Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you were mentioned.Message ID: @.***>

我这没有复现,看看碰撞法线和深度值有没有问题

— Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you were mentioned.Message ID: @.***>

用 Vector3 closest2 = GetClosestPointOBB(closest1, data2); github项目更新了

— Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you were mentioned.Message ID: @.***>

对象少的话直接遍历就好了,多的话可以场景根据坐标划分网格,或者用四叉树之类的来进行空间划分

SDU-Rain commented 5 months ago

只用线段端点算最近点的话,如果是两个以一定夹角X型相交的细长胶囊体,是不是有可能检测不到胶囊体重叠?

busyoGG commented 5 months ago

@SDU-Rain 只用线段端点算最近点的话,如果是两个以一定夹角X型相交的细长胶囊体,是不是有可能检测不到胶囊体重叠?

确实会有这个问题,应该换成获取两个线段的最近距离。后续会更新这个问题。🤡