Skip to main content

obj-exporter

Three.js OBJExporter utility for exporting 3D geometry to Wavefront OBJ format. Use when converting Three.js scenes, meshes, or geometries to OBJ files for use in other 3D software like Blender, Maya, or MeshLab.

소스 정보

저장소
benchflow-ai/skillsbench
최근 소스 활동
2026년 1월 24일 02:11
감지된 SKILL.md 언어
영어
스타
1,837
포크
371

설치 방법

기본적으로 소스를 먼저 확인하는 Prompt가 선택됩니다. 직접 명령으로 전환하거나 로컬 사본을 다운로드할 수도 있습니다.

소스 파일 검토

설치 여부를 결정하기 전에 SKILL.md와 SkillsMP에 표시된 보조 파일을 읽어 보세요.

SKILL.md 표시 중

SKILL.md
소스 지침 · 읽기 전용 미리보기
name
obj-exporter
description
Three.js OBJExporter utility for exporting 3D geometry to Wavefront OBJ format. Use when converting Three.js scenes, meshes, or geometries to OBJ files for use in other 3D software like Blender, Maya, or MeshLab.
# OBJExporter Guide ## Basic Structure OBJ is a text-based 3D geometry format: ``` # Comment v x y z # Vertex position vn x y z # Vertex normal f v1 v2 v3 # Face (triangle) f v1/vt1/vn1 v2/vt2/vn2 v3/vt3/vn3 # Face with texture/normal indices ``` Example: ``` # Cube v 0 0 0 v 1 0 0 v 1 1 0 v 0 1 0 f 1 2 3 f 1 3 4 ``` ## Three.js OBJExporter Three.js provides `OBJExporter` in examples: ```javascript import { OBJExporter } from 'three/examples/jsm/exporters/OBJExporter.js'; const exporter = new OBJExporter(); const objString = exporter.parse(object3D); // Write to file (Node.js) import fs from 'fs'; fs.writeFileSync('output.obj', objString); ``` ## Exporting with World Transforms To export geometry in world coordinates: ```javascript // Update world matrices first root.updateMatrixWorld(true); // Clone and transform geometry const worldGeometry = mesh.geometry.clone(); worldGeometry.applyMatrix4(mesh.matrixWorld); // Create new mesh for export const exportMesh = new THREE.Mesh(worldGeometry); const objData = exporter.parse(exportMesh); ``` ## Merging Multiple Geometries ```javascript import { mergeGeometries } from 'three/examples/jsm/utils/BufferGeometryUtils.js'; const geometries = []; root.traverse((obj) => { if (obj instanceof THREE.Mesh) { const geom = obj.geometry.clone(); geom.applyMatrix4(obj.matrixWorld); geometries.push(geom); } }); const merged = mergeGeometries(geometries); const mergedMesh = new THREE.Mesh(merged); const objData = exporter.parse(mergedMesh); ``` ## Node.js ES Module Setup For running Three.js in Node.js: ```json // package.json { "type": "module" } ``` ```javascript // script.js import * as THREE from 'three'; import { OBJExporter } from 'three/examples/jsm/exporters/OBJExporter.js'; ``` # OBJ Export for Scene Components ## Component Definition (Hierarchy-Aware) Treat each **named `THREE.Group`** as a component/part. Preserve hierarchy by using the **nearest named parent group** in the ancestor chain as the owning component for each mesh. Call `root.updateMatrixWorld(true)` before exporting so `matrixWorld` is correct. ```javascript function collectComponentMeshes(root) { const componentMap = {}; root.traverse(obj => { if (obj instanceof THREE.Group && obj.name) { componentMap[obj.name] = { group: obj, meshes: [] }; } }); root.traverse(obj => { if (obj instanceof THREE.Mesh) { let parent = obj.parent; while (parent && !(parent instanceof THREE.Group && parent.name)) { parent = parent.parent; } if (parent && componentMap[parent.name]) { componentMap[parent.name].meshes.push(obj); } } }); return Object.fromEntries( Object.entries(componentMap).filter(([_, data]) => data.meshes.length > 0) ); } ``` ## Export Individual Meshes (World Transforms) ```javascript import { OBJExporter } from 'three/examples/jsm/exporters/OBJExporter.js'; const exporter = new OBJExporter(); function exportMesh(mesh, filepath) { let geom = mesh.geometry.clone(); geom.applyMatrix4(mesh.matrixWorld); if (geom.index) { geom = geom.toNonIndexed(); } if (!geom.attributes.normal) { geom.computeVertexNormals(); } const tempMesh = new THREE.Mesh(geom); tempMesh.name = mesh.name; const objData = exporter.parse(tempMesh); fs.writeFileSync(filepath, objData); } ``` ## Export Merged Component Meshes (Optional) ```javascript import { mergeGeometries } from 'three/examples/jsm/utils/BufferGeometryUtils.js'; function mergeMeshes(meshes) { const geometries = []; for (const mesh of meshes) { let geom = mesh.geometry.clone(); geom.applyMatrix4(mesh.matrixWorld); if (geom.index) { geom = geom.toNonIndexed(); } if (!geom.attributes.normal) { geom.computeVertexNormals(); } geometries.push(geom); } if (geometries.length === 0) return null; return new THREE.Mesh(mergeGeometries(geometries, false)); } ``` ## Output Paths Write OBJ files to the paths specified by the task instructions or a provided output root variable. Avoid hardcoding fixed directories in the skill itself.
GitHub에서 보기