在Matlab中从obj 3d对象中提取轮廓

时间:2017-09-08 18:45:31

标签: matlab 3d contour .obj

我有一个表示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文件开始有一个更简单的过程,它也很好并且可以接受。谢谢!

1 个答案:

答案 0 :(得分:1)

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

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