三角形内的顶点 - 碰撞检测

Posted

技术标签:

【中文标题】三角形内的顶点 - 碰撞检测【英文标题】:Vertex inside a triangle - Collision detection 【发布时间】:2011-01-11 12:59:07 【问题描述】:

我正在尝试检查顶点是否在三角形内,但我在为 3D 环境开发 CCW 函数时遇到问题。

对于 2D 环境 CCW 函数将是这样的

//CCW calculates the cross produt


double CCW ( point A  , point B , point C ) 

return (B.x-A.x)  * (C.y-A.y) - (B.y-A.y) * (C.x-A.x);



//The other part is designed to work on 3D

typedef struct

   double x;
   double y;
   double z;

Point;

int inTriangle(point A, point B, point C, point D)

   Point E;

   E.x = (A.x + B.x + C.x)/3;

   E.y = (A.y + B.y + C.y)/3;

   E.z = (A.z + B.z + C.z)/3;


return ( CCW(A,B,D) * CCW (A,B,E) > 0 &&
         CCW(B,C,D) * CCW(B,C,E) > 0 &&
         CCW(A,C,D) * CCW(A,C,E) );


【问题讨论】:

CCW 无法计算叉积,因为叉积是向量。除此之外,叉积仅针对两个向量定义。 好的,看起来 CCW 正在计算向量 AB 和 AC 的叉积的 z 分量? 3D 三角形中的点是什么意思?你的意思是把一个点投影到三角形的平面上然后检查二维吗? 【参考方案1】:

如果你想知道顶点是否直接位于三角形的平面内和它的边界内(即在三角形的表面上),你可以分别检查这两个东西。首先检查顶点是否位于三角形的平面内。然后您应该能够将三角形和顶点投影到 2D 并使用您的 2D 方法。

它还有一个好处是可以消除很多顶点,因为它们不在三角形的平面上,计算速度很快。

【讨论】:

【参考方案2】:

如果点在三角形的平面上,您可以使用here 中描述的重心方法。

【讨论】:

基本上我要做的是应用此代码来测试 3d 模型之间的碰撞检测。【参考方案3】:

要检查点是否在三角形的平面上,您可以编写三角形的平面方程。用 3 个点写起来很简单,而且它是线性的,所以计算会非常快。

要了解如何编写方程式检查http://en.wikipedia.org/wiki/Plane_(geometry),很简单。

要确定该点是否在平面内,只需检查它是否满足普兰方程并足够准确

【讨论】:

以上是关于三角形内的顶点 - 碰撞检测的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL:关于处理碰撞检测和顶点数据的建议?

碰撞检测

碰撞检测算法 - 圆柱体内的图像 [关闭]

飞行游戏中的碰撞算法-边界框碰撞检测

OpenGL顶点缓冲区对象,我可以访问顶点数据以用于其他用途,例如碰撞检测吗?

使用 glRotate 和 glTranslate 进行碰撞检测