三角形内的顶点 - 碰撞检测
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),很简单。
要确定该点是否在平面内,只需检查它是否满足普兰方程并足够准确
【讨论】:
以上是关于三角形内的顶点 - 碰撞检测的主要内容,如果未能解决你的问题,请参考以下文章