웨이브프론트 .obj 파일

**OBJ**(.OBJ)는 웨이브프론트 테크놀로지스가 디 어브밴스트 비주얼라이저(The Advanced Visualizer) 애니메이션 패키지를 위해 처음 개발한 기하학적 정의 파일 형식이다. 이는 오픈 포맷이며 다른 3차원 컴퓨터 그래픽스 애플리케이션 공급업체에 의해 채택되었다.

OBJ 파일 형식은 3D 기하학만을 나타내는 간단한 데이터 형식으로, 특히 각 꼭짓점의 위치, 각 텍스처 좌표 꼭짓점의 UV 매핑, 꼭짓점 노멀, 그리고 꼭짓점 및 텍스처 꼭짓점 목록으로 정의된 각 폴리곤을 구성하는 면을 포함한다. 꼭짓점은 기본적으로 시계 반대 방향으로 저장되므로 면 노멀을 명시적으로 선언할 필요가 없다. OBJ 좌표는 단위가 없지만, OBJ 파일은 사람이 읽을 수 있는 주석 줄에 스케일 정보를 포함할 수 있다.

## 파일 형식
해시 문자(#) 뒤에 오는 모든 내용은 주석이다.

 # 이것은 주석입니다.

OBJ 파일은 꼭짓점 데이터, 자유형 곡선/표면 속성, 요소, 자유형 곡선/표면 본체 문, 자유형 표면 간의 연결성, 그룹화 및 표시/렌더 속성 정보를 포함할 수 있다. 가장 일반적인 요소는 기하학적 꼭짓점, 텍스처 좌표, 꼭짓점 노멀 및 다각형 면이다.

 # (x, y, z, [w]) 좌표를 가진 기하학적 꼭짓점 목록, w는 선택 사항이며 기본값은 1.0입니다.
 v 0.123 0.234 0.345 1.0
 v ...
 ...
 # (u, [v, w]) 좌표를 가진 텍스처 좌표 목록, 이 값들은 0과 1 사이에서 변동합니다. v, w는 선택 사항이며 기본값은 0입니다.
 vt 0.500 1 [0]
 vt ...
 ...
 # (x,y,z) 형식의 꼭짓점 노멀 목록; 노멀은 단위 벡터가 아닐 수 있습니다.
 vn 0.707 0.000 0.707
 vn ...
 ...
 # (u, [v, w]) 형식의 매개변수 공간 꼭짓점; 자유형 기하학 문 (아래 참조)
 vp 0.310000 3.210000 2.100000
 vp ...
 ...
 # 다각형 면 요소 (아래 참조)
 f 1 2 3
 f 3/1 4/2 5/3
 f 6/4/1 3/5/3 7/6/5
 f 7//1 8//2 9//3
 f ...
 ...
 # 선 요소 (아래 참조)
 l 5 8 1 2 4 9

### 기하학적 꼭짓점
꼭짓점은 `v` 문자로 시작하는 줄을 통해 지정된다. 그 뒤에 (x,y,z[,w]) 좌표가 따른다. W는 선택 사항이며 기본값은 1.0이다. W는 점의 크기를 조절한다. 점 (x,y,z,w)는 점 (x/w,y/w,z/w)에 해당한다. 좌표 위치를 지정하는 데는 오른손 좌표계가 사용된다. 일부 애플리케이션은 x, y, z 뒤에 빨강, 초록, 파랑 값을 넣어 꼭짓점 색상을 지원한다(이는 w 지정을 배제한다). 색상 값은 0에서 1까지의 범위를 갖는다.

### 매개변수 공간 꼭짓점
자유형 곡면 모델링 문은 문자열 `vp`로 시작하는 줄에 지정될 수 있다. 곡선이나 표면의 매개변수 공간에 점을 정의한다. 곡선 점에는 `u`만 필요하고, 표면 점과 비합리적 트리밍 곡선의 제어점에는 `u`와 `v`가 필요하며, 합리적 트리밍 곡선의 제어점에는 `u`, `v`, `w`(가중치)가 필요하다.

### 면 요소
면은 vertex_index/texture_index/normal_index 형식의 꼭짓점, 텍스처 및 노멀 인덱스 목록을 사용하여 정의되며, 각 인덱스는 1부터 시작하여 참조된 요소가 정의된 순서에 따라 증가한다. 사각형과 같은 다각형은 3개 이상의 인덱스를 사용하여 정의할 수 있다.

OBJ 파일은 또한 NURBS 표면과 같이 곡선과 표면을 사용하여 객체를 정의하는 자유형 기하학을 지원한다.

#### 꼭짓점 인덱스
유효한 꼭짓점 인덱스는 이전에 정의된 꼭짓점 목록의 해당 꼭짓점 요소와 일치한다.
인덱스가 양수이면 해당 꼭짓점 목록의 오프셋(1부터 시작)을 참조한다.
인덱스가 음수이면 꼭짓점 목록의 끝을 상대적으로 참조하며, -1은 마지막 요소를 참조한다.

각 면은 3개 이상의 꼭짓점을 포함할 수 있다.

 f v1 v2 v3 ....

#### 꼭짓점 텍스처 좌표 인덱스
선택적으로, 텍스처 좌표 인덱스는 면을 정의할 때 텍스처 좌표를 지정하는 데 사용될 수 있다.
면을 정의할 때 꼭짓점 인덱스에 텍스처 좌표 인덱스를 추가하려면,
꼭짓점 인덱스 바로 뒤에 슬래시를 넣고 텍스처 좌표 인덱스를 넣어야 한다.
슬래시 앞이나 뒤에 공백은 허용되지 않는다.
유효한 텍스처 좌표 인덱스는 1부터 시작하며 이전에 정의된 텍스처 좌표 목록의
해당 요소와 일치한다.
각 면은 3개 이상의 요소를 포함할 수 있다.

 f v1/vt1 v2/vt2 v3/vt3 ...

#### 꼭짓점 노멀 인덱스
선택적으로, 노멀 인덱스는 면을 정의할 때 꼭짓점에 대한 노멀 벡터를 지정하는 데 사용될 수 있다.
면을 정의할 때 꼭짓점 인덱스에 노멀 인덱스를 추가하려면,
텍스처 좌표 인덱스 뒤에 두 번째 슬래시를 넣고 노멀 인덱스를 넣어야 한다.
유효한 노멀 인덱스는 1부터 시작하며 이전에 정의된 노멀 목록의
해당 요소와 일치한다.
각 면은 3개 이상의 요소를 포함할 수 있다.

 f v1/vt1/vn1 v2/vt2/vn2 v3/vt3/vn3 ...

#### 텍스처 좌표 인덱스 없는 꼭짓점 노멀 인덱스
텍스처 좌표는 선택 사항이므로, 없이 기하학을 정의할 수 있지만,
노멀 인덱스를 넣기 전에 꼭짓점 인덱스 뒤에 두 개의 슬래시를 넣어야 한다.

 

#### 선 요소
"l"(소문자 L)로 시작하는 레코드는 폴리라인을 구성하는 꼭짓점의 순서를 지정한다.

 l v1 v2 v3 v4 v5 v6 ...

### 기타 기하학 형식
OBJ 파일은 테일러와 B-스플라인 곡선과 같은 여러 다른 종류의 보간법을 사용하여 고차 표면을 지원하지만, 타사 파일 판독기에서 이러한 기능에 대한 지원은 보편적이지 않다. OBJ 파일은 또한 메시 계층이나 꼭짓점 스키닝 또는 메시 모핑과 같은 어떤 종류의 애니메이션이나 변형도 지원하지 않는다.

### 참조 자료
폴리곤의 시각적 측면을 설명하는 재료는 외부  파일에 저장된다. 여러 개의 외부 MTL 재료 파일이 OBJ 파일 내에서 참조될 수 있다.  파일은 하나 이상의 명명된 재료 정의를 포함할 수 있다.

 mtllib [외부 .mtl 파일 이름]
 ...

이 태그는 뒤따르는 요소의 재료 이름을 지정한다. 재료 이름은 외부  파일의 명명된 재료 정의와 일치한다.

 usemtl [재료 이름]
 ...

명명된 객체 및 폴리곤 그룹은 다음 태그를 통해 지정된다.

 o [객체 이름]
   ...
   g [그룹 이름]
   ...

폴리곤에 걸친 부드러운 셰이딩은 셰이딩 그룹에 의해 활성화된다.

 s 1
   ...
   # 부드러운 셰이딩도 비활성화할 수 있습니다.
   s off
   ...

### 상대 및 절대 인덱스
OBJ 파일은 목록 구조 때문에 꼭짓점, 노멀 등을 절대 위치(1은 첫 번째 정의된 꼭짓점, N은 N번째 정의된 꼭짓점) 또는 상대 위치(-1은 가장 최근에 정의된 꼭짓점)로 참조할 수 있다.
그러나 모든 소프트웨어가 후자의 접근 방식을 지원하는 것은 아니며, 반대로 일부 소프트웨어는 (꼭짓점 오프셋 등을 다시 계산할 필요 없이 요소를 추가하는 편리성 때문에) 본질적으로 후자 형식만 작성하여 때때로 비호환성을 초래한다.

## 머티리얼 템플릿 라이브러리

**머리리얼 템플릿 라이브러리** 형식(MTL) 또는  파일 형식은 .OBJ 파일의 동반 파일 형식으로, 역시 웨이브프론트 테크놀로지스에서 정의했으며 하나 이상의 .OBJ 파일 내 객체의 표면 셰이딩(머리리얼) 속성을 설명한다. .OBJ 파일은 하나 이상의  파일을 참조하고("머티리얼 라이브러리"라고 함) 거기서부터 이름으로 하나 이상의 머티리얼 설명을 참조한다.  파일은 ASCII 텍스트로, 컴퓨터 렌더링 목적을 위한 표면의 광반사 속성을 정의하며, 퐁 반사 모델에 따른다. 이 표준은 다양한 컴퓨터 소프트웨어 패키지에서 광범위하게 지원되어 머티리얼 교환에 유용한 형식이 된다.

MTL 형식은 여전히 널리 사용되지만, 구식이며 스페큘러 맵 및 시차 매핑과 같은 최신 기술을 완벽하게 지원하지 않는다. 그러나 형식의 개방적이고 직관적인 특성으로 인해 사용자 정의 MTL 파일 생성기로 이러한 기능을 쉽게 추가할 수 있다.

MTL 형식은 여러 형식을 정의한다.

### 기본 재료

단일 `.mtl` 파일은 여러 재료를 정의할 수 있다. 재료는 파일에서 하나씩 정의되며, 각각 `newmtl` 명령으로 시작한다.

 # 'Colored'라는 이름의 재료를 정의합니다.
 newmtl Colored

재료의 앰비언트 색상은 `Ka`를 사용하여 선언된다. 색상 정의는 RGB이며 각 채널의 값은 0과 1 사이이다.

 # 흰색
 Ka 1.000 1.000 1.000

마찬가지로, 난반사 색상은 `Kd`를 사용하여 선언된다.

 # 흰색
 Kd 1.000 1.000 1.000

정반사 색상은 `Ks`를 사용하여 선언되며, 스페큘러 지수 `Ns`를 사용하여 가중된다.

 # 검은색 (꺼짐)
 Ks 0.000 0.000 0.000

 # 0에서 1000 사이의 범위
 Ns 10.000

재료는 투명할 수 있다. 이를 녹아내리는 것으로 참조한다. 실제 투명도와 달리 결과는 객체의 두께에 따라 달라지지 않는다. "d"(녹음) 값 1.0은 기본값이며 완전히 불투명함을 의미하며, "Tr" 값 0.0도 마찬가지이다. 녹음은 모든 조명 모델에서 작동한다.

 # 일부 구현에서는 'd'를 사용합니다.
 d 0.9
 # 다른 구현에서는 'Tr'을 사용합니다 (반전: Tr = 1 - d)
 Tr 0.1

투명 재료는 추가적으로 "Tf"로 지정되는 전송 필터 색상을 가질 수 있다.

 # 전송 필터 색상 (R G B 사용)
 Tf 1.0 0.5 0.5
 # 전송 필터 색상 (CIEXYZ 사용) - y 및 z 값은 선택 사항이며 생략 시 x와 동일하다고 가정합니다.
 Tf xyz 1.0 0.5 0.5
 # 스펙트럼 곡선 파일의 전송 필터 색상 (일반적으로 사용되지 않음)
 Tf spectral .rfl 

재료는 표면에 대한 광학 밀도를 가질 수도 있다. 이를 굴절률이라고도 한다.

 # 광학 밀도
 Ni 1.45000

값은 0.001에서 10까지 범위이다. 값 1.0은 빛이 물체를 통과할 때 구부러지지 않는다는 것을 의미한다. 광학 밀도를 높이면 구부러지는 양이 증가한다. 유리는 약 1.5의 굴절률을 갖는다. 1.0 미만의 값은 이상한 결과를 초래하며 권장되지 않는다.

재료당 여러 조명 모델을 사용할 수 있다. "d" 또는 "Tr"을 사용하여 투명도를 달성하기 위해 투명 조명 모델을 설정할 필요는 없으며, 현대에는 투명 재료에서도 조명 모델이 지정되지 않는 경우가 많다. 조명 모델은 다음과 같이 열거된다.


```
0. 색상 켜짐 및 앰비언트 꺼짐
1. 색상 켜짐 및 앰비언트 켜짐
2. 하이라이트 켜짐
3. 반사 켜짐 및 레이 트레이스 켜짐
4. 투명도: 유리 켜짐, 반사: 레이 트레이스 켜짐
5. 반사: 프레넬 켜짐 및 레이 트레이스 켜짐
6. 투명도: 굴절 켜짐, 반사: 프레넬 꺼짐 및 레이 트레이스 켜짐
7. 투명도: 굴절 켜짐, 반사: 프레넬 켜짐 및 레이 트레이스 켜짐
8. 반사 켜짐 및 레이 트레이스 꺼짐
9. 투명도: 유리 켜짐, 반사: 레이 트레이스 꺼짐
10. 보이지 않는 표면에 그림자 드리우기
```


 illum 2

### 텍스처 맵

텍스처 재료는 위와 동일한 속성을 사용하며, 추가적으로 텍스처 매핑을 정의한다. 아래는 일반적인 재료 파일의 예시이다. 자세한 내용은 Wavefront 파일 형식 전체 참조를 참조하라.

 newmtl Textured
    Ka 1.000 1.000 1.000
    Kd 1.000 1.000 1.000
    Ks 0.000 0.000 0.000
    d 1.0
    illum 2
    # 앰비언트 텍스처 맵
    map_Ka lemur.tga

    # 디퓨즈 텍스처 맵 (대부분의 경우 앰비언트 텍스처 맵과 동일함)
    map_Kd lemur.tga

    # 스페큘러 색상 텍스처 맵
    map_Ks lemur.tga

    # 스페큘러 하이라이트 구성 요소
    map_Ns lemur_spec.tga

    # 알파 텍스처 맵
    map_d lemur_alpha.tga

    # 일부 구현에서는 아래 'bump' 대신 'map_bump'를 사용합니다.
    map_bump lemur_bump.tga

    # 범프 맵 (기본적으로 이미지의 휘도 채널을 사용함)
    bump lemur_bump.tga

    # 변위 맵
    disp lemur_disp.tga

    # 스텐실 데칼 텍스처 (기본적으로 이미지의 'matte' 채널을 사용함)
    decal lemur_stencil.tga

텍스처 맵 문에는 옵션 매개변수도 있을 수 있다(전체 사양 참조).

    # 텍스처 원점 (1,1,1)
    map_Ka -o 1 1 1 ambient.tga

    # 구형 반사 맵
    refl -type sphere clouds.tga

### 텍스처 옵션


```
-blendu on | off                       # 수평 텍스처 블렌딩 설정 (기본값 on)
-blendv on | off                       # 수직 텍스처 블렌딩 설정 (기본값 on)
-boost float_value                     # 밉맵 선명도 증가
-mm base_value gain_value              # 텍스처 맵 값 수정 (기본값 0 1)
                                       #     base_value = 밝기, gain_value = 대비
-o u [v [w]]                           # 원점 오프셋             (기본값 0 0 0)
-s u [v [w]]                           # 스케일                    (기본값 1 1 1)
-t u [v [w]]                           # 난류                    (기본값 0 0 0)
-texres resolution                     # 생성할 텍스처 해상도
-clamp on | off                        # 고정된 0-1 범위의 텍셀만 렌더링 (기본값 off)
                                       #   고정되지 않으면 텍스처가 표면에 반복되고,
                                       #   고정되면 0-1 범위 내에 있는 텍셀만 렌더링됩니다.
-bm mult_value                         # 범프 승수 (범프 맵 전용)

-imfchan r | g | b | m | l | z         # 파일의 어떤 채널이 스칼라 또는 범프 텍스처를
                                       # 생성하는 데 사용되는지 지정합니다. r:빨강, g:녹색,
                                       # b:파랑, m:매트, l:휘도, z:z-깊이..
                                       # (범프의 기본값은 'l', 데칼의 기본값은 'm'입니다.)
```

예를 들어,

```
# bumpmap.tga의 빨강 채널을 범프맵으로 사용하도록 지시합니다.
bump -imfchan r bumpmap.tga
```


반사 매핑의 경우...


```
-type sphere                           # "refl" 반사 맵에 대한 구를 지정합니다.
-type cube_top    | cube_bottom |      # 큐브 맵을 사용할 때, 큐브의 각 면에 대한 텍스처 파일은
      cube_front  | cube_back   |      # 별도로 지정됩니다.
      cube_left   | cube_right
```


### 공급업체별 변경 사항

파일 구문 분석의 용이성과 비공식적인 파일 형식 확산으로 인해 파일에는 공급업체별 변경 사항이 포함될 수 있다.

사양에 따르면 옵션은 텍스처 파일 이름 앞에 와야 한다. 그러나 적어도 한 공급업체는 옵션이 끝에 있는 파일을 생성한다.

 # 범프 승수 0.2
 bump texbump.tga -bm 0.2

#### 물리 기반 렌더링

온라인 3D 편집 및 모델링 도구인 Clara.io의 개발자들은 물리 기반 렌더링(PBR) 맵 및 매개변수를 지정할 수 있도록 MTL 형식을 확장할 것을 제안했다. 이 확장은 이후 블렌더와 TinyObjLoader에 채택되었다. 확장 PBR 맵 및 매개변수는 다음과 같다.


```
Pr/map_Pr     # 거칠기
Pm/map_Pm     # 금속성
Ps/map_Ps     # 광택
Pc            # 클리어코트 두께
Pcr           # 클리어코트 거칠기
Ke/map_Ke     # 발광
aniso         # 이방성
anisor        # 이방성 회전
norm          # 노멀 맵 (RGB 구성 요소는 표면 노멀의 XYZ 구성 요소를 나타냄)
```


추가 제안된 확장은 마이크로소프트의 DirectX 엔진용 DirectXMesh 툴킷에서 제공되며, 모델의 사전 컴파일된 RMA 재료를 정의할 수 있는 기능을 허용한다.


```
map_RMA       # RMA 재료 (거칠기, 금속성, 앰비언트 오클루전)
map_ORM       # map_RMA의 대체 정의
```


## 같이 보기
* glTF
* 오브젝트 파일
* OFF (파일 포맷)
* 재배치 가능한 오브젝트 모듈 포맷
* STL (파일 포맷)
* PLY (파일 포맷)는 대부분의 스테레오리소그래피 애플리케이션보다 더 많은 유연성을 제공하는 대체 파일 형식이다.

## 각주

## 외부 링크
* 부록 B1. 오브젝트 파일(.obj), 고급 시각화 도구 설명서
* MTL 사양
* 도구, 라이브러리 및 예제 파일
* FileFormat.Info: Wavefront OBJ 파일 형식 요약

분류:CAD 파일 포맷
분류:3차원 그래픽스 파일 포맷