Skip to main content

AnimJ(Resonite动画文件)

AnimJ

AnimJ 是 Resonite 中用于动画资产的自定义导入格式。它允许你将任意动画轨道构建为外部 JSON 文件,并将其作为原生动画资产导入。这些动画资产可用于通过 Animator 组件驱动数值,或使用 ProtoFlux 节点采样数值。

将 AnimJ 文件导入 Resonite 时使用的文件扩展名为 .animj,但这些文件内部的文本是标准 JSON 格式。

Basic Overview(基本概述)

由于 AnimJ 文件是 Resonite 中动画资产的表示形式,该文件需要包含动画资产用于驱动数值的大部分内容。这些内容包括:

  • 名称
  • 动画“轨道”
  • 轨道类型
  • 轨道的“节点”和“属性”(可以是任意内容,但旨在指定动画轨道所控制的对象)
  • 轨道值类型(要动画化的数据类型)
  • 轨道“关键帧”
  • 每个关键帧的数据

请参阅示例以了解 animj 文件的结构,并查看架构以获取更详细的文档。

Schema(架构)

本节从更深入的技术角度介绍 AnimJ 文件的结构。

每个动画可以包含一个或多个动画轨道。Resonite 支持不同的动画轨道类型以满足不同的用途。每个动画轨道包含一个或多个表示值序列的关键帧。以下是动画可以使用的类型:

这里的字节值适用于 AnimX

不支持的类型:

  • colorX
  • char
  • DateTime
  • TimeSpan
  • decimal
  • 枚举(enums)

这些类型不支持,因为它们不包含在 Resonite 代码库的 Elements.Core.AnimX.elementTypes 列表中。

Value Examples(值示例)

数据类型 (Data Type) 示例 (Example)
bool true
bool2 {"x": true, "y": false}
bool3 {"x": true, "y": false, "z": true}
bool4 {"x": true, "y": false, "z": true, "w": false}
byte 23
ushort 1200
ulong 2349587120938
sbyte -3
short -56
int 69
int2 {"x": 12, "y": -4}
int3 {"x": 12, "y": -4, "z": 203}
int4 {"x": 12, "y": -4, "z": 203, "w": 0}
uint 9
uint2 {"x": 9, "y": 4}
uint3 {"x": 9, "y": 4, "z": 2147483699}
uint4 {"x": 9, "y": 4, "z": 2147483699, "w": 1}
long 9876543210
long2 {"x": 12, "y": -4}
long3 {"x": 12, "y": -4, "z": 203}
long4 {"x": 12, "y": -4, "z": 203, "w": 0}
float 4.3
float2 {"x": 4.3, "y": 1.34}
float3 {"x": 4.3, "y": 1.34, "z": 2.333E+9}
float4 {"x": 4.3, "y": 1.34, "z": 2.333E+9, "w": -5.000000001}
floatQ {"x": 1.889846E-07, "y": -0.5664063, "z": -1.762067E-07, "w": 0.8241262}
float2x2 使用 AnimX 以访问此功能。
float3x3 使用 AnimX 以访问此功能。
float4x4 使用 AnimX 以访问此功能。
double 4.3
double2 {"x": 4.3, "y": 1.34}
double3 {"x": 4.3, "y": 1.34, "z": 2.333E+9}
double4 {"x": 4.3, "y": 1.34, "z": 2.333E+9, "w": -5.000000001}
doubleQ {"x": 1.889846E-07, "y": -0.5664063, "z": -1.762067E-07, "w": 0.8241262}
double2x2 使用 AnimX 以访问此功能。
double3x3 使用 AnimX 以访问此功能。
double4x4 使用 AnimX 以访问此功能。
color {"r": 0.2, "g": 0, "b": 1, "a": 0.85}
color32 {"r": 51, "g": 0, "b": 1, "a": 217}
string "Hello World!"

Animation(动画)

基础动画对象。

属性 (Property) 类型 (Type) 描述 (Description) 必需 (Required)
name String 整个动画的内部名称
globalDuration Number 整个动画播放的时长(秒),即使你的关键帧提前结束
tracks AnimationTrack 对象数组 动画中包含的轨道列表 否,但没有则无用

AnimationTrack(动画轨道)

动画内部的轨道。

截至版本 2024.7.4.1347,以下属性需要按确切顺序指定,否则加载将失败:

