射线与三角面相交判定

2024-05-13 18:18
文章标签 相交 三角 判定 射线

本文主要是介绍射线与三角面相交判定,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

转:http://www.cnblogs.com/graphics/archive/2010/08/09/1795348.html
射线表示:
O + D *t
三角表示:
V0 + (V1 - V0)*u + (V2 - V0) * v
u >= 0;
v >= 0;
u + v < 1; 
如果射线相交在三角内,则:
O + D *t = V0 + (V1 - V0)*u + (V2 - V0) * v
u >= 0;
v >= 0;
u + v < 1; 
分析:uvt是3个未知数, V0,V1,V2,O,D是已知向量,是个3阶行列式,可求uvt
可以做简化
E1 = V1 - V0;
E2 = V2 - V0;
T = O - V0;
O + D *t = V0 + (V1 - V0)*u + (V2 - V0) * v
=》
- D *t + E1*u + E2 * v = T
=》
|-D  E1 E2| t = T
|               | u 
|               | v  
三阶行列式求解(克莱姆法则)
=》
t = det|T E1 E2| / det|-D E1 E2|  
u = det|-D T E2| / det|-D E1 E2|  
v = det|-D E1 T| / det|-D E1 E2| 
下面的推导只是为简化函数   
根据混合积公式(等价的代数余子式表示方法)  
det|a b c| = aXb *c = bXc *a = -aXc *b  //这里3种转换,只是为后面简化成PQ更方便
=》
t = TxE1 *E2 / DxE2 *E1
u = DxE2 *T  / DxE2 *E1
v = TxE1 *D  / DxE2 *E1
简化
P = DxE2
Q = TxE1 
=》
t = Q *E2 / P *E1
u = P *T  / P *E1
v = Q *D  / P *E1
函数实现:
bool InterSectTrangle(
const vec3& O, const vec3& D,
const vec3& V0, const vec3& V1, const vec3& V2,
float& t, float& u, float& v)
{
vec3 E1 = v1 - v0;
vec3 E2 = v2 - v0;
vec3 P  = cross(D, E2);
float det = dot(P, E1);
    
vec3 T;
if(det > 0)
{
    T = O - V0;
}
else
{
    T = V0 - O;
    det = -det;
}


if(det < 0.0001f)
    return false;


u = dot(P, T);
if(u < 0 || u > det)
    return false;


vec3 Q = cross(T, E1);
    
v = dot(Q, D);
if(v < 0 || u + v > det)
    return false;


t = dot(Q, E2);


float invDet = 1.0f / det;


t  *= invDet;
u *= invDet;
v  *= invDet;


return true;
}


代码说明:
1,里面有很多if为了提高代码效率,
2,确保det>0,如果det<0则令det = -det,并对T做相应的调整,这样做是为了方便后续计算,否则的话需要分别处理det>0和det<0两种情况。
3,if(det < 0.0001f) 此时无解,三角与射线近乎平行,注意浮点数和0的比较,一般不用 == 0的方式,而是给定一个Epsilon值,并与这个值比较。
4,u = dot(P, T);这里实际上u还没有计算完毕,此时的值是dot(P,T),如果dot(P,T) > det, 那么u > 1,无交点。
5,要确保u + v <= 1,也即 [dot(P,T) + dot(Q, D)] / det 必须不能大于1,否则无交点。


 
交点坐标:
根据上面代码求出的t,u,v的值,交点的最终坐标可以用下面两种方法计算


O + Dt


(1 - u - v)V0 + uV1 + vV2  
*/

这篇关于射线与三角面相交判定的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/986462

相关文章

poj 1127 线段相交的判定

题意: 有n根木棍,每根的端点坐标分别是 px, py, qx, qy。 判断每对木棍是否相连,当他们之间有公共点时,就认为他们相连。 并且通过相连的木棍相连的木棍也是相连的。 解析: 线段相交的判定。 首先,模板中的线段相交是不判端点的,所以要加一个端点在直线上的判定; 然后,端点在直线上的判定这个函数是不判定两个端点是同一个端点的情况的,所以要加是否端点相等的判断。 最后

