本帖最后由 一只耳朵怪 于 2018-6-22 08:44 编辑
一个matlab检测空间线段(线段,直线或射线)是否与空间三角形曲面相交的函数
在机器人领域,常常会使用obj格式的三维模型用于目标检测(测距,避障等),obj格式的三维模型通常是由若干个三角形曲面构成的网格模型,而距离传感器常常会被抽象为一条空间线段。那么在MATLAB中,有没有一个现成的函数可以检测空间曲面与线段的相交情况呢?
答案是肯定的!
这个函数叫做TriangleRayIntersection是由 Jarek Tuszynski (jaroslaw.w.tuszynski@leidos.com) 编写完成的。它使用的是 Möller and Trumbore (1997)的理论。
完整代码见附件(如果您没有积分下载,请搜索Triangle/Ray Intersection 到MathWorks网站下载)。
我们通过下面一个例子来大致了解一下这个函数。
例:创建三角曲面网格模型并判断是否与给定的空间射线相交(多面/单射线类型问题)
首先我们建立三角曲面网格模型与空间射线:
n=20;
[x,y] = meshgrid(1:n,1:n); % create 2D mesh of points
faces = delaunay(x,y); % triangulate it using Delaunay algorithm
z = peaks(n); % sample function defined on a grid of the same dimenision
vertices = [x(:) y(:) z(:)]; % vertices stored as Nx3 matrix
orig = [0.25*n 0 2]; % ray's origin此起点位于绝对坐标系中
dir = [0.5 *n n 0]; % ray's direction注意!此终点位于相对坐标系中!是相对于起点的位置!
vert1 = vertices(faces(:,1),:);
vert2 = vertices(faces(:,2),:);
vert3 = vertices(faces(:,3),:);
之后我们调用检测函数并绘制图形:tic;
intersect = TriangleRayIntersection(orig, dir, vert1, vert2, vert3);
fprintf('Number of: faces=%i, points=%i, intresections=%i; time=%f secn', ...
size(faces,1), size(vertices,1), sum(intersect), toc);
figure(1); clf;
trisurf(faces,x,y,z, intersect*1.0,'FaceAlpha', 0.9)
hold on;
line('XData',orig(1)+[0 dir(1)],'YData',orig(2)+[0 dir(2)],'ZData',...
orig(3)+[0 dir(3)],'Color','r','LineWidth',3)
set(gca, 'CameraPosition', [106.2478 -35.9079 136.4875])
得到结果如图一。
可以看到黄色高亮的部分就是被贯穿的三角形曲面。
matlab显示:
Number of: faces=722, points=400, intresections=4; time=0.173530 sec有722个三角形面,400个顶点,4个交点,用时0.173530秒(此项取决于电脑运行速度)。
除此之外,此函数还可以检测交点到原点的距离,可更改线条类型(线段,射线,直线等)。
Note : The algorithm is able to solve several types of problems:- many faces / single ray intersection
- one face / many rays intersection
- one face / one ray intersection
- many faces / many rays intersection
利用此函数可以方便快捷的实现传感器模拟检测障碍物等功能。
源代码和详细例程请大家搜索 Triangle/Ray Intersection 即可,欢迎大家一起讨论!
2018年6月于法国
0
|
|
|
|