我有一个大型的有限元模型,从这里我可以得到模型的“曲面”,比如定义有限元模型表面的元素和顶点。为了谋划的目的(好的阴谋总是一场胜利!)我想把它画得很好。我的方法就是用
lungs.Vertex=vtx;
lungs.Faces=fcs;
patch(lungs,'facecolor','r','edgecolor','none')
注:我需要边缘颜色无,因为这是4D数据和不同的有限元有不同的三角剖分,如果边缘是绘制用户会头晕。
然而,这将输出一个真正的纯红色的颜色,这是不太好(因为它不能显示复杂的图形,即肺,对细节的关注)。
因此,我决定使用韧带:
camlight; camlight(-80,-10); lighting phong;
但同样,这并不完全正确。实际上,Matlab似乎没有正确地计算出贴片的非标数。
我的假设是,也许贴片并不总是逆时针定义的,因此一些法线走错了方向。然而,这并不是很简单的检查。
任何人都有类似的问题,或者说我该如何解决这个问题才能在这里画出一个很好的曲面呢?
编辑
这是@磁强计回答的结果:
发布于 2014-09-22 18:51:57
如果您的模型给出了面向外的法线,您可以重新排序您的模型的脸,以便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
如果你的有限元模型没有给你向外定向的法线,一种方法可以是重建表面,例如,地壳算法,给你有向外的法线或正确的定向贴片。
编辑:因为你没有法线,我脑海中唯一的解决办法就是重建表面。外壳算法的这一实现过去为我工作得很好。你要做的就是:
[FacesNew,NormalsNew]=MyRobustCrust(Vertices);
如果我没记错的话,FacesNew
还没有逆时针方向,但是您可以使用我上面发布的SortFaces
算法来纠正这个问题,因为您现在已经有了正确的面向面法线,即运行:
[FaceCor,~]=SortFaces(FacesNew,NormalsNew,Vertices)
如果您使用Matlab的reducepatch
(例如reducedmodel=reducepatch(fullmodel,reduction);
)来减少顶点的数量,您将不得不再次重建曲面,因为reducepatch
似乎没有保持补丁的正确方向。
https://stackoverflow.com/questions/25977442
复制相似问题