Ця сторінка ще не перекладена українською. Показано англійську версію. Переглянути англійською

Робочі процеси анімації

Обробка 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):

Назва кліпуТривалістьКадриЦикл
Idle2.0s60Так
Walk1.0s30Так
Run0.8s24Так
Jump1.2s36Ні
Attack0.6s18Ні

Скелет:

  • Кістки: 65
  • Корінь: Hips
  • IK-ланцюжки: 4 (2 руки, 2 ноги)

Готово до перегляду у Forge Viewer.

Пошук анімаційних ресурсів

User: "List all assets with walk animations"

Відповідь AI:

Знайдено 8 ресурсів з анімацією “Walk”:

РесурсТривалість WalkІнші кліпи
character_hero.fbx1.0s5 кліпів
character_enemy.fbx0.9s4 кліпи
npc_villager.fbx1.1s3 кліпи
pet_dog.fbx0.6s6 кліпів
………

Особливості роботи з анімацією

Налаштування анімації 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")))
'

Пов’язане