
VectorKeyframeTrackthree.js 矢量關鍵幀軌道完全指南【免費下載鏈接】three.jsJavaScript 3D Library.項目地址: https://gitcode.com/GitHub_Trending/th/three.js在 three.js 的動畫系統(tǒng)中VectorKeyframeTrack是驅(qū)動位置position、縮放scale等矢量屬性動畫的核心軌道類型。本文基于 VectorKeyframeTrack 官方文檔 與 源碼實現(xiàn)系統(tǒng)講解其構(gòu)造函數(shù)、插值模式、底層原理、實戰(zhàn)用法與完整方法集幫助你理解并構(gòu)建基于矢量的關鍵幀動畫。概述什么是 VectorKeyframeTrackVectorKeyframeTrack是 three.js 動畫系統(tǒng)AnimationClip/AnimationMixer中用于存儲和插值矢量關鍵幀值的軌道類型。它繼承自 KeyframeTrack專門處理包含多個分量如三維向量的 x、y、z的動畫數(shù)據(jù)。一個典型的應用場景是為對象的.position或.scale屬性編寫關鍵幀動畫。例如讓一個立方體在 0 秒位于原點、1 秒移動到 (10, 0, 0)就需要一個矢量軌道來記錄這些位置變化。構(gòu)造函數(shù)詳解new VectorKeyframeTrack( name, times, values, interpolation )構(gòu)造一個新的矢量關鍵幀軌道參數(shù)與父類KeyframeTrack完全一致參數(shù)類型說明namestring軌道的名稱用于將軌道綁定到具體屬性如.position詳見 PropertyBinding 的軌道名解析timesArraynumber關鍵幀時間點列表秒如[0, 1, 2]valuesArraynumber關鍵幀值列表按時間點順序連續(xù)排列interpolationInterpolateLinear|InterpolateDiscrete|InterpolateSmooth插值類型可選默認繼承父類的InterpolateLinear關于 values 的格式矢量軌道默認按三維向量x, y, z處理因此 values 的長度必須是 times 長度的整數(shù)倍。例如兩個關鍵幀times [0, 1]對應 values 應為[x0, y0, z0, x1, y1, z1]即 6 個數(shù)值。import * as THREE from three; // 創(chuàng)建一段位置動畫0s 在 (0,0,0)1s 到 (10,0,0)2s 回到 (0,0,0) const positionTrack new THREE.VectorKeyframeTrack( .position, [ 0, 1, 2 ], [ 0, 0, 0, 10, 0, 0, 0, 0, 0 ], THREE.InterpolateLinear );父類構(gòu)造校驗構(gòu)造函數(shù)內(nèi)部會先執(zhí)行兩次安全檢查見 KeyframeTrack.jsname未定義時拋出THREE.KeyframeTrack: track name is undefinedtimes未定義或為空時拋出THREE.KeyframeTrack: no keyframes in track named name。隨后times與values會經(jīng) AnimationUtils.convertArray 轉(zhuǎn)換為Float32Array由繼承的TimeBufferType/ValueBufferType決定。核心屬性.ValueTypeName : string標識軌道值類型的名稱VectorKeyframeTrack覆寫為vector源碼 VectorKeyframeTrack.js。該值在 KeyframeTrack.toJSON 序列化時作為json.type輸出供反序列化時重建對應軌道類型。繼承自 KeyframeTrack 的屬性VectorKeyframeTrack自身沒有新增屬性以下關鍵屬性均從父類繼承屬性默認值說明.DefaultInterpolationInterpolateLinear默認插值類型見 KeyframeTrack.js.TimeBufferTypeFloat32Array時間數(shù)據(jù)緩沖類型.ValueBufferTypeFloat32Array值數(shù)據(jù)緩沖類型.name—軌道名如.position、.scale或變形目標名.times—關鍵幀時間點Float32Array.values—關鍵幀值Float32Array插值模式插值模式在構(gòu)造函數(shù)第四個參數(shù)中指定常量定義于 src/constants.js常量值行為THREE.InterpolateDiscrete2300離散插值不做平滑過渡適用于瞬時切換THREE.InterpolateLinear2301線性插值默認在關鍵幀間直線過渡THREE.InterpolateSmooth2302平滑三次樣條插值曲線更圓滑THREE.InterpolateBezier2303貝塞爾插值需在track.settings中提供切線數(shù)據(jù)底層插值器工廠VectorKeyframeTrack直接復用父類的三個工廠方法KeyframeTrack.js分別創(chuàng)建DiscreteInterpolant、LinearInterpolant與CubicInterpolant而setInterpolation()負責把工廠方法掛到createInterpolant上。如果傳入了不支持的插值類型會回退到默認插值并輸出警告unsupported interpolation for vector keyframe track named ...KeyframeTrack.js。對比四元數(shù)軌道QuaternionKeyframeTrack覆寫了線性插值工廠以使用QuaternionLinearInterpolant并禁用了平滑插值QuaternionKeyframeTrack.js而VectorKeyframeTrack對三種插值全量支持無需覆寫。與動畫系統(tǒng)協(xié)作完整實戰(zhàn)示例VectorKeyframeTrack通常不單獨使用而是被包裝進AnimationClip由AnimationMixer驅(qū)動播放。以下是一個完整示例import * as THREE from three; const mesh new THREE.Mesh( new THREE.BoxGeometry(), new THREE.MeshStandardMaterial() ); // 1. 創(chuàng)建矢量軌道位置動畫線性與縮放動畫離散 const positionTrack new THREE.VectorKeyframeTrack( .position, [ 0, 1, 2 ], [ 0, 0, 0, 10, 0, 0, 0, 0, 0 ], THREE.InterpolateLinear ); const scaleTrack new THREE.VectorKeyframeTrack( .scale, [ 0, 1, 2 ], [ 1, 1, 1, 2, 2, 2, 1, 1, 1 ], THREE.InterpolateDiscrete ); // 2. 打包為動畫剪輯 const clip new THREE.AnimationClip( move, 2, [ positionTrack, scaleTrack ] ); // 3. 交給混合器播放 const mixer new THREE.AnimationMixer( mesh ); const action mixer.clipAction( clip ); action.play(); // 4. 在渲染循環(huán)中更新 function animate( clock ) { mixer.update( clock.getDelta() ); renderer.render( scene, camera ); }繼承自 KeyframeTrack 的完整方法集VectorKeyframeTrack可直接使用父類的全部實例方法與靜態(tài)方法實現(xiàn)均在 KeyframeTrack.js方法說明setInterpolation( type )設置插值類型并返回this鏈式調(diào)用getInterpolation()返回當前插值類型getValueSize()返回值分量數(shù)values.length / times.length矢量軌道通常為 3shift( timeOffset )將所有關鍵幀時間平移timeOffset秒返回thisscale( timeScale )將所有關鍵幀時間縮放timeScale倍常用于幀率與秒的換算返回thistrim( startTime, endTime )裁剪掉時間范圍外的關鍵幀并保證至少保留一個關鍵幀返回thisvalidate()校驗軌道數(shù)據(jù)值大小是否為整數(shù)、時間是否合法、鍵序是否升序、值是否含 NaN返回布爾值optimize()移除相鄰的等價關鍵幀對形態(tài)目標動畫常見進行就地壓縮返回thisclone()復制關鍵幀數(shù)據(jù)并返回新的同類型軌道toJSON( track )靜態(tài)方法序列化為 JSONtype字段即ValueTypeNameInterpolantFactoryMethodDiscrete/Linear/Smooth/Bezier各插值器的工廠方法單元測試驗證倉庫為VectorKeyframeTrack提供了獨立的單元測試 test/unit/src/animation/tracks/VectorKeyframeTrack.tests.js覆蓋了兩個核心斷言繼承關系new VectorKeyframeTrack(...) instanceof KeyframeTrack為true驗證其正確繼承自基類實例化支持name times values三參數(shù)與name times values interpolation四參數(shù)兩種構(gòu)造方式。測試中的示例參數(shù)name: .force、times: [0]、values: [0.5, 0.5, 0.5]也印證了矢量軌道的典型數(shù)據(jù)形態(tài)——一個時間點對應三個分量值。使用建議與注意事項values 長度務必保證values.length times.length * 3三維向量場景否則validate()會報告 Invalid value size。時間單調(diào)性times必須按升序排列亂序數(shù)據(jù)會被validate()識別為 Out of order keys。默認插值不傳interpolation時使用線性插值InterpolateLinear絕大多數(shù)位移動畫夠用需要平滑曲線時使用InterpolateSmooth需要瞬間切換如隱藏/顯示時使用InterpolateDiscrete。序列化往返toJSON()輸出的type: vector字段是反序列化時重建VectorKeyframeTrack的關鍵標識KeyframeTrack.js。配合其他軌道將矢量軌道位置/縮放、四元數(shù)軌道旋轉(zhuǎn)QuaternionKeyframeTrack與數(shù)值軌道透明度等NumberKeyframeTrack組合進同一個AnimationClip即可構(gòu)建完整的骨骼/對象動畫。相關資源軌道基類KeyframeTrack 文檔 與 源碼兄弟軌道QuaternionKeyframeTrack、NumberKeyframeTrack、ColorKeyframeTrack、BooleanKeyframeTrack、StringKeyframeTrack均位于src/animation/tracks/目錄軌道解析與綁定PropertyBinding播放系統(tǒng)AnimationMixer、AnimationClip單元測試VectorKeyframeTrack.tests.js【免費下載鏈接】three.jsJavaScript 3D Library.項目地址: https://gitcode.com/GitHub_Trending/th/three.js創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考