フィルターのクリア

stl to grid error

58 ビュー (過去 30 日間)
donghoo
donghoo 2024 年 7 月 17 日 18:44
回答済み: Cris LaPierre 約9時間 前
I tired to use above code to make grid [xgridvector,ygridvector,zheights] use for simscape grid surface.
when I use 'terrain.stl', it works well. But when I use 'untitle.stl' the resault shows like this. please help me T_T..
%%code starts here
[stlData, ~] = stlread('untitled.stl');
vertices = stlData.vertices;
% %
[uniqueVertices, ~, ic] = unique(vertices(:, 1:2), 'rows');
averageZ = accumarray(ic, vertices(:, 3), [], @mean);
vertices = [uniqueVertices, averageZ];
xGridVector = linspace(min(vertices(:,1)), max(vertices(:,1)), 100);
yGridVector = linspace(min(vertices(:,2)), max(vertices(:,2)), 100);
[X, Y] = ndgrid(xGridVector, yGridVector);
F = scatteredInterpolant(vertices(:,1), vertices(:,2), vertices(:,3), 'linear', 'none');
ZHeights = F(X, Y);
ZHeights(isnan(ZHeights)) = min(vertices(:,3));
figure;
surf(X, Y, ZHeights);
title('Grid Surface from STL File');
xlabel('X (meters)');
ylabel('Y (meters)');
zlabel('Z (meters)');
grid on;
function [stlData, units] = stlread(filename)
fid = fopen(filename, 'r');
if fid == -1
error('File could not be opened, check name or path.')
end
M = fread(fid, inf, 'uint8=>uint8');
fclose(fid);
[pathstr, name, ext] = fileparts(filename);
if strcmpi(ext, '.stl') ~= 1
error('Filename must have a .stl extension');
end
if isempty(M)
error('File is empty.');
end
M = char(M');
if (strncmp(M, 'solid', 5))
[stlData.vertices, stlData.faces, units] = stlReadAscii(filename);
else
[stlData.vertices, stlData.faces, units] = stlReadBinary(filename);
end
end
% ASCII 형식 STL 파일 읽기 (단순화된 예시)
function [vertices, faces, units] = stlReadAscii(filename)
fid = fopen(filename, 'r');
vertices = [];
while ~feof(fid)
line = fgetl(fid);
if startsWith(line, 'vertex')
vertex = sscanf(line, 'vertex %f %f %f');
vertices = [vertices; vertex'];
end
end
fclose(fid);
faces = reshape(1:size(vertices, 1), 3, [])';
units = 'mm';
end
% Binary 형식 STL 파일 읽기 (단순화된 예시)
function [vertices, faces, units] = stlReadBinary(filename)
fid = fopen(filename, 'rb');
fseek(fid, 80, 'bof');
numFaces = fread(fid, 1, 'uint32');
faces = zeros(numFaces, 3);
vertices = zeros(numFaces*3, 3);
for i = 1:numFaces
fread(fid, 3, 'float32');
vertices((i-1)*3+1:i*3, :) = fread(fid, [3, 3], 'float32')';
fread(fid, 1, 'uint16');
faces(i, :) = (i-1)*3+1:i*3;
end
fclose(fid);
units = 'mm';
end
  2 件のコメント
Kilsu Kim
Kilsu Kim 約22時間 前
Hello Donghoo,
Could you elaborate on your goal? Do you want to visualize the surface of the STL file? Then you can simply run the following code.
% Read the STL file
stlFile = 'untitled.stl'; % Replace with your STL file name
stlData = stlread(stlFile);
% Plot the STL file
figure;
trisurf(stlData.ConnectivityList, stlData.Points(:,1), stlData.Points(:,2), stlData.Points(:,3), ...
'FaceAlpha',0.9,'EdgeColor', 'none');
axis equal;
title('Grid Surface from STL File');
xlabel('X (meters)');
ylabel('Y (meters)');
zlabel('Z (meters)');
grid on; grid minor;
Hope this helps.
donghoo
donghoo 約11時間 前
Thanks for your answering.
The desired goal is to load an stl file and extract data to be used as the xgridVector, ygridVector and zheights parameters used in the grid surface block in simscape multibody.

サインインしてコメントする。

回答 (1 件)

Cris LaPierre
Cris LaPierre 約9時間 前
Your files are not the same size. How were they created?
  • terrain.STL is 6.2 MB (127508 faces, 382524 vertices)
  • untitled.stl is 0.1 MB (1856 faces, 5568 vertices)
This translates to a difference in the number of faces and vertices in your files, ultimately meaning the grid in untilted.stl is much coarser than in terrain.STL. You could try resampling you mesh, but you would already be working with reduced resolution data. Is there an way to increase the number of vertices and faces when generating untitled.stl?

カテゴリ

Help Center および File ExchangeSTL (STereoLithography) についてさらに検索

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by