这个算法来自微软DirectX SDK.兰幽草推荐的.
基本算法都想明白了。就是那个t 为什么没有负号.我还没有想明白.不知道为什么
不过结果基本已经正确了。应该比较好用的。
bool InterSection(XRay& ray,XTriangle& tri,XPoint& point,float& t, float& u, float& v )
{
// Find vectors for two edges sharing vert0
/***
三角形为 v1,v2,v3
两条边为 e1 = v2-v1 e2 = v3 - v1
射线为 ray = p0 + d * t
三角形内部的一点 p = v1 + u * e1 + v * e2 ( u+v<1)
所以:
v1 + u * e1 + v * e2 = p0 + d * t ===>
u * e1 + v * e2 - t * d = p0 - v1 ===>
- t * d + v * e2 + u * e1 = p0 - v1 ===>
| d.x d.y d.z |
[-t,v,u] | e2.x e2.y e2.z | = p0 - p1 ===>
| e1.x e1.y e1.z |
[-t,v,u] * M = p0 - p1 ;
[-t,v,u] = (p0 - p1) * Inv(M);
t = (p0 - p1) * e1 X e2 / Det(M) = (p0 - p1) X e1 * e2 / Det(M)
v = (p0 - p1) * e1 X d / Det(M) = (p0 - p1) X e1 * d / Det(M)
u = (p0 - p1) * d X e2 / Det(M)
**/
XVector3D e1 = tri.m_points[1] - tri.m_points[0];
XVector3D e2 = tri.m_points[2] - tri.m_points[0];
//求出矩阵 M 的 det(M)。并记录 d x e2;
XVector3D vCP_dir_e2;
ray.m_Dir.cp(e2,vCP_dir_e2);
//得到矩阵的行列式的值
float det = e1.dp(vCP_dir_e2);
//保存 (p0 - p1)
XVector3D v_p0_p1;
//为了判断方便。det = abs(det)
if( det > 0 )
{
v_p0_p1 = ray.m_Point - tri.m_points[0];
}
else
{
v_p0_p1 = tri.m_points[0] - ray.m_Point ;
det = -det;
}
if( det < 0.0000001f )
return false;
// u = (p0 - p1) * d X e2 / Det(M) Det(M)以后再除
u = v_p0_p1.dp(vCP_dir_e2);
if( u < 0.0f || u > det )
return false;
// 保存 (p0 - p1) X e1
XVector3D vCP_p0p1_e1;
v_p0_p1.cp(e1,vCP_p0p1_e1);
// v = (p0 - p1) * e1 X d / Det(M) = (p0 - p1) X e1 * d / Det(M)
// Det(M)以后再除
v = ray.m_Dir.dp(vCP_p0p1_e1);
if( v < 0.0f || u + v > det )
return false;
// Calculate t, scale parameters, ray intersects triangle
t = e2.dp(vCP_p0p1_e1);
float fInvDet = 1.0f / det;
t *= fInvDet;
u *= fInvDet;
v *= fInvDet;
point = ray.m_Point + ray.m_Dir*t;
return true;
}
分享到:
相关推荐
《Fast Minimum Storage Ray Triangle Intersection》是一篇经典的计算机图形学论文,主要探讨了如何高效地进行射线与三角形网格的碰撞检测。这篇论文的核心在于提出了一种存储需求小且计算速度快的方法来确定射线与...
的,它计算单个四面体和平面之间的交点。 此功能已扩展为能够批量计算多个四面体与给定平面的交点。 安装 要安装只需运行以下命令 git clone git@github.com:chrisk314/tet-plane-intersection.git cd tet-plane-...
函数的实现是基于线段和平面相交的结果,并且使用 InsidePolygon 函数来判断交点是否在多边形内。 3. 点到线的最近点 点到线的最近点是一个重要的计算几何问题。给定一个点和一个线段,我们需要计算点到线的最近点...
5. 双曲线与抛物线的性质:双曲线的一条渐近线与抛物线的准线有交点,利用双曲线和抛物线的方程,结合渐近线和准线的性质,可以找出双曲线的标准方程。 6. 圆的几何性质:题目给出了与圆相关的若干结论,需要根据圆...
1. **光线求交(Ray Intersection)**:首先,确定光线与场景中不同形状的物体(如平面、三角形、多边形、球体、长方体等)的交点。光线可以用参数方程P(t) = Ro + t * Rd表示,Ro是光线起点,Rd是单位向量表示光线...
本主题主要关注在二维空间中处理几何问题的一些基本算法,如计算两点之间的距离、判断点是否在直线上、确定点与直线的关系、求解两直线的夹角和交点,以及计算两个矩形的重合面积。以下将详细阐述这些算法的实现原理...
该算法可以处理一侧和两侧的表面,也可以处理无限线、射线(以一侧为界的线)和线段(以双方)。 输入(Nx3 中的所有数组,其中 N 是顶点数或射线数): orig : 射线的起源dir : 射线的方向vert0, vert1, vert2: ...
这篇资料主要涵盖的是高中数学的多个知识点,包括集合、命题逻辑、函数性质、等差数列、向量、三角函数、导数与函数最值、等比数列、数列求和、直线与曲线的切线、解三角形以及不等式等。以下是这些知识点的详细说明...
这个VS2015 C#项目包中的"画PolyLine.sln"可能是包含了一个能够绘制多边形线的解决方案,而"C# 判断两条线段是否相交,相交交点是否在线段上.doc"可能提供了详细的操作指南和算法解释。".vs"文件夹则包含了Visual ...
12. 寻找实数a的取值范围:函数g(x)=f(x)+ax在区间(0,4)上有三个零点,意味着g(x)的图像与x轴有三个交点,这涉及到根的存在性定理和连续函数的性质。 13. 数列的通项与前n项和:给定数列an的递推关系,可以使用累...
5. **交点(Intersection)**:找出两条或多条图形的交点。 6. **中心点(Centroid)**:找到多边形或三角形的质心。 7. **向量(Vector)**:创建两点间的向量,或者指定起点和向量长度。 8. **圆(Circle)**:...
**解答题**:这些大题涵盖函数的导数与值域、空间几何的证明与计算、数列的通项公式推导、抛物线与椭圆的交点问题、函数的最值与解的个数等,这些都是高中数学的综合性题目,需要深入理解和应用数学概念和方法。...
`get_line_intersection`函数用于计算两条线的交点。 题目中提到的“二分答案”可能是指在寻找某个点在两条线段之间的位置时,通过二分查找来优化搜索过程。这里需要注意的是,在二分查找的过程中,由于浮点数的...
17. **直线的位置关系与距离**:第十七题中的两直线1l和2l,若平行则距离为常数,若相交则可以通过解方程组找到交点坐标。 18. **正弦定理与余弦定理**:第十八题中三角形ABC的角度与边的关系,需要用到正弦定理或...
此函数`Intersection`接收两个方程`eqn1`和`eqn2`作为参数,使用`solve`命令求解这两个方程的交点坐标。`Intersection(y=2*x-1,y=-4*x+5);`将返回交点坐标。 ### 5. 正交中心的计算(Orthocenter Calculation) ``...
函数使用由 Tomas Möller (1997) 提出并作为高度矢量化的 MATLAB 代码实现的三角形/三角形相交算法来计算任何两个三角化表面的相交。 该算法被扩展为包括相交表面的计算,以及布尔矩阵编目来自一个表面的哪个三角形...
首先,计算每个边与平面的交点,然后根据这些交点判断是否形成新的三角形,或者交点是否落在三角形内部。 XNA GC可能提供了这样的扩展类,包括了点、平面、三角形等几何对象的类,以及相关的操作方法。例如,可能有...
集合的基本操作包括并集(Union)、交集(Intersection)和差集(Difference)。问题1询问的是`B`与`A`的并集,再减去`C`与`A`的交集,结果是`{0,1,4}`。 2. **逻辑关系**:问题2涉及逻辑命题的等价关系。题干中的...
4. **检测射线与物体的交点**:遍历场景中的每个3D物体,使用射线-三角形交点算法检查射线是否穿过物体。常见的算法有Ray-Triangle Intersection(如 Möller-Trumbore算法)。 5. **事件处理**:在MFC的...
- **Ray-Triangle Intersection**:射线与三角形交点的检测,常用在交互式应用中,如光线追踪。 - **Barycentric Coordinates**:通过将点的坐标转换为三角形内部的权重来判断点是否在三角形内。 - **Plane-Sweep...