资讯动态

three.js BooleanKeyframeTrack:布尔关键帧轨道的原理、用法与离散插值机制

发布时间:2026/9/7 7:08:22 来源:尧图企业网站定制
three.js BooleanKeyframeTrack布尔关键帧轨道的原理、用法与离散插值机制【免费下载链接】three.jsJavaScript 3D Library.项目地址: https://gitcode.com/GitHub_Trending/th/three.jsBooleanKeyframeTrack是 three.js 动画系统中专门承载布尔型关键帧数据的轨道类型继承自KeyframeTrack。它没有插值参数——布尔值只能离散切换因此在源码层面其默认插值被固定为InterpolateDiscrete。读完本文你将掌握该轨道的构造方式、三个被覆写的原型属性、它在动画序列AnimationClip/AnimationMixer中的典型应用以及其 JSON 序列化与反序列化的完整链路。在轨道家族中的定位three.js 的动画系统通过轨道Track 片段Clip 混合器Mixer三层结构组织关键帧数据。KeyframeTrack派生出六个子类分别对应不同的值类型位于 src/animation/tracks/ 目录轨道类值类型典型动画目标NumberKeyframeTrack标量数字半径、强度等单一数值VectorKeyframeTrack2/3/4 维向量位置、缩放QuaternionKeyframeTrack四元数旋转ColorKeyframeTrackRGB 颜色颜色属性StringKeyframeTrack字符串切换资源名等BooleanKeyframeTrack布尔值可见性.visible等开关属性官方 API 文档docs/pages/BooleanKeyframeTrack.html.md将其概括为一句话A track for boolean keyframe values用于布尔关键帧值的轨道。布尔值是典型的不可插值类型——它既不能做线性混合也没有平滑过渡的概念因此这个轨道类是整个家族中结构最简、约束最特殊的一个。构造函数基本用法new BooleanKeyframeTrack( name, times, values );与多数兄弟类不同构造函数只有三个参数namestring轨道名称。轨道名会被PropertyBinding解析用于定位被动画对象上的具体属性例如.visible、mesh.material.transparent或骨骼、morph target 路径timesArray 关键帧时间列表按升序排列valuesArray 与times一一对应的关键帧值列表。没有第四个interpolation参数。这一点与KeyframeTrack基类构造函数constructor( name, times, values, interpolation )见 KeyframeTrack.js形成对比官方文档也明确说明This keyframe track type has nointerpolationparameter because the interpolation is always discrete.该轨道类型没有interpolation参数因为插值始终是离散的。从源码看其构造函数只是把参数原样透传给基类BooleanKeyframeTrack.jsconstructor( name, times, values ) { super( name, times, values ); }基类构造时执行的验证与类型转换基类KeyframeTrack构造函数KeyframeTrack.js在创建实例时做了三件事均适用于布尔轨道参数校验name为undefined时抛出THREE.KeyframeTrack: track name is undefinedtimes为undefined或空数组时抛出no keyframes in track named ...L31-L32。缓冲区类型转换times通过AnimationUtils.convertArray转换为本类TimeBufferTypeFloat32Arrayvalues则转换为ValueBufferType。由于布尔轨道覆写了ValueBufferType Array其values最终是一个普通 JS 数组而非 TypedArrayL48-L55。插值初始化执行this.setInterpolation( interpolation || this.DefaultInterpolation )。布尔轨道不传插值参数因此固定使用DefaultInterpolation即InterpolateDiscrete。单元测试 test/unit/src/animation/tracks/BooleanKeyframeTrack.tests.js 使用的参数正是文档中最典型的一组const parameters { name: .visible, times: [ 0, 1 ], values: [ true, false ], }; const object new BooleanKeyframeTrack( parameters.name, parameters.times, parameters.values );.visible这个轨道名表明该轨道最常见的用途是驱动对象的可见性开关。三个被覆写的原型属性BooleanKeyframeTrack的全部个性都体现在对基类三个原型属性的覆写上官方文档逐一列出了它们与 KeyframeTrack 的覆写关系属性默认值基类默认值源码位置.ValueTypeNameboolBooleanKeyframeTrack.js#L35.ValueBufferTypeArray普通数组Float32ArrayBooleanKeyframeTrack.js#L43.DefaultInterpolationInterpolateDiscreteInterpolateLinearBooleanKeyframeTrack.js#L51ValueTypeName bool值类型的标识符。它一方面用于错误/警告信息的拼接如 unsupported interpolation for bool keyframe track named ...另一方面是 JSON 序列化时type字段的来源见下文。ValueBufferType ArrayTypedArray 中没有布尔类型因此布尔轨道只能把值存在普通数组里。这也解释了为什么基类validate()中的 NaN 检查针对 TypedArray对布尔轨道天然不适用。DefaultInterpolation InterpolateDiscrete默认插值为离散。除了这三个文档中列出的属性源码里还有两行同样关键的静默设置L52-L53BooleanKeyframeTrack.prototype.InterpolantFactoryMethodLinear undefined; BooleanKeyframeTrack.prototype.InterpolantFactoryMethodSmooth undefined;即布尔轨道主动把线性与平滑两种插值的工厂方法置为undefined。这与构造函数不接收interpolation参数是同一设计决策的两面——下面专门分析其机制。为什么插值恒为离散源码层面的机制three.js 的插值由插值器工厂方法实现。基类提供四种工厂方法InterpolantFactoryMethodDiscrete / Linear / Smooth / BezierKeyframeTrack.js#L113-L170。setInterpolation( interpolation )按传入常量选择对应工厂方法并赋给this.createInterpolantL178-L239。如果所选工厂方法为undefined对布尔轨道而言就是 Linear 或 Smooth基类的回退逻辑是若该轨道此前从未设置过createInterpolant且请求的插值不是默认插值则强制回退到默认插值并打印警告KeyframeTrack: unsupported interpolation for bool keyframe track named ...L210-L231因此对BooleanKeyframeTrack而言任何试图使用 Linear/Smooth 的路径都会被静默纠正为 Discrete。真正执行求值的是DiscreteInterpolantsrc/math/interpolants/DiscreteInterpolant.js。它的核心方法只有三行interpolate_( i1 /*, t0, t, t1 */ ) { return this.copySampleValue_( i1 - 1 ); }语义非常直白取参数位置之前最近那个关键帧的采样值原样返回——不做任何混合。这正是布尔数据唯一合理的插值方式值在关键帧时刻发生跳变两次跳变之间保持恒定。再看混合阶段。当AnimationMixer为轨道创建属性混合器时PropertyMixer按类型分派混合函数PropertyMixer.js#L51-L82case string: case bool: mixFunction this._select; // additive is not relevant for non-numeric types mixFunctionAdditive this._select; ... this.buffer new Array( valueSize * 5 );布尔类型与字符串一样走_select按权重选择而非数值型的_lerp且注释明确指出additive 对非数值类型无意义——布尔轨道在加性混合模式下退化为普通选择。此外在 AnimationUtils.js#L265 的处理路径中bool与string类型会被显式跳过从源码结构看这体现了框架在需要数值运算的场景中对非数值轨道的统一豁免。典型实战动画切换对象可见性结合上述机制一个完整的最小用例如下依赖three主模块import * as THREE from three; // 1. 布尔轨道0s 时可见2s 时隐藏4s 时重新可见 const track new THREE.BooleanKeyframeTrack( .visible, // 轨道名解析到目标对象的 visible 属性 [ 0, 2, 4 ], // times [ true, false, true ] // values普通 JS 布尔值 ); // 2. 组装成动画片段duration 可传 -1 表示由轨道自动推算 const clip new THREE.AnimationClip( blink, -1, [ track ] ); // 3. 为场景中的对象创建混合器并播放 const mixer new THREE.AnimationMixer( mesh ); const action mixer.clipAction( clip ); action.play(); // 4. 渲染循环中推进时间 function animate( dt ) { mixer.update( dt ); // ... }行为预测由DiscreteInterpolant的取前值语义决定t ∈ [0, 2)时mesh.visible为truet ∈ [2, 4)时为falset ≥ 4后回到true。注意切换发生在关键帧时刻而不是渐变过去——这是离散插值的固有特性。由于布尔轨道getValueSize()为 1values.length / times.lengthtimes与values必须严格等长否则基类validate()会报 Invalid value size in track。序列化与还原bool 类型名如何贯穿 JSON 链路布尔轨道的bool类型名在 JSON 往返链路中扮演枢纽角色序列化KeyframeTrack.toJSON( track )KeyframeTrack.js#L68-L104输出{ name, times, values, type: track.ValueTypeName }。由于布尔轨道的插值恒等于默认值InterpolateDiscreteinterpolation ! track.DefaultInterpolation判断不成立JSON 中不会出现interpolation字段——这再次印证插值固定的设计。反序列化AnimationClip内部按type字段查找轨道类映射表中有明确分支AnimationClip.js#L439-L442case bool: case boolean: return BooleanKeyframeTrack;即bool与boolean两种写法都能正确还原为BooleanKeyframeTrack无法识别的类型名会抛出Unsupported typeName错误。克隆基类clone()KeyframeTrack.js#L587-L600使用this.constructor重建实例并直接拷贝createInterpolant工厂方法对布尔轨道而言克隆后仍是离散插值的BooleanKeyframeTrack。从基类继承的实用方法除上述专属定义外BooleanKeyframeTrack实例完整继承了基类的轨道编辑方法均可链式调用并返回thisshift( timeOffset )整体平移关键帧时间KeyframeTrack.js#L287scale( timeScale )按比例缩放时间便于帧-秒换算L311;trim( startTime, endTime )裁剪区间外的关键帧且至少保留一个关键帧L339optimize()移除与相邻关键帧等值的冗余帧。对布尔轨道这类开关序列尤为有效例如true, true, true, false, false可压缩为true, falseL469-L579validate()校验值尺寸、时间有序性与数值合法性L387。这些方法在 docs/pages/KeyframeTrack.html.md 的基类文档中有完整说明在编辑布尔轨道时间轴时同样适用。小结BooleanKeyframeTrack是 three.js 动画体系中非数值轨道的代表以最小的源码体量55 行完成了三处属性覆写ValueTypeName、ValueBufferType、DefaultInterpolation与两处插值工厂禁用从而在构造、插值、混合、序列化各环节都强制走离散路径。对于需要程序化驱动.visible、transparent等开关型属性的动画配合AnimationClip与AnimationMixer即可实现确定性的状态跳变控制。【免费下载链接】three.jsJavaScript 3D Library.项目地址: https://gitcode.com/GitHub_Trending/th/three.js创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价