我有一个很大的FEM模型,可以从中获得模型的“表面”,例如定义该FEM模型表面的元素和顶点。出于绘图目的(好的绘图始终是胜利!),我想很好地进行绘图。我的方法只是用
lungs.Vertex=vtx;
lungs.Faces=fcs;
patch(lungs,'facecolor','r','edgecolor','none')
注意:我不需要edgecolor,因为这是4D数据,并且不同的FEM具有不同的三角剖分,如果绘制了边缘,用户将感到头晕。
但是,这将以纯正的红色输出所有内容,这不是很好(因为对于细节的注意,它无法显示图形的复杂性,即肺部)。
因此,我决定使用ligthing:
camlight; camlight(-80,-10); lighting phong;
但是,这也不是完全正确的。实际上,Matlab似乎无法正确计算补丁程序。
我的推测是,补丁可能并非总是沿逆时针方向定义,因此某些法线方向错误。但是,这并不是很容易检查的事情。
任何人都有类似的问题,或者想知道如何在此绘制一个漂亮的曲面,以解决这个问题?
编辑
仅仅为了绘图的抖动,这是通过@magnetometer答案获得的结果:
最佳答案
如果模型为您提供了面向外部的法线,则可以对模型的面进行重新排序,以便Matlab可以正确地计算出其自身的法线。如果您具有三角形的面和朝外的法线,则以下函数有效:
function [FaceCor,nnew]=SortFaces(Faces,Normals,Vertices)
FaceCor=Faces;
nnew=Normals*0;
for jj=1:size(Faces,1)
v1=Vertices(Faces(jj,3),:)-Vertices(Faces(jj,2),:);
v2=Vertices(Faces(jj,2),:)-Vertices(Faces(jj,1),:);
nvek=cross(v2,v1); %calculate normal vectors
nvek=nvek/norm(nvek);
nnew(jj,:)=nvek;
if dot(nvek,Normals(jj,:))<0
FaceCor(jj,:)=[Faces(jj,3) Faces(jj,2) Faces(jj,1)];
nnew(jj,:)=-nvek;
end
end
如果您的FEM模型没有给您向外指向的法线,则一种方法可能是使用例如一种 shell 算法,可为您提供向外定向的法线或方向正确的面片。
编辑:
由于您没有法线,因此我想到的唯一解决方案是重建曲面。 This implementation of the crust algorithm过去对我来说效果很好。您需要做的只是:
[FacesNew,NormalsNew]=MyRobustCrust(Vertices);
如果我没记错的话,
FacesNew
尚未逆时针定向,但是您可以使用上面发布的SortFaces
算法对此进行更正,因为您现在已经正确定向了脸部法线,即运行:[FaceCor,~]=SortFaces(FacesNew,NormalsNew,Vertices)
如果您使用Matlab的
reducepatch
(例如reducedmodel=reducepatch(fullmodel,reduction);
)来减少顶点数量,那么您将不得不再次重建曲面,因为reducepatch
似乎无法保持面片的正确方向。关于Matlab计算错误的表面法线?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25977442/