2014-09-22 6 views
5

필자는 모델의 "표면"을 얻을 수있는 거대한 FEM 모델, 즉 FEM 모델의 표면을 정의하는 요소와 정점을 말합니다. 음모를 꾸미기 위해 (좋은 음모는 항상 승리합니다!) 멋지게 음모를 꾸미려고합니다. 나의 접근 방식은Matlab은 잘못된 표면 법선을 계산합니까?

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

참고를 사용하는 것입니다 :이 4D 데이터이며, 다른 FEM은 가장자리가 그려 경우 사용자가 현기증이 될 것입니다, 다른 삼각 측량을 가지고있는 나는, edgecolor 없음을 필요가 없습니다.

enter image description here

그러나 (이 세부 사항에 세심한위한 폐에있는 그림의 복잡성을, 표시 할 수 없습니다로) 좋은 아닌 정말 보통 붉은 색이 출력됩니다 모든 것을.

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

그러나 다시, 이것은 완전히 정확하지 않습니다 :

그러므로 나는 ligthing를 사용하기로 결정했다. 실제로 그것은 패치 음수가 Matlab에 의해 정확하게 계산되지 않는 것으로 보입니다.

enter image description here

내 추측은 어쩌면 패치는 항상 정의되지 않은 반 시계 방향 및 따라서 일부 법선이 잘못된 방향으로 가고 있다는 것입니다. 그러나 그것은 확인하기가 쉽지 않습니다.

누구나 비슷한 문제가 있거나 멋진 표면을 여기에 표시하려면이 문제를 어떻게 해결해야합니까? 모델 당신에게 바깥쪽으로 지향 법선을 제공하는 경우

enter image description here

답변

3

, 당신이 재 수 : 그냥 플롯의 흔들림에 대한 편집

, 여기 @magnetometer의 답을 얻은 결과입니다 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이 패치의 올바른 방향을 유지하지 않는 것, 당신이 다시 표면을 재구성해야합니다.

+0

나는 분명히 법선을 가지고 있지 않다. 문제가있다. 모든 법선이 "외부 지향적"이거나 "내부 지향적"이라면 어떤 문제도 나타나지 않을 것입니다. 단지 방향을 바꾸고 thors합니다. 그러나 (사진에서) 일부는 안쪽으로 가고 어떤 것은 바깥쪽으로 가며 결속을 잘못 만든 것처럼 보입니다. –

+0

실제로 매우 흥미로운 기능. 그러나 나는 여전히 문제가 있습니다. 나는 "얼굴 법선"을 가지고 있지만 matlab은 ligthing을 설정하기 위해 "정점 법선"을 원한다. 이 접근법에 대해 어떻게 생각하세요? Vertexnormals = 평균 (facenormals_with_that_vertex)? –

+0

나는 그것을 좋아했고 놀라운 결과를 얻었다. 고마워, 이건 아주 좋은 대답이다. –