属性 (Property) 类型 (Type) 描述 (Description) 必需 (Required)
trackType "Raw""Discrete""Curve""Bezier" 用于确定每个关键帧之间的插值方式
valueType 有效类型之一(字符串) 确定整个轨道使用的值类型
data AnimationTrack 对象的其余部分(见下文) 保存关键帧数据,以及 Node 和 Property 属性

注意:从 JSON 导入的 AnimationTrack 对象并不是实际存储在 Resonite 中的内容。相反,使用自定义的 JsonConverter 来读取 trackTypevalueType 属性,然后根据这些属性使用 data 属性创建相应的对象(RawAnimationTrack<T>DiscreteAnimationTrack<T>CurveAnimationTrack<T>)。

因此,根据你在 trackType 中指定的类型,关键帧数据会有所不同。

Generic Animation Track Data(通用动画轨道数据)

适用于所有轨道类型的数据:

属性 (Property) 类型 (Type) 描述 (Description) 必需 (Required)
node String 用于指定动画控制的对象。可与 Find Animation Track Index ProtoFlux 节点一起使用。
property String 用于指定被动画控制的对象的字段。可与 Find Animation Track Index ProtoFlux 节点一起使用。
keyframes 见下文 特定时间间隔的值列表,用于确定整个轨道在特定时间的值。

仅适用于原始动画轨道类型的数据:

