2012-01-03 3 views
1

저는 STL 파일 가져 오기 도구로 작업 중이며 삼각형 권선 순서를 결정하기 위해 주어진 표준을 사용할 것이라고 생각했습니다. 아래에 4 개의 삼각형이있는 샘플 데이터가 포함되어 있습니다 (원본 데이터에는 70,000 개 이상의 삼각형이 있음). 내 코드의 논리는 정점이 반 시계 방향으로 지정되었다고 가정하고 법선을 계산 한 다음이 계산 된 법선과 제공된 법선의 내적을 계산합니다. 결과가 양수이면 반 시계 방향으로, 그 외의 경우 시계 방향으로 가정합니다.광 조형 (STL) 파일 (삼각 분할 된 객체)의 삼각형 꼭지점 권선 순서

 tm.SetCCW(Dot(Cross(facet.getVertex2() - facet.getVertex1(),facet.getVertex3() - facet.getVertex1()),facet.getNormal()) > 0.0); 

이 논리는 특정 3D 스캐너의 파일 세트에서 실패합니다. 이 파일들을 Rhino3D에로드하고 "Dir"을 실행하여 정상 방향을 볼 때 Rhino가 올바른 방향을 가지고 있습니다! 내가 시도한 다른 STL 시청자 몇 명과 동일합니다.

내 코드는 샘플 데이터에서 시계 방향으로 정점이 제공된다고 추론하지만이 와인딩 순서를 사용하면 제공된 법선이 잘못되었음을 암시하면서 모델이 뒤집혀 있습니다.

이것은 STL 수입업자가 공급 된 법선을 무시하고 반 시계 방향으로 권선하는 것을 전제로한다는 결론에 이르게합니다. 나는 내 가정이 올바른지 여부에 무게를다는 STL 파일 형식에 더 많은 경험을 가진 사람들을 찾고 있습니다.

solid object_name 
    facet normal -0.651094 0.733745 -0.194150 
     outer loop 
      vertex 30.335684 -40.893806 -68.126500 
      vertex 31.155055 -39.911656 -67.162500 
      vertex 30.263726 -40.702583 -67.162500 
     endloop 
    endfacet 
    facet normal -0.654292 0.732059 -0.189714 
     outer loop 
      vertex 30.335684 -40.893806 -68.126500 
      vertex 31.225185 -40.098797 -68.126500 
      vertex 31.155055 -39.911656 -67.162500 
     endloop 
    endfacet 
    facet normal -0.711866 0.677947 -0.183397 
     outer loop 
      vertex 31.225185 -40.098797 -68.126500 
      vertex 31.980540 -39.044870 -67.162500 
      vertex 31.155055 -39.911656 -67.162500 
     endloop 
    endfacet 
    facet normal -0.714326 0.676343 -0.179716 
     outer loop 
      vertex 31.225185 -40.098797 -68.126500 
      vertex 32.048799 -39.228928 -68.126500 
      vertex 31.980540 -39.044870 -67.162500 
     endloop 
    endfacet 
endsolid 

EDIT : 제 패싯 내 계산 : 정점은 물체의 외부에서 볼 때

p1 = {30.335684, -40.893806, -68.126500} 
p2 = {31.155055, -39.911656, -67.162500} 
p3 = {30.263726, -40.702583, -67.162500} 

u = p2 - p1 = {0.819371, 0.98215, 0.964} 
w = p3 - p1 = {-0.071958, 0.191223, 0.964} 

u x w = {0.762454, -0.859241, 0.227356} (calculated normal) 

given normal = {-0.651094, 0.733745, -0.194150} 

calculated_normal <dot> given_normal = -1.17103 

verdict: 90 < theta < 270 where theta is the angle between the calculated and given normals 

답변

1

꼭지점은 시계 반대 방향의 순서로한다. (분명히, 물체의 내부에서 보는 것은 시계 방향으로 진행됩니다.)

정상적으로 바깥 쪽을 향해야합니다.

일부 프로그램은 정상을 무시하고 꼭지점 순서 만 따라야한다는 것을 읽었습니다. 표준에서 {0.0, 0.0, 0.0}으로 설정하는 것이 좋습니다. 버텍스 순서가 모두 사용되어야합니다.

정상적으로 중복됩니다. 많은 프로그램에서 꼭지점 순서 만 있으면됩니다. 나는 그것이 모든 프로그램에 대해 사실인지 알 수 없습니다. 나는 모두 올바른 것으로하는 것이 좋습니다.

+0

답변 해 주셔서 감사합니다. STL 파일에있는 소스가 시계 반대 방향이어야합니까? 이것은 내가 만난 파일의 90 % 이상을 차지하는 것으로 보이며 CCW가되어야하는 무작위 웹 페이지를 읽었지만 결정적으로 본 적이 전혀 없습니다. – PeteUK