代码之家  ›  专栏  ›  技术社区  ›  Emanuele

在Matlab中从obj三维物体中提取轮廓

  •  2
  • Emanuele  · 技术社区  · 7 年前

    因为我不知道如何可视化这个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文件开始有一个更简单的过程,那么它也是可以接受的。非常感谢。

    1 回复  |  直到 7 年前
        1
  •  1
  •   Emanuele    7 年前

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

    • 第二步是识别平面上的三角形。简而言之,你只需要滚动结构的所有三角形,找到那些在切割平面上方有一个角,在切割平面下方有另一个角的三角形。也不要忘记考虑一个角在平面上或两个角在平面上的情况。不需要所有其他三角形,因为它们完全位于切割平面的上方或下方。
    • 通过重复此操作,可以在二维空间上获得一系列点。但是它们没有顺序,如果你把它们绘制成连续的图,你会看到直线上下跳跃,因为你提取的点在数组中是随机定位的。因此,需要以适当的方式订购。我使用的方法非常简单:从一个点开始,连接到最近的一个点。有些糟糕的情况下,这不起作用,但您可能可以通过在算法上添加更多规则来避免它。