0

I'm need to programmatically generate box UVW maps in 3D-models, similar to how UVW Map -> Box works in 3ds Max.

Example with default UV

Example with box UV, what I'm after

I've tried javascript-based solutions such as this or this, but it seems to give various results depending on if the mesh/geometry is merged or if it already has any built in UV. Or it has different directions.

Applying box UV-map via Blender or 3ds Max to the same 3D-model always gives perfect results though.

Best case scenario would be a command line tool, similar to how gltf-pipeline works:

generate-box-map -i model.gltf -type box -size 50

I've found tools/projects such as PyMeshLab, Meshmatic, or running a Blender instance and attempting to do it via python, but I couldn't find a solution. Perhaps there's a native/easier way of doing this?

1 Answer 1

0

I ended up solving this in Blender through Docker via this image https://github.com/linuxserver/docker-blender.

The project structure is

app.js

Receives a request via express, body contains https://some-storage.com/model.gltf and starts a Blender process via child_process.exec(`blender -b --addons magic_uv -P /app/src/main.py --log-level -1 -- ${pathToDownloadedGLTFFile}`)

main.py

...

    argv = sys.argv
    argv = argv[argv.index("--") + 1:]  # get all args after "--"

    param_input_file = argv[0]

    bpy.ops.import_scene.gltf(filepath=param_input_file)
    for obj in bpy.data.objects:
        if obj.type == 'MESH':
            obj.select_set(True) # select the object
            bpy.context.view_layer.objects.active = obj # needed to enable Edit mode below
            bpy.ops.object.mode_set(mode='EDIT')

    bpy.ops.uv.muv_uvw_box_map(size=instructions['size'], rotation=(instructions['rotationX'], instructions['rotationY'], instructions['rotationZ']))

...

# export back to GLTF and write to /some/dir/model.gltf

Regarding the problem with different directions of UV, setting rotation.x to 270 seems to fix it.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.