首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Matlab计算错误的曲面法线?

Matlab计算错误的曲面法线?
EN

Stack Overflow用户
提问于 2014-09-22 15:10:54
回答 1查看 1.2K关注 0票数 5

我有一个大型的有限元模型,从这里我可以得到模型的“曲面”,比如定义有限元模型表面的元素和顶点。为了谋划的目的(好的阴谋总是一场胜利!)我想把它画得很好。我的方法就是用

代码语言:javascript
运行
复制
lungs.Vertex=vtx;
lungs.Faces=fcs;
patch(lungs,'facecolor','r','edgecolor','none')

注:我需要边缘颜色无,因为这是4D数据和不同的有限元有不同的三角剖分,如果边缘是绘制用户会头晕。

然而,这将输出一个真正的纯红色的颜色,这是不太好(因为它不能显示复杂的图形,即肺,对细节的关注)。

因此,我决定使用韧带:

代码语言:javascript
运行
复制
camlight; camlight(-80,-10); lighting phong; 

但同样,这并不完全正确。实际上,Matlab似乎没有正确地计算出贴片的非标数。

我的假设是,也许贴片并不总是逆时针定义的,因此一些法线走错了方向。然而,这并不是很简单的检查。

任何人都有类似的问题,或者说我该如何解决这个问题才能在这里画出一个很好的曲面呢?

编辑

这是@磁强计回答的结果:

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-09-22 18:51:57

如果您的模型给出了面向外的法线,您可以重新排序您的模型的脸,以便Matlab可以正确地计算它自己的法线。如果您有三角形面和向外定向的法线,下面的函数可以工作:

代码语言:javascript
运行
复制
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

如果你的有限元模型没有给你向外定向的法线,一种方法可以是重建表面,例如,地壳算法,给你有向外的法线或正确的定向贴片。

编辑:因为你没有法线,我脑海中唯一的解决办法就是重建表面。外壳算法的这一实现过去为我工作得很好。你要做的就是:

代码语言:javascript
运行
复制
[FacesNew,NormalsNew]=MyRobustCrust(Vertices);

如果我没记错的话,FacesNew还没有逆时针方向,但是您可以使用我上面发布的SortFaces算法来纠正这个问题,因为您现在已经有了正确的面向面法线,即运行:

代码语言:javascript
运行
复制
[FaceCor,~]=SortFaces(FacesNew,NormalsNew,Vertices)

如果您使用Matlab的reducepatch (例如reducedmodel=reducepatch(fullmodel,reduction); )来减少顶点的数量,您将不得不再次重建曲面,因为reducepatch似乎没有保持补丁的正确方向。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25977442

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档