2014-09-22 11 views
5

Ich habe ein großes FEM-Modell, von dem ich die "Oberfläche" des Modells bekommen kann, sagen die Elemente und der Eckpunkt, die die Oberfläche dieses FEM-Modells definieren. Zum Plotten (schöne Plots sind immer ein Gewinn!) Möchte ich es schön grafisch darstellen. Mein Ansatz ist nurMatlab berechnet falsche Oberflächennormalen?

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

verwendet HINWEIS: Ich brauche edgecolor keine, da diese 4D-Daten und verschiedene FEM haben unterschiedliche Triangulation, wenn Kanten aufgetragen Benutzer schwindlig wird.

enter image description here

aber dies wird alles ausgeben, in einer wirklich einfachen roten Farbe, die nicht schön ist (wie es nicht die Komplexität der Figur zeigen kann, die Lungen, die aufmerksam zu Details).

deshalb entschied ich mich ligthing zu verwenden:

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

Aber noch einmal, das ist nicht ganz korrekt ist. Tatsächlich scheint es, dass die Patch-Nomals von Matlab nicht korrekt berechnet werden.

enter image description here

Meine Vermutung ist, dass vielleicht die Patches nicht immer definiert gegen den Uhrzeigersinn und damit einige Normalen in die falsche Richtung gehen. Das ist jedoch nicht einfach zu überprüfen.

Jeder hat ein ähnliches Problem, oder wie sollte ich dieses Problem ansprechen, um hier eine schöne Oberfläche zu haben?

EDIT

Gerade für die Schütteln Plotten, hier ist das Ergebnis mit @magnetometer Antwort erhalten:

enter image description here

Antwort

3

Wenn Ihr Modell, das Sie nach außen orientierte Normalen gibt, können Sie re- sortiere die Flächen deines Modells, damit Matlab die eigenen Normalen richtig berechnen kann. Die folgende Funktion funktioniert, wenn Sie Dreiecksflächen und nach außen orientierten Normalen haben:

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 

Wenn Ihr FEM-Modell nicht nach außen Normalen nicht gibt gerichtet ist, könnte ein Weg sein, um die Oberfläche zu rekonstruieren unter Verwendung von z.B. ein Krustenalgorithmus, der dir nach außen gerichtete Normalen oder korrekt ausgerichtete Flecken gibt.

EDIT: Da Sie keine Normalen haben, ist die einzige Lösung, die mir in den Sinn kommt, die Oberfläche zu rekonstruieren. This implementation of the crust algorithm hat in der Vergangenheit gut für mich gearbeitet. Alles, was Sie tun müssen, ist:

[FacesNew,NormalsNew]=MyRobustCrust(Vertices); 

Wenn ich mich richtig erinnere, FacesNew gegen den Uhrzeigersinn noch nicht ausgerichtet ist, aber Sie können den SortFaces Algorithmus ich oben, dies zu korrigieren geschrieben verwenden, wie Sie jetzt richtig Flächennormalen ausgerichtet haben, dh läuft:

[FaceCor,~]=SortFaces(FacesNew,NormalsNew,Vertices) 

Wenn Sie Matlab reducepatch (zB reducedmodel=reducepatch(fullmodel,reduction);), um die Anzahl der Ecken zu reduzieren, werden Sie die Oberfläche wieder rekonstruieren müssen, da reducepatch nicht die richtige Ausrichtung des Patches zu halten scheinen.

+0

Ich habe definitiv keine Normalen, das ist das Problem. Wenn alle Normalen "nach außen orientiert" oder "nach innen orientiert" sind, dann wird es auch kein Problem geben, nur umorientieren und thats es. Aber es scheint (aus dem Bild), dass einige nach innen und einige nach außen gehen, was das Blinken falsch macht. –

+0

Sehr sehr interessante Funktionen in der Tat. Allerdings habe ich immer noch ein Problem. Ich habe "Face Normals", aber es scheint, Matlab will "Vertex Normals" für das Einstellen von Licht. Wie schlägst du vor, dass ich mich dem annähere? Vertexnormals = Mittelwert (Facenormals_with_that_vertex)? –

+0

Ich habe es so gemacht und tolle Ergebnisse erzielt. Vielen Dank, das ist eine sehr nette Antwort. –

Verwandte Themen