Zum Hauptinhalt springen

Convert Obj To Dff Exclusive Link

import os
import numpy as np
from rw_dff_builder import DFFExclusiveBuilder

def 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, materials

def 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:

  • In-game test:

  • convert obj to dff exclusive
    Loading...

    Neu