zoj 1721 判断2条线段(完全)相交

给出起点,终点,与一些障碍线段。 求起点到终点的最短路。 枚举2点的距离,然后最短路。 2点可达条件:没有线段与这2点所构成的线段(完全)相交。 const double eps = 1e-8 ;double add(double x , double y){if(fabs(x+y) < eps*(fabs(x) + fabs(y))) return 0 ;return x + y ;

2300年都无人能知有长度不同的伪≌射线

黄小宁 【摘要】自有射线概念后的2300年里一直无人能知有长度不同的射线。保距变换和≌图概念是能放大无穷大倍的思维望远镜使人能一下子看到有长度不同的伪重合、伪≌射线。 变量x所取各数也均由x代表,x代表其变域(x所有能取的数组成的集)内任一元。设集A={x}表A各元均由x代表,{x}中变量x的变域是A。其余类推。“实数集”R所有非负元x≥0组成R+={x≥0},这里的x≥0不是表示x可取一切非负

Hessian矩阵判定极值之MATLAB实现符号解

By WC 1.9 .2015 1.Hessian矩阵 其定义如下: 如果函数f在D区域内二阶连续可导,那么黑塞矩阵H(f) 在 D 内为对称矩阵。原因是:如果函数f连续,则二阶偏导数的求

X 射线测厚仪-高效精准,厚度测量的卓越之选

在现代工业的舞台上,对精准度和效率的追求从未停歇。而 X 射线测厚仪,宛如一颗璀璨的明星,以其高效精准的特质,成为厚度测量的卓越之选。 X 射线测厚仪,是科技与智慧的完美结晶。它凭借先进的 X 射线技术,如同一双透视万物的慧眼,能够轻松穿透各种材料,将厚度信息精准地呈现在人们面前。无论是坚硬的金属板材,还是柔软的塑料制品,亦或是富有弹性的橡胶制品,在它的审视下,厚度无处遁形。 高效,是它的另一

素数判定和分解质素数

1.素数判定   public static boolean isPrime(int n) {if (n <= 1) return false;if (n == 2) return true;if (n % 2 == 0) return false;int limit = (int)Math.sqrt(n) + 1;for (int i = 3; i <= limit; i += 2) {i

【编程基础C++】素数判定、最小公倍数与最大公因数的实现方法

文章目录 素数法一法二 最大公因数辗转相除法另一写法 最小公倍数直接枚举法根据GCD算LCM 素数 素数 是指大于1的自然数,且只能被1和自身整除。例如,2、3、5和7都是素数。它们在数学中非常重要,因为任何大于1的自然数都可以唯一地表示为素数的乘积,这被称为素数分解。 法一 #include <iostream>using namespace std;bool IsPr

建模杂谈系列253 序列突变点的判定

说明 使用pycm3进行推断。 内容 1 环境搭建 使用conda创建对应的包环境,然后再通过jupyter运行 conda create -c conda-forge -n pymc_env "pymc>=5"conda activate pymc_envpip3 install ipython -i https://mirrors.cloud.tencent.com/pypi/s

JVM垃圾判定算法

垃圾收集技术是Java的一堵高墙。Java堆内存中存放着几乎所有的对象实例,垃圾收集器在对堆内存进行回收前,第一件事情就是要确定这些对象中哪些还存活,哪些已经死去(即不可能再被任何途径使用的对象)。也就是判定垃圾。通常有两种方法: 引用计数法 引用计数法(Reference Counting)的算法是:给每个对象添加一个引用计数器,有一个引用,计数器值加1;当引用失效,计数器值减1;任何时刻计

面试官问:一致性哈希算法是什么?怎么判定哈希算法的好坏?

点击上方“朱小厮的博客”,选择“设为星标”后台回复"书",获取后台回复“k8s”,可领取k8s资料 一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT)实现算法,设计目标是为了解决因特网中的热点(Hot spot)问题,初衷和CARP十分类似。一致性哈希修正了CARP使用的简单哈希算法带来的问题,使得分布式哈希(DHT)可以在P2P环境中真正得到应用。 一致性hash算法提