1. Generate the GLB
Submit one image task with a public image URL. The response is asynchronous, so keep the returned task ID.
export TO3D_KEY='YOUR_API_KEY'
export TO3D_IMAGE_URL='https://example.com/prop-or-character.jpg'
TASK_JSON=$(curl --fail-with-body --silent --show-error \
https://api.to3d.app/api/trellis/tasks \
-H "x-api-key: $TO3D_KEY" \
-H 'Content-Type: application/json' \
-d "$(jq -cn --arg image "$TO3D_IMAGE_URL" \
'{task_type:"image-to-3d",input:{image:$image}}')")
TASK_ID=$(jq -er '.id' <<<"$TASK_JSON")Poll and save the GLB
Poll until the task succeeds, then save the URL from `output.model_file`. Do not describe polling as a second generation request.
curl --fail-with-body --silent --show-error \
"https://api.to3d.app/api/trellis/tasks/$TASK_ID" \
-H "x-api-key: $TO3D_KEY" | jq '{id,status,output,error}'
MODEL_URL=$(curl --fail-with-body --silent --show-error \
"https://api.to3d.app/api/trellis/tasks/$TASK_ID" \
-H "x-api-key: $TO3D_KEY" | jq -er '.output.model_file')
curl --fail --location --silent --show-error "$MODEL_URL" --output unreal-candidate.glb2. Ask for UE5 bone names when you need a humanoid rig
Upload or host the downloaded GLB at a public URL, then submit the independent Skin Tokens request. Poll `/api/skin_tokens/tasks/$RIG_ID` and download the returned `output.model_file` after it succeeds. Do not describe the two calls as a single automatic conversion.
export TO3D_MODEL_URL='https://example.com/unreal-candidate.glb'
RIG_JSON=$(curl --fail-with-body --silent --show-error \
https://api.to3d.app/api/skin_tokens/tasks \
-H "x-api-key: $TO3D_KEY" \
-H 'Content-Type: application/json' \
-d "$(jq -cn --arg model "$TO3D_MODEL_URL" \
'{task_type:"rig",input:{model:$model,bone_names:"ue5"}}')")
RIG_ID=$(jq -er '.id' <<<"$RIG_JSON")
printf 'Rig task: %s\n' "$RIG_ID"3. Verify the Unreal side
Import the GLB with the importer and plugins used by your project. Check the asset's units and orientation, material and texture references, skeleton hierarchy, bind pose, and animation or retargeting behavior.
- The `ue5` value is an API bone-naming option.
- #56 did not perform an Unreal import or retargeting acceptance test, so this tutorial cannot promise a ready-made Unreal skeleton, collision setup, LODs, or gameplay animation.
Use samples as structure references
Four public samples inspected for #56 contained a skin, joints, weights, UVs, and one embedded PNG texture. Use those samples to understand the file shape you may receive; treat every new generation as a fresh asset review.
- If the target is a static prop, skip the rigging request and validate scale and materials instead.