简单的方法将点投影到三角形(或平面)

我有一个三角形网格(导航网格),并在三维空间中的一个点。 这一点应该总是“超越”其中一个三角形。 我试图确定哪个三角形是一个点是“结束”,但我不能弄明白。

我已经find了一种方法来确定点是否在三角形中,使用这里描述的技术之一,但我不能完全弄清楚如何投影三角形上的点(或三角形所在的平面) )。 我一直在网上找,但我找不到有用的东西。

有谁知道如何把一个点投影到一个三角形(或平面)?

另外,如果有人知道一个更好的方法来testing哪个三角形是一个重点,它将不胜感激。

在这种情况下,创建一个正交投影matrix,沿着法线方向,然后通过乘法转换三角形的顶点和你的点,它应该成为一个简单的二维检查,看看点是否在三角形(体积)。

此外,你也可以使用Z值来丢弃三角形以上的点。

LookAtLH在D3D / XNA中是如何做到这一点的,例如EyePosition可以是你的三角形的中心,Focus是EyePosition + normal,并且更新方向应该是任何与之垂直的方向,也就是三角形的任何顶点都可以工作。

我相信你可以find一个类似的LookAt转换matrix的源代码,如果你不想只为一个函数使用整个库,

这个问题在Stack Exchange的math社区有一个很好的答案: 确定3D点在平面上的投影是否在三角形内。 这也就是本文在“graphics工具杂志”(Wolfgang Heidrich,2005年,计算投影点的重心坐标,graphics工具杂志,pp 9-12,10(3))中对本文的总结。

原始查询点到重心坐标的转换可以认为允许简单地转换到三角形平面上的一个点(P'),或等同地testing查询点是否在垂直延伸的无限三角棱镜内三角形。 下面是一些使用Eigen库的C ++代码,基于四个点返回一个布尔值:查询点和三角形的顶点。 (注释来自上面引用的math.stackexchange.com页面,除了\ $ \ vec u \ $由于排版问题被写为\ $ u \ $。

 bool pointInTriangle(const Eigen::Vector3f& query_point, const Eigen::Vector3f& triangle_vertex_0, const Eigen::Vector3f& triangle_vertex_1, const Eigen::Vector3f& triangle_vertex_2) { // u=P2−P1 Eigen::Vector3f u = triangle_vertex_1 - triangle_vertex_0; // v=P3−P1 Eigen::Vector3f v = triangle_vertex_2 - triangle_vertex_0; // n=u×v Eigen::Vector3f n = u.cross(v); // w=P−P1 Eigen::Vector3f w = query_point - triangle_vertex_0; // Barycentric coordinates of the projection P′of P onto T: // γ=[(u×w)⋅n]/n² float gamma = u.cross(w).dot(n) / n.dot(n); // β=[(w×v)⋅n]/n² float beta = w.cross(v).dot(n) / n.dot(n); float alpha = 1 - gamma - beta; // The point P′ lies inside T if: return ((0 <= alpha) && (alpha <= 1) && (0 <= beta) && (beta <= 1) && (0 <= gamma) && (gamma <= 1)); }