属性 (Property) 类型 (Type) 描述 (Description) 必需 (Required)
interval Number 每个关键帧之间线性插值所需的时间(秒)(使用此属性将忽略 globalDuration

Keyframes(关键帧)

包含动画轨道在特定时间应该具有的值的结构。

针对每种动画轨道类型有不同的结构。

Raw(原始)

此轨道类型仅在等间隔设置值。
keyframes 属性只是 Raw 类型的值数组。帧之间的时间由 interval 决定。
但是,除非包含 interval 属性,否则动画轨道无法按预期工作。

Discrete(离散)

此轨道类型在指定的时间设置值。
这些关键帧是对象:

属性 (Property) 类型 (Type) 描述 (Description) 必需 (Required)
time Number 自动画开始以来经过的时间(秒),在该时间点应应用随附的 value 属性。
value valueType 属性中设置的类型。请参阅值示例以了解每种类型的表示形式。 将被设置的值

Curve(曲线)

此轨道类型在指定的时间设置值,并在帧之间插值以达到这些值。
这些关键帧是对象:

属性 (Property) 类型 (Type) 描述 (Description) 必需 (Required)
time Number 自动画开始以来经过的时间(秒),在该时间点应通过插值达到随附的 value 属性。
value valueType 属性中设置的类型。请参阅值示例以了解每种类型的表示形式。 将被设置的值
interpolation "Linear""Tangent""Hold""CubicBezier" 请参阅 KeyframeInterpolation
leftTangent valueType 属性中设置的类型。请参阅值示例以了解每种类型的表示形式。 请参阅 KeyframeInterpolation 仅当 interpolation 设置为 "Tangent" 或 "CubicBezier" 时
rightTangent valueType 属性中设置的类型。请参阅值示例以了解每种类型的表示形式。 请参阅 KeyframeInterpolation 仅当 interpolation 设置为 "Tangent" 或 "CubicBezier" 时
CubicBezier

CubicBezier 表示三次贝塞尔曲线算法,其中使用四个点来创建两个关键帧之间数据的曲线。在下面的示例 GIF 中,P0 是当前关键帧的 value,P1 是当前关键帧的 rightTangent,P2 是下一个关键帧的 leftTangent,P3 是下一个关键帧的 value。黑点表示两个关键帧之间的当前值。这也意味着你不需要第一个关键帧的 leftTangent,也不需要最后一个关键帧的 rightTangent。.

Bézier_3_big.gif

Examples(示例)

动画轨道的典型结构如下:

{   
   "name": "My Animation",
   "globalDuration": 0,
   "tracks": [
       {
           "trackType": "Discrete",
           "valueType": "float",
           "data": {
               "node": "Test",
               "property": "Test",
               "keyframes": [
                   {
                       "time": 0,
                       "value": 1
                   },
                   {
                       "time": 1,
                       "value": 42
                   },
                   {
                       "time": 5,
                       "value": 20
                   }
               ]
           }
       }
   ]
}

以下是一个带有 float3 类型的轨道示例:

{
   "name": "Test Animation Data 1",
   "globalDuration": 0,
   "tracks": [
       {
           "trackType": "Discrete",
           "valueType": "float3",
           "data": {
               "node": "TestData",
               "property": "TestData",
               "keyframes": [
                   {
                       "time": 0,
                       "value": {
                           "x": 1.0,
                           "y": 2.0,
                           "z": 3.0
                       }
                   }
               ]
           }
       }
   ]
}

Animation Track(动画轨道)

动画轨道是一个单一的值时间线。你可以在一个动画中拥有任意多个动画轨道。每个轨道可以通过 Node 和 Property 唯一标识。

Node 指示给定轨道控制层级中的哪个对象,而 Property 指定当动画绑定到场景对象时将控制该对象的哪个字段。例如,对于 floatQ 类型的轨道,Node "Fan Blade" 和 Property "Rotation" 可以控制旋转动画。

然而,这两者都只是名称,不需要对应于场景中的任何内容。你可以忽略名称,通过索引引用动画轨道,或者使用名称与 ProtoFlux 进行动态查找。

Animation Track Types(动画轨道类型)

Resonite 目前支持以下动画轨道类型。每种类型都针对不同的用例进行了优化。动画可以混合不同类型的轨道。

Raw Animation Track(原始动画轨道)

以下是此类轨道的示例:

{
           "trackType": "Raw",
           "valueType": "float",
           "data": {
               "node": "Test",
               "property": "Test",
               "keyframes": [
                  0.5,
                  0.7,
                  0.8,
                  0.9
               ]
           }
}

Discrete Animation Track(离散动画轨道)

{
           "trackType": "Discrete",
           "valueType": "float",
           "data": {
               "keyframes": [
                   {
                       "time": 0,
                       "value": 2
                   },
                   {
                       "time": 1,
                       "value": 8
                   },
                   {
                       "time": 5,
                       "value": 20
                   }
               ],
               "node": "Test",
               "property": "Test"
           }
}

Curve Animation Track(曲线动画轨道)

在导入 3D 模型文件时,使用此类型的动画轨道。

以下示例展示了带有线性插值关键帧的曲线动画轨道。它还有一个额外的离散动画轨道。

{
   "name": "Universe Timing (Czech)",
   "tracks": [
       {
           "trackType": "Curve",
           "valueType": "float",
           "data": {
               "node": "Scale",
               "property": "",
               "keyframes": [
                   {
                       "time": 0,
                       "value": -17,
                       "interpolation" : "Linear"
                   },
                   {
                       "time": 49.97,
                       "value": -17,
                       "interpolation" : "Linear"
                   },
                   {
                       "time": 97,
                       "value": -5,
                       "interpolation" : "Linear"
                   },
                   {
                       "time": 128,
                       "value": 0,
                       "interpolation" : "Linear"
                   },
                   {
                       "time": 134,
                       "value": 0,
                       "interpolation" : "Linear"
                   },
                   {
                       "time": 152,
                       "value": 5.5,
                       "interpolation" : "Linear"
                   },
                   {
                       "time": 175,
                       "value": 7,
                       "interpolation" : "Linear"
                   },
                   {
                       "time": 184,
                       "value": 7.5,
                       "interpolation" : "Linear"
                   },
                   {
                       "time": 207,
                       "value": 12,
                       "interpolation" : "Linear"
                   },
                   {
                       "time": 247,
                       "value": 27,
                       "interpolation" : "Linear"
                   }
               ]
           }
       },
       {
           "trackType": "Discrete",
           "valueType": "int",
           "data": {
               "node": "Phase",
               "property": "",
               "keyframes": [
                   {
                       "time": 0,
                       "value": 0
                   },
                   {
                       "time": 45,
                       "value": 1
                   },
                   {
                       "time": 49.97,
                       "value": 2
                   },
                   {
                       "time": 247,
                       "value": 3
                   }
               ]
           }
       }
   ]
}

Bezier Animation Track(贝塞尔动画轨道)

带切线的关键帧架构(用于定义贝塞尔曲线)如下:

{   
   "time": 10,
   "value": 0,
   "leftTangent" : -10,
   "rightTangent" : 5,
   "interpolation" : "Tangent"
}