文件交换

图像缩略图

三角形/射线交叉点

1.7版(309 kB) 雅罗斯瓦夫Tuszynski
快速矢量化三角形/射线交叉点算法
4.7
17评级

37下载

更新2018年5月18日

视图版本历史

查看许可协议

使用Möller提出的算法和三角形交叉口
Traumbore(1997),实施为高度矢量化的MATLAB代码。
该算法可以使用一个和双面表面,以及
无限线条,光线(一侧界限的线)和段(界线)
双方)。
输入(NX3中的所有数组,其中n是顶点或光线的数量):
原来:Ray's Origin
dir:ray的方向
Vert0, vert1, vert2:三角形的顶点
输出:
相交-长度为N的布尔数组
T - 距离射线起源到交叉点的距离| DIR |
U、v为重心坐标的交点单位
交点的Xcoor - carthesian坐标
此外,PointIneidVolume是3D等于2D Inpolygon功能,可以测试
点的数组在表面网格定义的任何体积内或外。

引用作为

Jaroslaw Tuszynski(2021)。三角形/射线交叉点(//www.tatmou.com/matlabcentral/fileexchange/33073-triangle- ray-Intersection),Matlab中央文件交换。检索到

评论和评级(35

Stefan Wampl

Francesco Sturla.

你好!有谁知道一个克服上面讨论的极限的代码(比总射线数量不同的三角形数量)?

伯克胸部

当网格中的三角形数量不同于总射线数字时,它不起作用。因此它使用有限。

康拉德

埃米尔爪

嗨,我正在尝试使用此代码以获取My 3D对象的粗略信息。
我在我的网格上选择一个三角形,然后将射线的原点放置在我所选三角形的法线重心上。
然后,光线将首先在定义的三角形中与我的网格相交,然后在第二个中交叉。
我怎么能得到第二个三角形作为函数的输出?这就是两个三角形之间的距离(也就是物体的厚度)
任何帮助都将非常感激。

Yasaman Moghadamnia.

适用于射线!您对线段建议哪种修改?

伯纳德选自

多对多的情况似乎有些混乱。如果你有n条射线和三角形,函数会针对第k个三角形测试第k条射线,但不会针对每个n个三角形测试第k条射线。所以有n个交集检验,不是n^2。这就是为什么在多对多情况下需要有和三角形一样多的射线。一对多的情况被看作是多对多的特殊情况,其中所有的n条射线/三角形都是相同的。

sjtu.

卢多维奇布列塔尼人

嗨,我也有关于许多光线/许多面孔的相同问题。它似乎没有工作,或者我是我用错误的方式使用它。我正在尝试找到光线是否在从原点到场景中的每个三角形的段上的三角形相交。
代码如下:
%% Cube定义
顶点= [0,0,0; ​​1,0,0; ​​1,0,1; 0,0,1; 0,1,0; 1,1,0; 1,1,1; 0,1,1];
面临=(2、4、1,2,3,4,2、6、3;3、6、7、5、7、6、5、8、7、1、4、8;1、8、5、1、6、2、1、5、6、3、7、4、4、7、8);

p0 =顶点(面孔(:,1),:);
p1 =顶点(面孔(:,2),:);
p2 =顶点(面孔(:,3),:);

% %计算
CG = (p0 + p1 + p2) / 3;
起源= [2 3 2];
方向= 1。*(CG-REPMAT(+原点,尺寸(面,1),1)));
[intersection, t,u,v,xcoord] = TriangleRayIntersection(原点,方向,p0, p1, p2, 'lineType', 'segment','planeType','two - sided','fullReturn', true);

%%我们画了这个数字
Quiver3(Repmat(原点(1),12,1),Repmat(原点(2),12,1),Repmat(原点(3),12,1),方向(:1),方向(:,2),方向(:3));
补丁(“面孔”,面孔,顶点,顶点,‘FaceColor’,‘米’,‘FaceAlpha’,0.8)

n =十字(P1-P0,P2-P0)/(规范(P1-P0)*常规(P2-P0));
文本(CG(:,1)+。2 * N(:,1)/常规(n(:,1)),cg(:,2)+。2 * n(:,2)/常规(n(:2)),CG(:,3)+。2 * n(:,3)/常规(n(:,3)),num2str((1:12)'));

通过在“方向”前面的标量(例如1或0.99),我只获得相交值的单位或零。

嗨,在你的第一个示例行86-100'trianglerayintersection_tutorial.m'中,你得到4个十字路口,但43距离't'。我们是否应该为4个十字路口获得4距离?

约翰霍尔斯

我也同意前面的评论。我无法使用多面/多射线版本。我有一个复杂的stl表面,由大约25000个三角形和一组400条光线组成,它们都从模型内部开始,向外延伸。它说只有13个相交,这是不正确的。任何建议吗?我可以尝试一次通过所有的射线。

斯图尔特Scollay

嗨,谢谢你的代码。我想要第二个安德烈的评论。我也很难获得许多光线,很多面孔实现工作。

安德烈·佩西

你好,雅罗斯瓦夫。谢谢你这个非常有用的工具!我正在尝试在由n> 400000顶点制成的闭合三角网格的许多面上找到许多(m)光线(用m 如果我在循环中搜索一个射线,该工具很棒,但需要很长一段时间才能完成我的所有光线。
要使它更快,我一直在尝试立即运行很多光线,但函数返回所有时间(未检测到的交叉点),这是奇怪的。是的,我正在使用REPMAT来克隆光线,直到m = n,所有输入都处于nx3格式。
但是,如果我考虑光线穿过每个三角形的中心,就像你举的例子。
我看到其他用户的评论也与许多光线斗争的选择。
你能帮我吗?雷克斯

菲利普昆斯

Fabricio Castro.

雅罗斯瓦夫Tuszynski

回复杰克'绿色:我认为你应该能够找到更简单的代码来做2D案例。或者只写一个待办/线路/线路交叉点进行每个线段的光线交叉点,看看交叉点是否在每个段端点之间。

杰克“绿色

你好,雅罗斯瓦夫。谢谢你提供了这么酷的工具。它在我的电脑上很好用。只是想知道是否有可能将其应用于纯粹的2D(平面内)情况,即所有三角形都成为分段?

燕君韩

许多面孔/许多光线交叉路口,返回值'标志'?应该是矩阵,但实际情况不是。

燕君韩

你好,有人可以帮助我!现在我有一系列路径点,我希望沿着指定方向向指定的网格表面投影它们,例如dir =(0,0,1)。对于每个路径点,我可以迭代所有三角网格以获得相应的投影点,但这太耗时了。我可以使用更快的方法吗?
我想在三角网格表面上获得固定方向上所有点的投影点。如何使用“许多面孔/许多光线交叉点”?

还Biguri

许多光线是否只与NFaces == nrays一起使用?如果是这样,是否有任何具体的理由实施该特定案例?

yumin sun.

实际上对于多个面和多个光线,如果所有起源都相同,则应该记住您需要重新归还原产地。

Leonardo Colavitti

伊戈尔

要更好地完成节目,我建议
1)添加关于使用选项FullReturn的说明。例如,它是'1'但不是“真实”。
2)添加初始化默认输出字符串
xcoor = 0(大小(源自));
如果xcoor没有初始化比如果没有交集错误出现与params count。

杰米希瑟

良好的矢量化实现,具有方便的选项,用于选择光线/线/段和处理数字精度问题 - 谢谢!

雅罗斯瓦夫Tuszynski

回复Murat:您可能必须使用“边框”参数进行调查。如果它不起作用,您可以构建演示问题并向我发送电子邮件的方案

穆拉特

嗨,代码运行良好,但它有时无法处理大的入射角。当入射角约为90时,它会忽略三角形。你能纠正吗?

ehsan golk.

杰弗里

我对多面多射线的选择很不适应。假设有11个面和5条射线。输入的大小需要做什么?我是否需要将所有数组的大小重新设置为55x3?

基于我可以告诉它可以处理的内容:
- 一个射线,很多面孔
-许多光线,一张脸
- 许多光线,许多面孔(但是面孔=射线#

但我觉得我遗漏了一些东西。

雅罗斯瓦夫Tuszynski

回复尼克:在许多光线和许多三角形案例中,您仍然测试预先安排的对和返回值通知您交叉的射线/三角形对

缺口

非常有用,但在考虑许多光线和许多三角形时有一种方法可以找到哪种射线的三角形?

缺口

amilcar托雷斯

优秀..真的很有帮助!!!

看起来很好。下载,稍后将尝试它。

雅罗斯瓦夫Tuszynski

Re to Anton Semechko:这是一个低级函数,可以被一个射线多面调用,多个面一射线或多面多射线调用。对输入应用repmat函数非常简单。

安东斯塞勒科

为什么光线的数量要等于面的数量?这太不方便

Matlab释放兼容性
用R2017B创建
兼容任何释放
平台的兼容性
视窗 苹果系统 Linux

社区宝藏狩猎

在MATLAB中心找到宝藏,并发现社区可以如何帮助您!

开始狩猎!