三角形求交算法

在光线追踪中,我们常常要处理对于Mesh的渲染,由于Mesh一般由一个个三角形所构成,因此需要我们去计算光线和Mesh每个三角形之间是否存在交点。这可以看做是一个射线和三角形的求交问题。《Fundamentals of Computer Graphics (3rd edition)》中提出了一个in-place的算法,在这里予以介绍。

设光线的起点为e,方向为d,三角形三个顶点为a,b,c。那么可以得到:

e+td=a+β(b-a)+γ(c-a)

其中,β、γ为三角形的重心坐标。β+γ<1。那么可以得到以下公式:

将它化为线性方程组:

那么我们要求解的其实就是β、γ和t,接下来利用Cramer法则求解即可。

其中矩阵A为:

当|A|为0,或β+γ>1时,说明光线和该三角形不想交,否则可计算出交点p=e+td

原文地址:https://www.cnblogs.com/wickedpriest/p/9193314.html

时间: 2024-11-05 22:58:25

三角形求交算法的相关文章

ray与triangle/quad求交二三事

引擎中,ray与quad求交,算法未细看,但有求解二次方程,不解.ray与triangle求交,使用的是97年经典算法,仔细看过论文,多谢小武同学指点,用到了克拉默法则求解线性方程组.想模仿该方法,做ray与quad的求交,发现方程里不仅有u和v,还有uv,没法变换成线性方程组的形式.本以为引擎中quad中四个点可以不共面,看过接口,不然,“不共面和退化的多边形不保证正确结果“.而后又有两个问题,一是,与一个quad求交比与两个三角形求交快吗?二是,如果前面的问题答案为否,即两个三角形更快,为何

半平面交算法及简单应用

半平面:一条直线把二维平面分成两个平面. 半平面交:在二维几何平面上,给出若干个半平面,求它们的公共部分 半平面交的结果:1.凸多边形(后面会讲解到)2.无界,因为有可能若干半平面没有形成封闭3.直线,线段,点,空(属于特殊情况吧) 算法:1:根据上图可以知道,运用给出的多边形每相邻两点形成一条直线来切割原有多边形,如果多边形上的点i在有向直线的左边或者在直线上即保存起来,否则判断此点的前一个点i-1和后一个点i+1是否在此直线的左边或线上,在的话分别用点i和点i-1构成的直线与此时正在切割的直

OpenCASCADE圆与平面求交

OpenCASCADE圆与平面求交 [email protected] 在 解析几何求交之圆与二次曲面中分析了OpenCASCADE提供的类IntAna_IntConicQuad可以用来计算圆与二次曲面之间的交点,这个算法是将平面Plane作为二次曲面的一个特例来处理,最后主要是对三角函数方程进行求解. 当直接使用圆和平面作为参数时,IntAna_IntConicQuad重载了函数Perform来对圆和平面进行求交计算,这时的算法与前面解三角函数不同,代码如下: void IntAna_IntC

OpenCASCADE 平面与球面求交

OpenCASCADE 平面与球面求交 [email protected] OpenCASCADE提供了类IntAna_QuadQuadGeo用来计算两个二次曲面quadric(球面.圆柱面.圆锥面及平面,平面是二次曲面的特例)之间的交线.他们之间可能的结果有: l 一个点 l 一条或两条直线 l 一个点和一条直线 l 圆 l 椭圆 l 抛物线 l 双曲线 将源码结合<高等数学>.<解析几何>等书,可以来学习如何将理论付诸实践.本文主要介绍这个类中平面与球面求交的源码实现.  将源

osgUtil::PolygonIntersector多面体与模型求交

osg3.4版本的有问题,特别是一个比较大的三角形包含一部分多面体,他的计算过程是每次计算三角形的一条边与多面体求交,这种情况就无法计算多面体内部覆盖的三角部分 osg3.6.4版本更新了计算方法,但是有个Bug,需要修改PolygonIntersectorUtil::IntersectFunctor::contains()中,dest.swap(src)之后,添加: src.push_back(src.front()); 即新计算的点需要形成闭环,否则计算结果不正确 原文地址:https://

[NetTopologySuite](2)任意多边形求交

任意多边形求交: private void btnPolygon_Click(object sender, EventArgs e) { double[] Xs = new double[] { 30, 260, 130, 350, 250, 330, 320, 180, 250, 50, 70, 60, 30, 260 }; double[] Ys = new double[] { 140, 260, 110, 150, 230, 210, 140, 260 }; int m = Xs.Len

递归学习(一)最简单的C语言递归求年龄算法

递归是我们在学习编程中,必须要去学习的,虽然递归晦涩难懂 ,但是很多时候,递归的思想会很有用,但是在实际开发中,不建议使用递归,要用循环来代替递归,不然bug无穷. ----------------------------------------------------------- 问题描述: 有5个人坐在一起, 问第5个人,他说比第4个人大2岁, 问第4个人,他说比第3个人大2岁, 问第3个人,他说比第2个人大2岁, 问第2个人,他说比第1个人大2岁, 问最后一个人,他说10岁 第5个人多大

POJ1408-Fishnet(线段求交)

Fishnet Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 1788   Accepted: 1144 Description A fisherman named Etadokah awoke in a very small island. He could see calm, beautiful and blue sea around the island. The previous night he had enc

求幂算法

1.简单递归 最简单的求幂算法是根据xn=x*xn-1,使用递归: def foo(x,n): if n==0: return 1 else: return x*foo(x,n-1) 这样求x的n次方,会进行n-1次乘法运算,n较大时效率很低. 2.高效递归 一种更高效的算法,可以将运算次数降到LogN的级别,由于: xn=xn/2*xn/2 , n为偶数时 xn=x(n-1)/2*x(n-1)/2*x , n为奇数时 def foo(x,n): if n==0: return 1 else: