Format de fichier¶
Les deux fichiers d'OTS sont du JSON UTF-8 simple, indenté et lisible. Vous pouvez en ouvrir un dans un éditeur de texte, en differ deux dans un gestionnaire de versions, ou écrire un script qui en lit un. C'est délibéré — un format d'échange que vous ne pouvez pas inspecter est un format d'échange que vous ne pouvez pas déboguer.
Le format actuel est la version 4.
En-tête commun¶
Les deux formats commencent de la même façon :
{
"format": "octo_anm",
"version": 4,
"source": "harmony",
"fps": 24.0,
"coordinate_system": {
"up": "y",
"hand": "right",
"unit": "meters",
"rot_order": "xyz",
"rot_repr_anim": "euler_deg",
"rot_repr_rest": "quat_wxyz"
}
}
| Clé | Signification |
|---|---|
format |
octo_pvt ou octo_anm |
version |
La version du format. Doit correspondre exactement — voir ci-dessous |
source |
Quelle application l'a écrit : harmony, blender ou maya |
fps |
La cadence d'images de la scène source |
coordinate_system |
L'espace dans lequel sont les valeurs — voir Systèmes de coordonnées |
Pas de migration ascendante
Un reader n'accepte que sa propre version. Un fichier v3 chargé dans un build v4 signale :
unsupported version 3 (this build writes/reads v4; no backward migration — re-export from the source DCC)
C'est un choix, pas un oubli. Migrer silencieusement un vieux fichier revient à deviner ce que ses nombres voulaient dire, et une mauvaise supposition produit un rig subtilement faux plutôt que manifestement cassé. Réexporter depuis la source prend quelques secondes et est toujours correct.
.pvt — fichier de pivot¶
{
"format": "octo_pvt",
"version": 4,
"source": "harmony",
"name": "spaceship",
"scale_factor": 1.0,
"pivot_space": "local",
"fps": 24.0,
"coordinate_system": { "…": "…" },
"bones": [
{
"name": "hip",
"parent": null,
"pivot": [0.0, 0.0, 0.0],
"rotation": [1.0, 0.0, 0.0, 0.0],
"path": "Armature/hip",
"rig": "spaceship",
"is_camera": false
}
],
"cameras": []
}
| Clé | Signification |
|---|---|
name |
Le nom du rig |
scale_factor |
L'option Scale exposée à l'utilisateur. Les pivots sont multipliés par elle à l'écriture, divisés à la lecture |
pivot_space |
local (relatif au parent) ou armature |
bones[].pivot |
Position de rest |
bones[].rotation |
Rotation de rest, sous forme de quaternion [w, x, y, z] |
bones[].path |
Le chemin complet de l'élément dans sa scène source — utilisé pour la correspondance, et pour garder distincts des éléments de même nom dans des rigs différents |
bones[].rig |
Le tag de rig |
path, rig et is_camera sont omis quand ils sont vides, pour qu'un fichier simple reste petit.
.anm — fichier d'animation¶
{
"format": "octo_anm",
"version": 4,
"source": "maya",
"frame_range": [1, 60],
"fps": 24.0,
"coordinate_system": { "…": "…" },
"pegs": [
{
"name": "hip-P",
"path": "Top/spaceship/hip-P",
"parent": "root",
"rest_pivot": [0.0, 0.0, 0.0],
"rest_rotation": [1.0, 0.0, 0.0, 0.0],
"rig": "spaceship",
"is_camera": false,
"source_modes": {
"position": "separate",
"rotation": "euler",
"scale": "separate",
"enable_3d": true
},
"keyframes": [
{
"frame": 1,
"pos": [0.0, 0.0, 0.0],
"rot": [0.0, 0.0, 0.0],
"rot_quat": [1.0, 0.0, 0.0, 0.0],
"scl": [1.0, 1.0, 1.0],
"interp": "BEZIER",
"handles": { "pos": [], "rot": [], "scl": [] }
}
]
}
],
"cameras": []
}
Les champs d'autosuffisance¶
parent, rest_pivot, rest_rotation et rig sont le contenu du .pvt, replié dans chaque peg. C'est la raison pour laquelle Create Rig peut construire un squelette fonctionnel à partir d'un .anm seul. Voir Fichiers d'animation (.anm).
Keyframes¶
| Clé | Signification |
|---|---|
frame |
Numéro de frame |
pos |
Position, en mètres canoniques |
rot |
Euler XYZ, degrés — la forme lisible par un humain |
rot_quat |
La même rotation sous forme de quaternion [w, x, y, z], issue du bake de la world matrix |
scl |
Scale |
interp |
BEZIER, LINEAR ou CONSTANT |
handles |
Handles bezier absolus, par axe, regroupés par canal |
rot_quat l'emporte
Quand les deux sont présents, rot_quat fait autorité et tous les importeurs le préfèrent. Il est indépendant de l'ordre, donc il contourne entièrement l'ambiguïté d'ordre d'Euler. rot est conservé comme repli lisible.
Les handles ne sont pas émis à côté de rot_quat par les bakes de Maya et de Blender, parce que des handles en repère local ne se transposent pas sur une courbe world bakée. Le type d'interpolation, lui, voyage quand même.
Les handles sont des paires absolues [[left_x, left_y], [right_x, right_y]] dans l'espace (frame, valeur) — une par axe, regroupées en pos, rot et scl. Absolues plutôt que relatives, pour ne pas avoir à être redérivées par rapport à une cadence d'images à l'entrée.
source_modes¶
Un relevé de la façon dont le peg a été créé dans son application source — position séparée ou basée sur un path, rotation Euler ou quaternion-path, et si la 3D était activée.
C'est un indice, et rien qu'un indice
source_modes n'affecte jamais aucune valeur. C'est une information de diagnostic pour un humain qui lit le fichier. Un importeur ne changera pas sa façon d'écrire une courbe à cause de ça.
Caméras¶
Les deux formats transportent le même bloc de caméra, lié par nom à l'élément qui l'anime :
| Clé | Signification |
|---|---|
name, peg, path |
Identité, et quel élément l'anime |
is_default |
Si c'est la caméra par défaut de la scène |
fov, fov_axis |
Field of view — vertical, conformément à la convention de Harmony |
override_fov |
Le flag d'override du FOV par caméra de Harmony |
near_plane, far_plane |
Clip planes, en distances canoniques |
near_field, far_field |
Les valeurs de clip d'origine de Harmony en fields, préservées pour qu'un aller-retour Harmony soit sans perte |
angle |
Roll, en degrés autour de Z |
offset_x/y/z, pivot_x/y |
Placement relatif au peg |
rig |
Le tag de rig |
Voir Caméras.
Notes pratiques¶
Les fichiers sont petits. Un rig de personnage complet avec un plan de 60 frames fait quelques centaines de kilo-octets. Ils passent très bien par e-mail, dans un gestionnaire de versions, ou archivés à côté d'un plan comme trace.
Ils sont diffables. Deux exports du même rig produisent du JSON comparable, ce qui fait de « qu'est-ce qui a changé entre ces deux versions » un diff de texte plutôt qu'une devinette.
Le nommage vous appartient. OTS se moque du nom du fichier ; c'est la clé format à l'intérieur qui l'identifie. Garder les extensions .pvt / .anm sert juste à ce que les sélecteurs de fichiers se comportent correctement.