【问题标题】:Extract contour from obj 3d object in Matlab在 Matlab 中从 obj 3d 对象中提取轮廓
【发布时间】:2018-02-17 18:05:24
【问题描述】:

我有一个代表 3D 对象的 .obj 文件。

我需要从这个 3D 对象中提取通过与平面相交获得的轮廓。例如,我有一个对象表示一个垂直轴定向的圆柱体,然后我想在相交平面是水平时提取圆形轮廓,或者在相交平面是垂直时提取矩形轮廓。有什么建议吗?

由于我不知道如何可视化这个 obj 文件,所以我已经转换为带有以下代码的补丁(一些函数取自 Matlab 文件交换的 loadawobj)。

modelname='file.obj';
S=loadawobj(modelname);
mtl=loadawmtl(['obj/' S.mtllib]);
p3=patch('Vertices',S.v','Faces',S.f3');

for ii=1:length(S.umat3)
    mtlnum=S.umat3(ii);
    fvcd3(ii,:)=mtl(1).Kd';
end

p3.FaceVertexCData=fvcd3;
p3.FaceColor='flat';

但如果这太复杂而无法完成,我不一定需要从生成的补丁中提取轮廓。如果从 obj 文件开始有一个更简单的过程,那也是可以接受的。谢谢!

【问题讨论】:

  • 您需要该切片平面上的数据点。这需要将顶点-曲面表示转换为网格网格,或者换句话说,将补丁转换为曲面。 “不幸的是,这不是一个简单的问题。”verycomputer.com/33_d6e081812d2a1139_1.htm
  • @Yvon 谢谢!我从一个 obj 文件开始。也许将它转换成补丁是一个错误的想法,我宁愿转换成更适合我最终任务的东西?转换为补丁是我发现的唯一方法来绘制它,但如果为了提取轮廓需要不同的表示,也可以。
  • 您能否编辑您的问题以包含原始数据的外观?

标签: matlab 3d contour .obj


【解决方案1】:

这就是我在网络上收集信息后解决问题的方法。我在网上找不到任何准备好的东西,所以我不得不自己实现一个算法。基本思想很简单,但需要很多步骤。我从两个信息开始:​​一个数组包含云点的坐标,另一个数组包含一组关于 3 个顶点如何连接形成三角形的元组。

  • 首先,您需要找到要用于切割的平面的表示。这意味着您只需使用一个点和平面的法线来表示它。需要该平面才能识别结构上的切割点。
  • 第二步是识别平面上的三角形。简而言之,您只需滚动结构的所有三角形,并找到那些在切割平面上方有一个角,在切割平面下方有另一个角的三角形。也不要忘记考虑一个角在平面上或两个角在平面上的情况。不需要所有其他三角形,因为它们完全位于切割平面的上方或下方。
  • 现在您有了所有三角形的一个子集。您需要提取轮廓的点。因此,对于每个三角形,您有 3 个顶点:通常情况下,您可以想象一个顶点在平面上方,另外两个在下方。然后你有两条线切割飞机。您只需将这些线与切割平面相交即可提取两点。
  • 通过重复此操作,您可以获得二维空间上的一系列点。但是它们没有顺序,如果将它们绘制为连续图,则会出现上下跳跃的线条,因为您提取的点随机位于数组中。因此,需要以适当的方式订购它们。我使用的方法很简单:从一个点开始,连接到最近的一个。在某些不好的情况下,这不起作用,但您可以通过在算法上添加更多规则来避免它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-17
    • 1970-01-01
    • 1970-01-01
    • 2012-05-10
    • 2018-02-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多