Convert Obj To Dff Exclusive Link
import os import numpy as np from rw_dff_builder import DFFExclusiveBuilderdef load_obj(filepath): vertices = [] uvs = [] normals = [] faces = [] materials = {} current_material = None
with open(filepath, 'r') as f: for line in f: if line.startswith('v '): parts = line.split() vertices.append([float(parts[1]), float(parts[2]), float(parts[3])]) elif line.startswith('vt '): parts = line.split() uvs.append([float(parts[1]), float(parts[2]) if len(parts)>2 else 0.0]) elif line.startswith('vn '): parts = line.split() normals.append([float(parts[1]), float(parts[2]), float(parts[3])]) elif line.startswith('f '): parts = line.split()[1:] face_verts = [] face_uvs = [] face_norms = [] for part in parts: indices = part.split('/') v_idx = int(indices[0]) - 1 vt_idx = int(indices[1]) - 1 if len(indices) > 1 and indices[1] else -1 vn_idx = int(indices[2]) - 1 if len(indices) > 2 and indices[2] else -1 face_verts.append(v_idx) face_uvs.append(vt_idx if vt_idx != -1 else None) face_norms.append(vn_idx if vn_idx != -1 else None) faces.append((face_verts, face_uvs, face_norms, current_material)) elif line.startswith('usemtl '): current_material = line.split()[1] return vertices, uvs, normals, faces, materialsdef convert_obj_to_dff(obj_path, dff_path): verts, uvs, norms, faces, _ = load_obj(obj_path) convert obj to dff exclusive
builder = DFFExclusiveBuilder(name=os.path.basename(obj_path).replace('.obj', '')) # Convert to flat arrays per material material_groups = {} for fv, fuv, fn, mat in faces: if mat not in material_groups: material_groups[mat] = 'verts': [], 'uvs': [], 'normals': [], 'tris': [] # Triangulate quad if needed (simplified: assume triangles) for i in range(1, len(fv)-1): tri_verts = [fv[0], fv[i], fv[i+1]] tri_uvs = [fuv[0] if fuv[0] is not None else -1, fuv[i] if fuv[i] is not None else -1, fuv[i+1] if fuv[i+1] is not None else -1] tri_norms = [fn[0] if fn[0] is not None else -1, fn[i] if fn[i] is not None else -1, fn[i+1] if fn[i+1] is not None else -1] idx_start = len(material_groups[mat]['verts']) for v_idx in tri_verts: material_groups[mat]['verts'].append(verts[v_idx]) for uv_idx in tri_uvs: if uv_idx != -1 and uv_idx < len(uvs): material_groups[mat]['uvs'].append(uvs[uv_idx]) else: material_groups[mat]['uvs'].append([0.0, 0.0]) for n_idx in tri_norms: if n_idx != -1 and n_idx < len(norms): material_groups[mat]['normals'].append(norms[n_idx]) else: material_groups[mat]['normals'].append([0,1,0]) material_groups[mat]['tris'].append([idx_start, idx_start+1, idx_start+2]) for mat_name, data in material_groups.items(): builder.add_geometry( vertices=data['verts'], triangles=data['tris'], uvs=data['uvs'], normals=data['normals'], material_name=mat_name or 'default' ) dff_data = builder.build() with open(dff_path, 'wb') as f: f.write(dff_data) print(f"✅ Exported exclusive DFF to dff_path")
pip install numpy Pillow
python gui.py
After conversion, validate the file: