2014-09-22 12 views
5

Ho un grande modello FEM da dove posso ottenere la "superficie" del modello, dire gli elementi ei vertici che definiscono la superficie di quel modello FEM. Per scopi di trama (le belle trame sono sempre una vittoria!) Voglio tracciarlo bene. Il mio approccio è solo quello di utilizzareMatlab che calcola le normali di superficie errate?

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

NOTA: ho bisogno edgecolor nessuno, come si tratta di dati 4D e diverso FEM hanno triangolazione diverso, se i bordi sono tracciate utente sarà vertigini.

enter image description here

Tuttavia questo tutto uscita volontà in un colore davvero pianura rosso, che non è bello (in quanto non può mostrare la complessità della figura, che sono i polmoni, per l'attento ai dettagli).

quindi ho deciso di utilizzare ligthing:

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

Ma ancora una volta, questo non è del tutto corretto. In realtà sembra che i patch nromals non vengano calcolati correttamente da Matlab.

enter image description here

La mia supposizione è che forse le patch non sono sempre definiti in senso antiorario e quindi alcune normali andare nella direzione sbagliata. Comunque è qualcosa che non è semplice da controllare.

Chiunque ha un problema simile, o ahint di come dovrei aproach questo problema in modo da avere una superficie bella ploted qui?

EDIT

Solo per la scossa di complotto, ecco il risultato ottenuto con risposta @magnetometer:

enter image description here

risposta

3

Se il modello ti dà normali orientate verso l'esterno, è possibile ri- ordina i volti del tuo modello in modo che Matlab possa calcolare correttamente le proprie normali. La seguente funzione funziona se si dispone facce triangolari e normali orientate verso l'esterno:

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 

Se il modello FEM non dà normali diretti verso l'esterno, un modo potrebbe essere quello di ricostruire la superficie utilizzando ad esempio un algoritmo di crosta che ti fornisce normali orientate verso l'esterno o patch orientate correttamente.

MODIFICA: Come non hai le normali, l'unica soluzione che mi viene in mente è ricostruire la superficie. This implementation of the crust algorithm ha funzionato bene per me in passato. Tutto quello che dovete fare è:

[FacesNew,NormalsNew]=MyRobustCrust(Vertices); 

Se non ricordo male, FacesNew non sono ancora orientati in senso antiorario, ma è possibile utilizzare il SortFaces algoritmo che ho postato qui sopra per correggere questo, come ora hanno correttamente orientata normali delle facce, cioè gestito:

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

Se si utilizza di Matlab reducepatch (ad es reducedmodel=reducepatch(fullmodel,reduction);) per ridurre il numero di vertici, si dovrà ricostruire nuovamente la superficie, come reducepatch non sembra mantenere il corretto orientamento delle patch.

+0

Sicuramente non ho le normali, questo è il problema. Se tutte le normali fossero "orientate verso l'esterno" o "orientate verso l'interno", allora non ci saranno problemi neanche, basta orientarli e basta. Ma sembra (dalla foto) che alcuni vadano all'interno e altri all'esterno, rendendo l'idea sbagliata. –

+0

Funzioni davvero molto interessanti. Tuttavia sto ancora avendo problemi. Ho "faccia le normali" ma sembra che MATLAB desideri "vertex normal" per impostare ligthing. Come suggerisci di avvicinarmi a questo? Vertexnormals = media (facenormals_with_that_vertex)? –

+0

L'ho fatto così e ho ottenuto risultati sorprendenti. Grazie mille, questa è una risposta molto bella. –