Робочі процеси анімації
Обробка 3D-файлів із вбудованими анімаційними даними.
Огляд робочого процесу
Анімовані ресурси
FBX з анімацією
glTF з анімацією
DAE з анімацією
Завантаження
raps object upload
Трансляція
SVF2 з анімаційними даними
Анімаційні дані
Анімаційні кліпи
Ключові кадри
Ієрархія кісток
Відтворення
Forge Viewer
Власний програвач
Підхід CLI
Завантаження анімованої моделі
# Upload FBX with animations
raps object upload media-assets character-animated.fbx
# Translate preserving animation
URN=$(raps object urn media-assets character-animated.fbx --output plain)
raps translate start "$URN" --format svf2 --wait
Перевірка анімаційних даних
# Get metadata including animations
raps derivative metadata "$URN" --output json > animation-metadata.json
# List animation clips
jq '.animations' animation-metadata.json
# Get animation details
jq '.animations[] | {name: .name, duration: .duration, frameCount: .frameCount}' animation-metadata.json
Витягнення інформації про анімацію
# Get bone/skeleton hierarchy
raps derivative tree "$URN" --output json | jq '
.. | objects | select(.type == "bone" or .name | test("bone|skeleton"; "i"))
' > skeleton.json
# Count bones
echo "Bones: $(jq 'length' skeleton.json)"
Конвеєр CI/CD
# .github/workflows/animation-processing.yml
name: Animation Processing
on:
push:
paths:
- 'animations/**/*.fbx'
- 'animations/**/*.gltf'
env:
BUCKET: animated-assets
jobs:
process-animations:
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 -- 'animations/**'); do
[ -f "$file" ] || continue
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
done
- name: Extract animation info
env:
APS_CLIENT_ID: ${{ secrets.APS_CLIENT_ID }}
APS_CLIENT_SECRET: ${{ secrets.APS_CLIENT_SECRET }}
run: |
mkdir -p ./animation-data
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 metadata "$URN" --output json > "./animation-data/${NAME}-meta.json"
fi
done
- name: Generate report
run: |
echo "# Animation Assets Report" > ./animation-data/report.md
echo "" >> ./animation-data/report.md
for meta in ./animation-data/*-meta.json; do
NAME=$(basename "$meta" -meta.json)
echo "## $NAME" >> ./animation-data/report.md
CLIPS=$(jq '.animations | length // 0' "$meta")
echo "- Animation clips: $CLIPS" >> ./animation-data/report.md
if [ "$CLIPS" -gt 0 ]; then
echo "- Clips:" >> ./animation-data/report.md
jq -r '.animations[] | " - \(.name): \(.duration)s"' "$meta" >> ./animation-data/report.md
fi
echo "" >> ./animation-data/report.md
done
- name: Upload report
uses: actions/upload-artifact@v4
with:
name: animation-report
path: ./animation-data/
Потік конвеєра
Git Push
Змінено файли анімації
→
Обробка
Завантаження FBX/glTF
Трансляція в SVF2
→
Витягнення інформації
Отримання анімаційних кліпів
Отримання ієрархії кісток
→
Звіт
Звіт про анімацію
Інтеграція MCP
Обробка анімованого ресурсу
User: "Upload the character animation and tell me about the clips"
Користувач
AI-асистент
RAPS MCP
APS Cloud
Користувач→AIЗавантажити та проаналізувати анімацію
AI→MCPaps_object_upload(bucket, file)
MCP→APSЗавантаження FBX
APS←MCPЗавершено
AI→MCPaps_translate_start(urn)
MCP→APSТрансляція
loopAI→MCPaps_translate_manifest(urn)
AI→MCPaps_derivative_metadata(urn)
MCP→APSОтримання метаданих
APS←MCPАнімаційні дані
AI→КористувачДеталі анімації
Відповідь AI:
Завантажено та проаналізовано character_hero.fbx:
Анімаційні кліпи (5):
Назва кліпу Тривалість Кадри Цикл Idle 2.0s 60 Так Walk 1.0s 30 Так Run 0.8s 24 Так Jump 1.2s 36 Ні Attack 0.6s 18 Ні Скелет:
- Кістки: 65
- Корінь: Hips
- IK-ланцюжки: 4 (2 руки, 2 ноги)
Готово до перегляду у Forge Viewer.
Пошук анімаційних ресурсів
User: "List all assets with walk animations"
Відповідь AI:
Знайдено 8 ресурсів з анімацією “Walk”:
Ресурс Тривалість Walk Інші кліпи character_hero.fbx 1.0s 5 кліпів character_enemy.fbx 0.9s 4 кліпи npc_villager.fbx 1.1s 3 кліпи pet_dog.fbx 0.6s 6 кліпів … … …
Особливості роботи з анімацією
Налаштування анімації FBX
# FBX files can contain multiple takes
# Check for animation stacks
raps derivative metadata "$URN" --output json | jq '.animations'
Анімації glTF
# glTF stores animations differently
# Check for animation samplers
raps derivative metadata "$URN" --output json | jq '.animations[] | {name, channels: .channels | length}'
Перевірка кількості кісток
# Verify bone count for mobile/web
BONES=$(raps derivative tree "$URN" --output json | jq '[.. | objects | select(.type == "bone")] | length')
echo "Bone count: $BONES"
if [ "$BONES" -gt 128 ]; then
echo "Warning: Bone count exceeds mobile limit"
fi
Продуктивність анімації
# Check animation data size
raps translate manifest "$URN" --output json | jq '
.derivatives[] |
select(.outputType == "svf2") |
.children[] |
select(.type == "resource" and (.urn | contains("animation")))
'