从Matlab中的obj 3d对象中提取轮廓
Extract contour from obj 3d object in Matlab
我有一个代表 3D 对象的 .obj 文件。
我需要从这个 3D 对象中提取通过与平面相交获得的轮廓。因此,例如,我有一个表示以垂直轴为导向的圆柱体的对象,然后我想在相交平面为水平时提取圆形轮廓,或者在相交平面为垂直时提取矩形轮廓。关于如何操作有什么建议吗?
因为我不知道如何可视化这个obj文件,所以我用下面的代码转换成了一个补丁(一些函数取自loadawobj from Matlab file exchange)。
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 文件开始的更简单的过程,也可以接受。谢谢!
这就是我在网上收集信息后解决问题的方法。我在网上找不到任何现成的东西,所以我不得不自己实现一个算法。基本思路很简单,但是需要很多步骤。我从两个信息开始:一个数组包含云点的坐标,另一个数组包含一堆关于 3 个顶点如何连接形成三角形的元组。
- 首先,您需要找到要用于切割的平面的表示。这意味着您只需使用一个点和平面的法线来表示它。需要该平面以识别结构上的切割点。
- 第二步是识别平面上的三角形。简而言之,您只需要滚动结构的所有三角形,找到一个角在切割平面上方和另一个角在切割平面下方的三角形。也不要忘记考虑一个角在平面上或两个角在平面上的情况。不需要所有其他三角形,因为它们完全位于切割平面上方或下方。
- 现在你有了所有三角形的一个子集。您需要提取轮廓点。所以对于每个三角形,你有 3 个顶点:在一般情况下,你可以想象一个顶点在平面上方,另外两个在平面下方。然后你有两条线切割飞机。您可以通过简单地将这些线与切割平面相交来提取两个点。
- 通过重复此操作,您将在 2D space 上获得一系列点。但是它们没有顺序,如果您将它们绘制为连续图,您会得到上下跳跃的线条,因为您提取的点随机位于数组中。因此,需要以适当的方式订购它们。我使用的方法非常简单:从一个点开始,连接到最近的一个点。在某些不好的情况下它不起作用,但您可以通过在算法中添加更多规则来避免它。
我有一个代表 3D 对象的 .obj 文件。
我需要从这个 3D 对象中提取通过与平面相交获得的轮廓。因此,例如,我有一个表示以垂直轴为导向的圆柱体的对象,然后我想在相交平面为水平时提取圆形轮廓,或者在相交平面为垂直时提取矩形轮廓。关于如何操作有什么建议吗?
因为我不知道如何可视化这个obj文件,所以我用下面的代码转换成了一个补丁(一些函数取自loadawobj from Matlab file exchange)。
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 文件开始的更简单的过程,也可以接受。谢谢!
这就是我在网上收集信息后解决问题的方法。我在网上找不到任何现成的东西,所以我不得不自己实现一个算法。基本思路很简单,但是需要很多步骤。我从两个信息开始:一个数组包含云点的坐标,另一个数组包含一堆关于 3 个顶点如何连接形成三角形的元组。
- 首先,您需要找到要用于切割的平面的表示。这意味着您只需使用一个点和平面的法线来表示它。需要该平面以识别结构上的切割点。
- 第二步是识别平面上的三角形。简而言之,您只需要滚动结构的所有三角形,找到一个角在切割平面上方和另一个角在切割平面下方的三角形。也不要忘记考虑一个角在平面上或两个角在平面上的情况。不需要所有其他三角形,因为它们完全位于切割平面上方或下方。
- 现在你有了所有三角形的一个子集。您需要提取轮廓点。所以对于每个三角形,你有 3 个顶点:在一般情况下,你可以想象一个顶点在平面上方,另外两个在平面下方。然后你有两条线切割飞机。您可以通过简单地将这些线与切割平面相交来提取两个点。
- 通过重复此操作,您将在 2D space 上获得一系列点。但是它们没有顺序,如果您将它们绘制为连续图,您会得到上下跳跃的线条,因为您提取的点随机位于数组中。因此,需要以适当的方式订购它们。我使用的方法非常简单:从一个点开始,连接到最近的一个点。在某些不好的情况下它不起作用,但您可以通过在算法中添加更多规则来避免它。