3D Asset Translation
Process common 3D formats (FBX🎬FBXAutodesk's 3D animation exchange format.View in glossary, OBJ🎲OBJSimple 3D geometry format.View in glossary, glTF) for web-based viewing.
Workflow Overview
3D Formats
FBX
OBJ + MTL
glTF/GLB
3DS
DAE
RAPS🌼RAPSRust CLI for Autodesk Platform Services.View in glossary Upload
raps object upload
APS☁️APSAutodesk Platform Services - cloud APIs for CAD/BIM automation.View in glossary Storage
OSS📦OSSAPS cloud storage for files and models.View in glossary Bucket🪣BucketContainer for storing objects in OSS.View in glossary
Model Derivative🔄Model DerivativeAPS service for translating and extracting CAD data.View in glossary
SVF2🚀SVF2Current APS viewing format (improved performance).View in glossary Translation⚙️Translation JobBackground process converting CAD files to viewable formats.View in glossary
Outputs
CLI Approach
Step 1: Create Assets Bucket
raps bucket create --key media-assets --policy persistent --region US
Step 2: Upload 3D Files
# FBX file
raps object upload media-assets character.fbx
# OBJ file
raps object upload media-assets environment.obj
# glTF file
raps object upload media-assets props.gltf
# GLB (binary glTF)
raps object upload media-assets vehicle.glb
Step 3: Translate to SVF2
# Get URN and translate
URN=$(raps object urn media-assets character.fbx --output plain)
raps translate start "$URN" --format svf2 --wait
# Check translation result
raps translate manifest "$URN"
Step 4: Verify Output
# Get available views
raps derivative views "$URN" --output json
# Get thumbnail
raps derivative thumbnail "$URN" --output ./preview.png
# Get metadata
raps derivative metadata "$URN" --output json
Supported Formats
| Format | Extension | Notes |
|---|---|---|
| FBX | .fbx | Autodesk format, animations |
| OBJ | .obj | With .mtl materials |
| glTF | .gltf | JSON📋JSONStandard data interchange format.View in glossary + separate assets |
| GLB | .glb | Binary glTF |
| 3DS | .3ds | Legacy 3D Studio |
| DAE | .dae | Collada format |
CI/CD Pipeline
# .github/workflows/asset-translation.yml
name: 3D Asset Translation
on:
push:
paths:
- 'assets/**/*.fbx'
- 'assets/**/*.obj'
- 'assets/**/*.gltf'
- 'assets/**/*.glb'
env:
BUCKET: media-assets-${{ github.repository_id }}
jobs:
translate-assets:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install RAPS
run: cargo install raps
- name: Setup bucket
env:
APS_CLIENT_ID: ${{ secrets.APS_CLIENT_ID }}
APS_CLIENT_SECRET: ${{ secrets.APS_CLIENT_SECRET }}
run: |
raps bucket create --key "$BUCKET" --policy persistent --region US 2>/dev/null || true
- name: Upload and translate
env:
APS_CLIENT_ID: ${{ secrets.APS_CLIENT_ID }}
APS_CLIENT_SECRET: ${{ secrets.APS_CLIENT_SECRET }}
run: |
for file in $(git diff --name-only HEAD~1 HEAD -- 'assets/**'); do
[ -f "$file" ] || continue
ext="${file##*.}"
case "$ext" in
fbx|obj|gltf|glb|3ds|dae)
echo "Processing: $file"
raps object upload "$BUCKET" "$file"
key=$(basename "$file")
URN=$(raps object urn "$BUCKET" "$key" --output plain)
raps translate start "$URN" --format svf2 --wait
echo "Translated: $key"
;;
esac
done
- name: Generate thumbnails
env:
APS_CLIENT_ID: ${{ secrets.APS_CLIENT_ID }}
APS_CLIENT_SECRET: ${{ secrets.APS_CLIENT_SECRET }}
run: |
mkdir -p ./thumbnails
raps object list "$BUCKET" --output json | jq -r '.[].key' | while read key; do
URN=$(raps object urn "$BUCKET" "$key" --output plain)
STATUS=$(raps translate manifest "$URN" 2>/dev/null | jq -r '.status // "pending"')
if [ "$STATUS" = "success" ]; then
name=$(echo "$key" | sed 's/\.[^.]*$//')
raps derivative thumbnail "$URN" --output "./thumbnails/${name}.png" 2>/dev/null || true
fi
done
- name: Upload thumbnails
uses: actions/upload-artifact@v4
with:
name: asset-thumbnails
path: ./thumbnails/
Pipeline Flow
Git Push
3D files changed
→
Processing
Upload assets
Translate to SVF2
Generate thumbnails
→
Artifacts
thumbnails/
MCP Integration
Translate Single Asset
User: "Upload and translate the new character model for web viewing"
User→AITranslate character.fbx
AI→MCPaps_object_upload(bucket, file)
MCP→APSUpload FBX
APS←MCPComplete
AI→MCPaps_object_urn(bucket, key)
AI→MCPaps_translate_start(urn, format=“svf2”)
MCP→APSStart translation
loopAI→MCPaps_translate_manifest(urn)
AI→MCPaps_derivative_thumbnail(urn)
MCP←AIThumbnail
AI→UserAsset ready with preview
AI Response:
character.fbx has been uploaded and translated:
Asset Details:
- File size: 12.4 MB
- Polygons: 45,000
- Materials: 8
- Bones: 65
- Animation clips: 3
Translation: Complete (45 seconds)
Preview saved to
preview.png— open it locally or push to object storage for a quick visual check.
Batch Translate
User: "Process all the props in the environment folder"
AI Response:
Processing 12 files from environment folder:
File Format Status Polygons tree_01.fbx FBX Complete 8,200 rock_large.obj OBJ Complete 2,100 fence.gltf glTF Complete 1,450 lamp_post.fbx FBX Processing - … … … … Progress: 9/12 complete
Format-Specific Tips
FBX with Animations
# FBX animations are preserved
URN=$(raps object urn media-assets animated-character.fbx --output plain)
raps translate start "$URN" --format svf2 --wait
# Check animation data in metadata
raps derivative metadata "$URN" --output json | jq '.animations'
OBJ with External Materials
# Package OBJ with MTL and textures
zip -r model-package.zip model.obj model.mtl textures/
raps object upload media-assets model-package.zip
# Specify root file
URN=$(raps object urn media-assets model-package.zip --output plain)
raps translate start "$URN" --format svf2 --root "model.obj" --wait
glTF Variants
# glTF (JSON + binary + textures)
# Upload all files together or as a zip
# GLB is self-contained
raps object upload media-assets model.glb
URN=$(raps object urn media-assets model.glb --output plain)
raps translate start "$URN" --format svf2 --wait