[3D 모델] STL 포맷

Kleinstein·2022년 12월 19일
0

Three.js 관련

목록 보기
1/5

원본출처

위 출처의 내용에서 stl 포맷을 설명하는 부분만 번역/의역 하였다.

배경

STL(StereoLithography)파일 포맷은 3차원 surface 지오메트리(geometry)를 삼각형을 이용해 표현하는 포맷이다. 여기서 말하는 surface 란 작은 삼각형들의 모음(facets)으로써, 표면의 지오메트리(geometry)가 tessellated 되었다라고 표현된다. 각 facet (삼각형)은 삼각형 표면에 직교하는 방향벡터와 삼각형을 이루는 세 점으로 표현된다.

Format 구성

STL 파일은 facet 데이터들의 리스트로 구성되어 있다. 각 facet 은 unit normal(삼각형에 수직이면서 길이는 1인 선)과 세 점으로 구성되며 각 facet 마다 무조건 이 unit normal 과 세 점의 좌표는 존재해야만 한다. normal 도 x, y, z의 좌표로 저장된다. 그러므로 각 facet에 대해 총 12개의 숫자가 사용된다.

그림 1. facet의 방향 은 unit normal 의 방향과 삼각형의 세 꼭지점의 순서로 정해진다. (오른손을 감싸쥘때 방향이 세 점의 순서, 이때 엄지 손가락의 방향이 normal 방향 => facet 의 방향)

Facet 방향

Facet 은 3차원 물체의 표면을 표시한다. 그래서 facet 의 한쪽 면은 보통 3차원 물체의 내부 방향, 반대쪽 면은 외부 방향을 가리키게 되고, facet이 이 둘의 경계면을 형성한다.

facet 의 방향(즉 어떤 면이 '내부 방향' 이고, 어떤 면이 '외부 방향'을 뜻하는지)은 항상 다음의 두 가지 방법을 통해 정의된다.

첫번째로, normal 의 방향은 '외부 방향'과 같다.

두번째로, 삼각형의 꼭지점은 3차원 물체의 외부에서 봤을때 시계 반대 방향 순서대로 저장되어야 한다.(오른손 법칙) 이 두가지 방법이자 법칙이 그림 1.에 나와있다.

점-대-점 규칙Vertex-to-vertex rule

각 삼각형은 이웃한 삼각형과 반드시 두 점을 공유해야만 한다. 다른말로 하자면, 어떤 삼각형의 한 점이 다른 삼각형의 선분 위에 존재해서는 안된다. 이 규칙은 그림 2.를 참조해보자.

그림 2. 점에 대한 규칙 이 그림에서 좌측의 그림은 한 점이 다른 삼각형의 선분위에 있으므로 규칙에 어긋난다. 오른쪽의 그림은 규칙에 적합하다

표시되는 객체는 삼차원 좌표에서 모두 양수인 구역에 위치해야 한다. 즉, 모든 정점 좌표는 양수여야(음수나 0이 아닌) 한다. 또한, STL 파일에는 축척 정보(단위 정보)가 포함되어 있지 않다. 그래서 STL 파일만으로는 두 점 사이의 거리가 1 m 인지, 1 mm 인지 알 수 없다.

공식적인 3D Systems STL 사양 문서에는 "3차원 물체를 구성하는 특수 속성"을 포함하는 조항이 있기는 하지만 이러한 속성을 어떤 형식으로 포함해야 하는지에 대한 규칙은 정해지지 않았다. 또한 문서에는 "삼각형 변의 최소 길이"와 "삼각형 최대 크기"에 대한 데이터가 들어갈 수 있다고는 명시되어 있지만 이 값의 의미가 명확하지 않아서 모호하다.

또한 오름차순 z 값 순서로 삼각형을 정렬하는 것이 권장되긴 하지만 반드시 그래야만 하는 것은 아니다. 그리고 일반적으로 StL 파일은 대소문자를 구분하지 않는 확장자 ".STL"로 저장된다.

STL 표준에는 ASCII 및 바이너리의 두 가지 데이터 형식이 포함되어 있다. 이에 대해서는 아래의 설명을 보자.

STL ASCII 포맷 (텍스트 파일 형식)

ASCII 포맷은 주로 새로운 CAD 인터페이스를 테스트하기 위한 용도로 생겨났다. 텍스트 파일 형태라서 파일 크기가 쉽게 커지기 때문에 일반적인 사용에는 비실용적이다. ASCII 파일이 어떻게 구성되어 있는지는 다음과 같다.

그림 3. ASCII STL 포맷 파일의 데이터 구조

(중괄호로 쌓인 부분이 하나의 삼각형을 의미하며, 이 부분이 필요한 만큼 반복되어 기록된다.)

굵은 글씨체로 쓰인 부분은 STL 포맷 파일을 위해 미리 정해놓은 키워드 이며 그림 3.에서 보듯이 반드시 소문자로 쓰여져야 한다.

"facet normal" 과 "outer loop" 사이의 띄어쓰기에 주의하고, "endloop", "endfacet" 에는 띄어쓰기가 없다는 것에도 주의하자.

또한 들여쓰기에 탭 문자를 사용해서는 안되며, space 키로 들여쓰기가 되어 있어야 한다.

이탤릭 폰트로 쓰여진 변수들은 이 포맷으로 데이터를 쓰려는 사람들이 해당 삼각형에 대한 적절한 값으로 치환해야 하며 facet normal 과 vertex 에 해당하는 숫자는 float 데이터 형식으로(좀 더 정확하게는 Single-precision floating-point format) 예를 들면 1.23456E+789 과 같이 표기한다.

facet normal 에 해당하는 각 좌표의 숫자에는 음수가 포함될수 있다. 그러나 vertex 에 해당하는 좌표에는 음수가 포함되면 안된다.

STL Binary Format(바이너리 파일 형식)

바이너리 파일 형식에는 IEEE integer 값과 floating point numerical representation 값이 사용된다.

바이너리 STL 파일의 구성은 다음과 같다.

그림 4. 바이너리 STL 파일의 데이터 구조

처음 80 바이트는 헤더정보를 넣게끔 예약되어 있다. 이곳에 필요한 헤더정보(회사 이름, 모델 이름 등등)를 텍스트로 넣으면 된다. 그리고 그 다음 4바이트에는 전체 facet 의 갯수를 unsinged long integer 값으로 넣어준다.

그 다음에는 facet 의 normal의 세 좌표값은 float 로 넣고,

삼각형 각 점의 x, y, z 좌표값을 순서에 맞게 float 로 넣어주면된다.

그림 4. 에서 “{…}+,” 로 표시된 부분은 중괄호로 표시된 부분을 한 번 이상 필요한 만큼, 즉 facet 의 갯수만큼 반복할 수 있다는 뜻이다.

마지막의 2 Byte 로 예약된 attribute 부분에 대한 규약은 공식 문서에는 지정되어 있지 않지만 그 값은 0으로 지정되어야 한다고 되어있다. 그냥 unsigned integer 값으로 0을 넣어주면 된다.

profile
developer in germany

0개의 댓글