gpt4 book ai didi

Matlab 计算错误的表面法线?

转载 作者:太空宇宙 更新时间:2023-11-03 19:45:39 25 4
gpt4 key购买 nike

我有一个大型 FEM 模型,我可以从中获取模型的“表面”,比如定义该 FEM 模型表面的元素和顶点。出于绘图目的(好的情节总是成功的!)我想把它画得很好。我的方法就是使用

lungs.Vertex=vtx;
lungs.Faces=fcs;
patch(lungs,'facecolor','r','edgecolor','none')

注意:我不需要 edgecolor none,因为这是 4D 数据,不同的 FEM 有不同的三角剖分,如果绘制了边缘,用户会感到头晕。

enter image description here

然而,这将以非常普通的红色输出所有内容,这并不好(因为它无法显示图形的复杂性,即肺部,注意细节)。

因此我决定使用照明:

camlight; camlight(-80,-10); lighting phong; 

但同样,这也不完全正确。实际上,似乎补丁 nromals 没有被 Matlab 正确计算。

enter image description here

我的假设是,也许补丁并不总是逆时针定义的,因此一些法线走向错误的方向。然而,这是不容易检查的事情。

任何人都有类似的问题,或者提示我应该如何解决这个问题才能在此处绘制出漂亮的曲面?

编辑

只是为了绘图的动摇,这是使用@magnetometer answer 获得的结果:

enter image description here

最佳答案

如果您的模型为您提供向外的法线,您可以重新排序模型的面,以便 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 模型没有给您提供向外的法线,一种方法可能是使用例如一种地壳算法,可为您提供向外定向的法线或正确定向的补丁。

编辑:由于您没有法线,我想到的唯一解决方案是重建表面。 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com