导出 3D 动作(用于 3D/游戏引擎)
curl --request GET \
--url https://apis.viggle.ai/v1/motions/{motion_id}/export \
--header 'Authorization: Bearer <token>'import requests
url = "https://apis.viggle.ai/v1/motions/{motion_id}/export"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://apis.viggle.ai/v1/motions/{motion_id}/export', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://apis.viggle.ai/v1/motions/{motion_id}/export",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://apis.viggle.ai/v1/motions/{motion_id}/export"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://apis.viggle.ai/v1/motions/{motion_id}/export")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://apis.viggle.ai/v1/motions/{motion_id}/export")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"id": "<string>",
"status": "queued",
"download_type": "mixamo",
"glb_url": "<string>",
"thumbnail_url": "<string>",
"created_at": "<string>",
"updated_at": "<string>",
"error": {
"code": "<string>",
"message": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "authentication_required",
"message": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "authentication_required",
"message": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "authentication_required",
"message": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "authentication_required",
"message": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "authentication_required",
"message": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "authentication_required",
"message": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "authentication_required",
"message": "<string>",
"request_id": "<string>"
}
}动作
导出 3D 动作(用于 3D/游戏引擎)
获取提取或生成的 3D 动画的签名下载链接。
GET
/
v1
/
motions
/
{motion_id}
/
export
导出 3D 动作(用于 3D/游戏引擎)
curl --request GET \
--url https://apis.viggle.ai/v1/motions/{motion_id}/export \
--header 'Authorization: Bearer <token>'import requests
url = "https://apis.viggle.ai/v1/motions/{motion_id}/export"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://apis.viggle.ai/v1/motions/{motion_id}/export', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://apis.viggle.ai/v1/motions/{motion_id}/export",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://apis.viggle.ai/v1/motions/{motion_id}/export"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://apis.viggle.ai/v1/motions/{motion_id}/export")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://apis.viggle.ai/v1/motions/{motion_id}/export")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"id": "<string>",
"status": "queued",
"download_type": "mixamo",
"glb_url": "<string>",
"thumbnail_url": "<string>",
"created_at": "<string>",
"updated_at": "<string>",
"error": {
"code": "<string>",
"message": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "authentication_required",
"message": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "authentication_required",
"message": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "authentication_required",
"message": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "authentication_required",
"message": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "authentication_required",
"message": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "authentication_required",
"message": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "authentication_required",
"message": "<string>",
"request_id": "<string>"
}
}仅适用于
同一动作改用
type=glb/all 的动作,或通过 POST /v1/motions 的 JSON 模式从文本生成的动作。仅 render 的动作无可导出内容。本接口替代已移除的 GET /v1/animations/{animation_id}。
download_type 直接选择骨架(mixamo 或 metahuman),而非输出格式。不提供 fbx;两种骨架会预先生成,对同一 motion_id 切换骨架不会触发新任务或重新生成。导出的 GLB 可用于 Mixamo、MetaHuman 以及其他兼容 Unity 的动画流程。
选择骨架:
mixamo 是通用的 50 关节骨架,适用于 Mixamo、Unity、Unreal 和多数 DCC 工具。它未绑定具体角色,需重定向到自己的角色网格才能正确播放。metahuman 与 Viggle vsplat 角色使用的 MetaHuman 兼容骨架一致,关节层级完全对应,可直接驱动角色,无需重定向,见创建角色中的 joint_set。该骨架有包含完整面部及表情动画能力的 441 关节版本,以及不含面部关节的 86 关节身体版本;请匹配角色创建时的 joint_set。请求参数
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
motion_id | string | 是 | 创建、生成、导入或列出动作时返回的完整 ID,动作须包含已请求的 3D 动画输出。 |
download_type | string | 否 | 选择预生成骨架的 GLB:mixamo 或 metahuman。省略时仅查询状态。 |
响应参数
返回200 OK。
| 字段 | 类型 | 始终返回 | 说明 |
|---|---|---|---|
id | string | 是 | 所请求的动作公开 ID。 |
status | string | 是 | queued、processing、ready 或 failed。 |
download_type | string 或 null | 是 | 请求中选择的骨架,省略时为 null。 |
glb_url | string 或 null | 是 | 指定 download_type 且对应骨架就绪时有值。 |
thumbnail_url | null | 是 | 动画没有缩略图,始终为 null。 |
created_at | string 或 null | 是 | ISO 8601 时间。尚未记录时可能为空字符串。 |
updated_at | string 或 null | 是 | 最近更新时间,ISO 8601 格式。 |
error | object 或 null | 是 | 失败时的结构化错误详情。 |
{
"id": "mot_456def",
"status": "ready",
"download_type": "mixamo",
"glb_url": "https://assets.viggle.ai/results/animation_mixamo.glb",
"thumbnail_url": null,
"created_at": "2026-07-21T10:00:00+00:00",
"updated_at": "2026-07-21T10:01:00+00:00",
"error": null
}
metahuman,无需重新生成:
{
"id": "mot_456def",
"status": "ready",
"download_type": "metahuman",
"glb_url": "https://assets.viggle.ai/results/animation_metahuman.glb",
"thumbnail_url": null,
"created_at": "2026-07-21T10:00:00+00:00",
"updated_at": "2026-07-21T10:01:00+00:00",
"error": null
}
示例
req,_:=http.NewRequest("GET","https://apis.viggle.ai/v1/motions/mot_456def/export?download_type=mixamo",nil); req.Header.Set("Authorization","Bearer "+os.Getenv("VIGGLE_API_KEY")); resp,err:=http.DefaultClient.Do(req); if err!=nil {panic(err)}; defer resp.Body.Close()
const response=await fetch("https://apis.viggle.ai/v1/motions/mot_456def/export?download_type=mixamo",{headers:{Authorization:`Bearer ${process.env.VIGGLE_API_KEY}`}}); const exported=await response.json();
import os, requests
response=requests.get("https://apis.viggle.ai/v1/motions/mot_456def/export",params={"download_type":"mixamo"},headers={"Authorization":f"Bearer {os.environ['VIGGLE_API_KEY']}"}); response.raise_for_status(); exported=response.json()
curl "https://apis.viggle.ai/v1/motions/mot_456def/export?download_type=mixamo" -H "Authorization: Bearer $VIGGLE_API_KEY"
下载链接有效期较短,每次读取都会重新签名。需要时请再次指定
download_type 获取,不要长期缓存。下一步
文本生成的动作没有 2D 渲染素材,只能使用本导出接口。视频来源的动作若具备video_render 能力且已就绪,可将 motion_id 用于渲染视频。授权
服务端 SDK 使用项目 API 密钥,Remote MCP 使用 OAuth 访问令牌。不要在浏览器代码中暴露项目密钥。
请求头
可选的调用者自定义关联 ID,最长 128 字符。服务会在响应头返回实际使用的值,便于追踪和支持排查。
Required string length:
1 - 128可选来源标签,最长 128 字符,用于识别 SDK、集成、产品入口或内部工作流。
Required string length:
1 - 128路径参数
创建或列出动作时返回的公开 ID,通常以 mot_ 开头,必须属于当前调用者。
Minimum string length:
1查询参数
选择预生成骨架的签名 GLB:mixamo 为 Mixamo 兼容骨架,metahuman 为 MetaHuman 兼容骨架。
可用选项:
mixamo, metahuman 响应
请求成功。
动作 3D 提取或文本生成的下载结果。指定 download_type=mixamo 或 metahuman 后返回相应 glb_url。两种骨架预先生成,切换不会创建新任务。不支持 fbx。下载链接短期有效,每次读取重新签名,替代旧 AnimationResource 和已移除的 GET /v1/animations/{animation_id}。
所请求的动作公开 ID。
Minimum string length:
1queued、processing、ready 或 failed。
可用选项:
queued, processing, ready, failed, cancelled 请求中选择的骨架,省略时为 null。
可用选项:
mixamo, metahuman, null 指定 download_type 且对应骨架就绪时有值。
动画没有缩略图,始终为 null。
ISO 8601 时间。尚未记录时可能为空字符串。
最近更新时间,ISO 8601 格式。
失败时的结构化错误详情。
Show child attributes
Show child attributes

