소개
3D 콘텐츠는 전체 수명 동안 단일 형식에 머무르는 경우가 거의 없습니다. 모델은 모델링 애플리케이션에서 내보낸 OBJ 파일로 시작하여, 3D 프린팅 파이프라인에서는 STL로 이동하고, 웹 애플리케이션에서는 glTF로 나타나며, 최종적으로는 적층 제조 도구에서 3MF로 사용될 수 있습니다. 각 형식은 서로 다른 대상 사용자와 하위 도구를 위해 존재하며, 이들 간의 변환은 대부분의 3D 파이프라인이 신뢰성 있게 처리해야 하는 작업입니다.
Python은 이 작업에 자연스럽게 맞습니다: 셸 스크립트는 너무 취약하고, 전체 DCC (digital content creation) 도구 통합은 배치 처리에 너무 무겁습니다. 필요한 것은 이러한 형식들을 모두 로드하고 일관된 씬 그래프를 제공하며 GUI나 그래픽 드라이버 없이도 어떤 대상 형식으로든 다시 쓸 수 있는 라이브러리입니다.
Aspose.3D FOSS for Python (aspose-3d-foss, MIT 라이선스)는 그 격차를 메워줍니다. 이 가이드는 완전하고 실행 가능한 코드 예제와 함께 가장 일반적인 변환 경로를 보여줍니다.
Aspose.3D FOSS가 지원하는 형식은 무엇입니까?
| 포맷 | 확장자 | 로드 | 저장 | 일반 사용 사례 |
|---|---|---|---|---|
| Wavefront OBJ | .obj | Yes | Yes | 모델링 도구 간 교환; .mtl 재질 파일 지원 |
| STL | .stl | Yes | Yes | 3D 프린팅, CAD 내보내기; 바이너리 및 ASCII 변형 |
| glTF 2.0 / GLB | .gltf, .glb | Yes | Yes | 웹 뷰어, 게임 엔진; GLB는 자체 포함 바이너리 변형입니다 |
| COLLADA | .dae | Yes | Yes | 애니메이션 도구에서 가져오기; ColladaSaveOptions는 내보내기를 지원합니다 |
| 3MF | .3mf | Yes | Yes | 적층 제조, STL보다 풍부한 프린트 메타데이터 |
형식 감지는 파일 확장자에서 자동으로 수행됩니다. 세밀한 제어가 필요할 때 사용할 수 있는 형식별 옵션 클래스(ObjLoadOptions, StlSaveOptions, GltfSaveOptions)가 제공됩니다.
FBX에 대한 참고: 라이브러리에는 가져오기를 위한 부분적인 FBX 토크나이저가 포함되어 있습니다. 이 릴리스에서는 생산 환경 변환 워크플로에 FBX 사용을 권장하지 않으며, 대신 OBJ 또는 glTF를 중간 포맷으로 사용하십시오.
OBJ to STL: 3D 프린팅을 위한 모델 준비
OBJ는 모델링 및 스컬프팅 도구에서 가장 일반적인 출력 형식입니다. STL은 3D 프린팅 슬라이서의 공통 언어입니다. 두 형식 간 변환은 한 번의 호출로 가능합니다.
from aspose.threed import Scene
from aspose.threed.formats import StlSaveOptions
scene = Scene.from_file("model.obj")
opts = StlSaveOptions()
scene.save("model.stl", opts)
STL은 삼각형 면만 인코딩합니다. OBJ 파일에 사각형 또는 n-각형 면이 포함되어 있는 경우, 내보내기 프로그램이 기록하기 전에 자동으로 삼각형으로 분할합니다. 저장하기 전에 삼각형 분할을 명시적으로 제어하려면, 씬의 각 메시에 대해 mesh.triangulate()를 호출하십시오:
from aspose.threed import Scene
from aspose.threed.entities import Mesh
from aspose.threed.formats import StlSaveOptions
scene = Scene.from_file("model.obj")
def triangulate_all(node):
if isinstance(node.entity, Mesh):
# entity setter clears existing entities and sets the new one
node.entity = node.entity.triangulate()
for child in node.child_nodes:
triangulate_all(child)
triangulate_all(scene.root_node)
scene.save("model_triangulated.stl", StlSaveOptions())
OBJ to glTF: 웹 및 게임 엔진용 내보내기
glTF 2.0은 실시간 렌더러, WebGL 뷰어 및 Babylon.js, Three.js, Unity와 같은 게임 엔진을 위한 선호되는 교환 형식입니다. GLB(바이너리 변형)는 기하학, 텍스처 및 재료를 단일 자체 포함 파일로 패키징하여 HTTP를 통해 제공하기가 더 쉽습니다.
from aspose.threed import Scene
from aspose.threed.formats import GltfSaveOptions
scene = Scene.from_file("model.obj")
##Save as JSON-based glTF (external buffer)
opts_gltf = GltfSaveOptions()
scene.save("model.gltf", opts_gltf)
##Save as self-contained GLB binary: preferred for web delivery
scene.save("model.glb", GltfSaveOptions())
형식은 파일 확장자를 통해 추론됩니다: .gltf은 JSON+binary-buffer 쌍을 생성하고; .glb은 단일 파일 바이너리를 생성합니다. OBJ 재질 데이터(LambertMaterial, PhongMaterial)는 동등한 것이 존재하는 경우 glTF PBR 재질 표현으로 전달됩니다.
STL에서 glTF로: 스캐너 또는 CAD 출력에서 웹으로
3D 스캐너와 CAD 시스템에서 생성된 STL 파일은 웹에서 볼 수 있도록 만들어야 하는 일반적인 입력 파일입니다. STL은 삼각형 기하학만을 포함하고 재질 데이터는 없기 때문에 변환이 간단합니다.
from aspose.threed import Scene
from aspose.threed.formats import GltfSaveOptions
scene = Scene.from_file("scan.stl")
scene.save("scan.glb", GltfSaveOptions())
STL이 비정상적인 좌표계(Z-up 대 Y-up)를 사용하는 CAD 도구에 의해 생성된 경우, 저장하기 전에 루트 노드 변환을 검사하고 수정할 수 있습니다:
import math
from aspose.threed import Scene
from aspose.threed.formats import GltfSaveOptions
scene = Scene.from_file("cad_export.stl")
# Rotate -90 degrees around X to convert Z-up to Y-up
# set_euler_angles takes radians, not degrees
root = scene.root_node
root.transform.set_euler_angles(-math.pi / 2, 0.0, 0.0)
scene.save("cad_export_yup.glb", GltfSaveOptions())
glTF to 3MF: 적층 제조를 위한 준비
3MF는 3MF Consortium이 지원하는 최신 3D 프린팅 포맷입니다. STL보다 풍부한 메타데이터(색상, 재료 할당, 빌드 지시사항)를 지원하며 PrusaSlicer 및 Bambu Studio와 같은 슬라이서 소프트웨어에서 받아들여집니다. 웹 뷰어에서 모델을 프린팅 워크플로우로 전달하는 경우, GLB를 3MF로 변환하는 것이 유용한 단계입니다.
from aspose.threed import Scene
from aspose.threed import FileFormat
from aspose.threed.formats import SaveOptions
scene = Scene.from_file("model.glb")
scene.save("model.3mf")
3MF 형식은 .3mf 확장자를 통해 자동으로 감지됩니다. 명시적인 제어를 위해서는 3MF로 구성된 SaveOptions 인스턴스를 전달하십시오.
배치 변환 패턴
실제로 변환 작업은 개별 파일보다 파일 디렉터리에서 수행됩니다. 다음 패턴은 OBJ 파일 폴더를 처리하고 각 파일을 GLB로 변환하며, 파일별 오류 처리를 통해 하나의 잘못된 파일이 전체 실행을 중단하지 않도록 합니다.
import os
from aspose.threed import Scene
from aspose.threed.formats import GltfSaveOptions
input_dir = "./obj_files"
output_dir = "./glb_files"
os.makedirs(output_dir, exist_ok=True)
opts = GltfSaveOptions()
results = {"ok": [], "failed": []}
for filename in os.listdir(input_dir):
if not filename.lower().endswith(".obj"):
continue
src = os.path.join(input_dir, filename)
stem = os.path.splitext(filename)[0]
dst = os.path.join(output_dir, stem + ".glb")
try:
scene = Scene.from_file(src)
scene.save(dst, opts)
results["ok"].append(filename)
print(f"OK {filename} -> {stem}.glb")
except Exception as exc:
results["failed"].append((filename, str(exc)))
print(f"ERR {filename}: {exc}")
print(f"\n{len(results['ok'])} converted, {len(results['failed'])} failed.")
if results["failed"]:
for name, reason in results["failed"]:
print(f" {name}: {reason}")
이 패턴은 다른 소스/대상 형식 쌍에도 자연스럽게 확장됩니다: 위 지원 테이블에서 원하는 조합에 대해 확장자 필터와 SaveOptions 클래스를 변경하십시오.
결론
Aspose.3D FOSS for Python은 형식 변환을 간단하게 합니다: Scene.from_file으로 로드하고, 필요에 따라 씬 그래프를 검사하거나 수정한 다음, 적절한 SaveOptions으로 저장합니다. 라이브러리는 내부적으로 삼각분할, 좌표 정규화 및 형식별 특성을 처리합니다.
클래스와 메서드의 전체 목록은 API Reference를 참조하십시오. 씬 그래프 모델(노드, 메시, 변환)에 대해 더 자세히 알아보려면 다음을 참조하십시오:
- Class Scene: 로드, 저장 및 씬 수준 메타데이터
- Class Node: 계층 구조, 변환, 엔티티 첨부
- Class Mesh: 버텍스 데이터, 폴리곤, 버텍스 요소
- Python에서 3D 모델 로드 방법
- PyPI: aspose-3d-foss