KeyframeTrack - Verge3D 用户手册 - Soft8Soft
Description: 了解如何在使用 Verge3D 制作的交互式 3D 应用程序中使用 KeyframeTrack

# KeyframeTrack

关键帧轨道(KeyframeTrack)是关键帧(keyframes)的定时序列, 它由时间和相关值的列表组成, 用来让一个对象的某个特定属性动起来。

在使用手册的“下一步”章节中，“动画系统”一文对Verge3D动画系统中的不同元素作出了概述

和JSON model format的动画层级相反， 关键帧轨道（KeyframeTrack）不会将单帧作为对象存储在“key”数组(一个存有每一帧的时间和值的地方)中。

关键帧轨道(KeyframeTrack)中总是存在两个数组：times数组按顺序存储该轨道的所有关键帧的时间值，而values数组包含动画属性的相应更改值。

值数组中的每一个成员，属于某一特定时间点，不仅可以是一个简单的数字，还可以是（比如）一个向量（如果是位置动画）或者是一个四元数（如果是旋转动画）。 因此，值数组（也是一个平面阵列）的长度可能是时间数组的三四倍。

与不同类型的动画值对应，存在若干关键帧轨道(KeyframeTrack)的子类，继承了它大多数属性和方法：

- BooleanKeyframeTrack
- ColorKeyframeTrack
- NumberKeyframeTrack
- QuaternionKeyframeTrack
- StringKeyframeTrack
- VectorKeyframeTrack

可以在AnimationClipCreator文件中找到用不同类型的关键帧轨道创建动画剪辑(AnimationClips)的示例。

由于显式值仅针对存储在时间数组中的离散时间点指定，因此必须在两个时间点之间进行插值

轨道的名称对于这个轨道与动画节点的特定属性的连接(由PropertyBinding完成)很重要。

## 构造函数

### KeyframeTrack(name : String, times : Array, values : Array, interpolation : Constant)

name — 关键帧轨道(KeyframeTrack)的标识符.
times — 关键帧的时间数组, 被内部转化为 Float32Array.
values — 与时间数组中的时间点相关的值组成的数组, 被内部转化为 Float32Array.
interpolation — 使用的插值类型。 参见 Animation Constants for possible values. Default is InterpolateLinear.

## 属性

### # .name : String

轨道的名称可以指动画对象中的变形目标(morph targets)、骨骼(bones)或可能的其他值 查看PropertyBinding.parseTrackName可获知哪些形式的字符串可以解析出绑定的属性:

可以使用节点名称或uuid（尽管它需要位于传递到混合器的场景图节点的子树中）引用到某节点。或者， 如果轨道名称的首字符是点, 该轨道会应用到传入到混合器的根节点上。

通常，在该节点之后会直接指定一个属性。 但是也可以再指定一个子属性， 例如 如果只是想通过浮动轨道使X组件旋转，可使用 .rotation[x]。

还可以使用对象名称来指定骨骼或多材质，例如：.bones[R_hand].scale；再比如，材质数组中的第四个材质的漫反射颜色的红通道可以通过 .materials[3].diffuse[r]访问到。

属性绑定也会解析变形目标名称, 例如: .morphTargetInfluences[run]

说明: 轨道名称不一定得唯一。 多个轨道可驱动统一属性， 此时结果应该基于多个轨道之间根据其各自动作的权重的加权混合。

### # .times : Float32Array

一个Float32Array类型的值，由传入构造函数中时间数组参数转化而来。

### # .values : Float32Array

一个Float32Array类型的值， 由传入构造函数中值数组参数转化而来

### # .DefaultInterpolation : Constant

默认的参数插值类型： InterpolateLinear.

### # .TimeBufferType : Constant

Float32Array, 内部用于时间数组的缓冲区的类型

### # .ValueBufferType : Constant

Float32Array, 内部用于值数组的缓冲区的类型

## 方法

### # .clone() → KeyframeTrack

### # .createInterpolant() → null

根据传入构造函数中的插值类型参数，创建线性插值(LinearInterpolant)，立方插值(CubicInterpolant)或离散插值 (DiscreteInterpolant)

### # .getInterpolation() → null

返回插值类型

### # .getValueSize() → Number

返回每个值的大小(即values数组的长度除以times数组的长度

### # .InterpolantFactoryMethodDiscrete(result) → DiscreteInterpolant

根据时间(times)和值(values)创建一个新的离散插值(DiscreteInterpolant)。 可传入一个Float32Array类型的变量来接收结果， 否则会自动创建一个长度适宜的新数组。

### # .InterpolantFactoryMethodLinear(result) → null

根据时间(times)和值(values)创建一个新的线性插值(LinearInterpolant)。 可传入一个Float32Array类型的变量来接收结果， 否则会自动创建一个长度适宜的新数组。

### # .InterpolantFactoryMethodSmooth(result) → null

根据时间(times)和值(values)创建一个新的立方插值(CubicInterpolant)。 可传入一个Float32Array类型的变量来接收结果， 否则会自动创建一个长度适宜的新数组。

### # .optimize() → this

删除等效的顺序键，这些键在变形目标序列中很常见。

### # .scale() → this

缩放所有关键帧的时间。
说明: 这个方法很有用，例如， 可用于转化为某一特定帧率(正如animationClip.CreateFromMorphTargetSequence内部所做的一样)。

### # .setInterpolation(interpolationType : Constant) → this

设置插值类型。 参阅Animation Constants以供选择。

### # .shift(timeOffsetInSeconds : Number) → this

及时删除之前或之后的所有关键帧。

### # .trim(startTimeInSeconds : Number, endTimeInSeconds : Number) → this

删除开始时间(startTime)之前以及结束时间(endTime)之后的关键帧，不改变[startTime, endTime]范围内的任何值。

### # .validate() → Boolean

在轨道上执行最小验证，有效则返回true

如果出现以下情况，该方法会在控制台输出错误日志: 轨道为空; value size值不可靠； times数组或values数组中的元素不是数字；times数组中的元素乱序。

## 静态方法

### # .toJSON(track : KeyframeTrack) → JSON

将该轨道转化为JSON

## 源码

src/animation/KeyframeTrack.js