1

美好的一天,我想寻求有关如何在 MATLAB 中将 3D 坐标 (x,y,z) 转换为 .STL 文件的帮助。

下面是我在 MATLAB 中模拟和获得的一些 3D 坐标,并将其存储在 .txt 文件中。

P =

14  0   25
16  0   20
15  4   24
10  3   6
7   5   37
5   7   3
7   0   37
3   1   37
5   1   4
...
(many more)

请注意,第一列包含 x 坐标,第二列包含 y 坐标,第三列包含 z 坐标。

我探索了以下方法:

tri = delaunayTriangulation(P)
tetramesh(tri)

我得到如下的 3D 对象:

3D 对象

并且

TR = delaunay(P(:,1), P(:,2);
output = trimesh(TR,P(:,1),P(:,2),P(:,3));

另一个 3D 对象视图

对于两者,我都尝试使用 stlwrite() 函数将其导出到 .stl 文件中,但不幸的是,我一直都失败了。

失败1:四面体

DT = delaunayTriangulation(x,y,z);
tetramesh(DT);

错误信息:

Error using stlwrite (line 33)
Tetrahedron triangulation is not supported.

Error in Wong_STL (line 173)
stlwrite(DT,'FinalOutputTrimesh.stl')

失败2:修剪

DT = delaunay(x,y,z);
trimesh(DT,x,y,z);

错误信息:

Error using stlwrite (line 25)
Input argument must be a triangulation object.

Error in Wong_STL (line 161)
stlwrite(DT,'FinalOutputTrimesh.stl')

现在,我正在尝试解决如下问题,但我不知道如何找到 T。

P = (x,y,z)
T = ??? ??? ???
TR = triangulation(T, P);
stlwrite(TR,'tritext.stl','text')

我需要知道如何找到 T,以便能够将 3D 坐标导出到 STL 文件。

有人可以分享他/她关于如何解决这个3D 坐标转换为 .stl 文件问题的知识吗?

4

1 回答 1

0

也许您可以使用在 Matlab Stack Exchange 上找到的这个函数。我以前用过。它将数据存储在三个值中:X、Y、Z,其中 X 对应于 Z 的列,Y 对应于行。然后它使用 dx 和 dy 的标量值来指定网格点之间的 x 和 y 间距以映射文件。

希望这可以帮助。抱歉,我没有更详细的解释,因为我从我的一位同事那里找到了这个功能。

    nfacets = 0;
    
    for i=1:(size(z,1)-1)
        for j=1:(size(z,2)-1)
            
            p1 = [x(i,j)     y(i,j)     z(i,j)];
            p2 = [x(i,j+1)   y(i,j+1)   z(i,j+1)];
            p3 = [x(i+1,j+1) y(i+1,j+1) z(i+1,j+1)];
            val = local_write_facet(fid,p1,p2,p3,mode);
            nfacets = nfacets + val;
            
            p1 = [x(i+1,j+1) y(i+1,j+1) z(i+1,j+1)];
            p2 = [x(i+1,j)   y(i+1,j)   z(i+1,j)];
            p3 = [x(i,j)     y(i,j)     z(i,j)];        
            val = local_write_facet(fid,p1,p2,p3,mode);
            nfacets = nfacets + val;
            
        end
    end
    
    if strcmp(mode,'ascii')
        fprintf(fid,'endsolid %s\r\n',title_str);
    else
        fseek(fid,0,'bof');
        fseek(fid,80,'bof');
        fwrite(fid,nfacets,'int32');
    end
    
    fclose(fid);
    
    disp( sprintf('Wrote %d facets',nfacets) );

% Local subfunctions

function num = local_write_facet(fid,p1,p2,p3,mode)

if any( isnan(p1) | isnan(p2) | isnan(p3) )
    num = 0;
    return;
else
    num = 1;
    n = local_find_normal(p1,p2,p3);
    
    if strcmp(mode,'ascii')
        
        fprintf(fid,'facet normal %.7E %.7E %.7E\r\n', n(1),n(2),n(3) );
        fprintf(fid,'outer loop\r\n');        
        fprintf(fid,'vertex %.7E %.7E %.7E\r\n', p1);
        fprintf(fid,'vertex %.7E %.7E %.7E\r\n', p2);
        fprintf(fid,'vertex %.7E %.7E %.7E\r\n', p3);
        fprintf(fid,'endloop\r\n');
        fprintf(fid,'endfacet\r\n');
        
    else
        
        fwrite(fid,n,'float32');
        fwrite(fid,p1,'float32');
        fwrite(fid,p2,'float32');
        fwrite(fid,p3,'float32');
        fwrite(fid,0,'int16');  % unused
        
    end
    
end


function n = local_find_normal(p1,p2,p3)

v1 = p2-p1;
v2 = p3-p1;
v3 = cross(v1,v2);
n = v3 ./ sqrt(sum(v3.*v3));
于 2021-04-27T15:06:35.173 回答