three.js KeyframeTrack

2023-02-16 17:26 更新

關(guān)鍵幀軌道(KeyframeTrack)是關(guān)鍵幀(keyframes)的定時序列, 它由時間和相關(guān)值的列表組成, 用來讓一個對象的某個特定屬性動起來。

在使用手冊的“下一步”章節(jié)中,“動畫系統(tǒng)”一文對three.js動畫系統(tǒng)中的不同元素作出了概述

和JSON model format的動畫層級相反, 關(guān)鍵幀軌道(KeyframeTrack)不會將單幀作為對象存儲在“key”數(shù)組(一個存有每一幀的時間和值的地方)中。

關(guān)鍵幀軌道(KeyframeTrack)中總是存在兩個數(shù)組:times數(shù)組按順序存儲該軌道的所有關(guān)鍵幀的時間值,而values數(shù)組包含動畫屬性的相應(yīng)更改值。

值數(shù)組中的每一個成員,屬于某一特定時間點,不僅可以是一個簡單的數(shù)字,還可以是(比如)一個向量(如果是位置動畫)或者是一個四元數(shù)(如果是旋轉(zhuǎn)動畫)。 因此,值數(shù)組(也是一個平面陣列)的長度可能是時間數(shù)組的三四倍。

與不同類型的動畫值對應(yīng),存在若干關(guān)鍵幀軌道(KeyframeTrack)的子類,繼承了它大多數(shù)屬性和方法:

  • BooleanKeyframeTrack
  • ColorKeyframeTrack
  • NumberKeyframeTrack
  • QuaternionKeyframeTrack
  • StringKeyframeTrack
  • VectorKeyframeTrack

可以在AnimationClipCreator文件中找到用不同類型的關(guān)鍵幀軌道創(chuàng)建動畫剪輯(AnimationClips)的示例。

由于顯式值僅針對存儲在時間數(shù)組中的離散時間點指定,因此必須在兩個時間點之間進行插值

軌道的名稱對于這個軌道與動畫節(jié)點的特定屬性的連接(由PropertyBinding完成)很重要。

構(gòu)造器

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

name - 關(guān)鍵幀軌道(KeyframeTrack)的標識符.times - 關(guān)鍵幀的時間數(shù)組, 被內(nèi)部轉(zhuǎn)化為 Float32Array.values - 與時間數(shù)組中的時間點相關(guān)的值組成的數(shù)組, 被內(nèi)部轉(zhuǎn)化為 Float32Array.interpolation - 使用的插值類型。 參見 Animation Constants for possible values. Default is InterpolateLinear.

屬性

.name : String

軌道的名稱可以指動畫對象中的變形目標(morph targets)、骨骼(bones)或可能的其他值 查看PropertyBinding.parseTrackName可獲知哪些形式的字符串可以解析出綁定的屬性:

可以使用節(jié)點名稱或uuid(盡管它需要位于傳遞到混合器的場景圖節(jié)點的子樹中)引用到某節(jié)點。或者, 如果軌道名稱的首字符是點, 該軌道會應(yīng)用到傳入到混合器的根節(jié)點上。

通常,在該節(jié)點之后會直接指定一個屬性。 但是也可以再指定一個子屬性, 例如 如果只是想通過浮動軌道使X組件旋轉(zhuǎn),可使用 .rotation[x]。

還可以使用對象名稱來指定骨骼或多材質(zhì),例如:.bones[R_hand].scale;再比如,材料數(shù)組中的第四個材料的漫反射顏色的紅通道可以通過 .materials[3].diffuse[r]訪問到。

屬性綁定也會解析變形目標名稱, 例如: .morphTargetInfluences[run]

說明: 軌道名稱不一定得唯一。 多個軌道可驅(qū)動統(tǒng)一屬性, 此時結(jié)果應(yīng)該基于多個軌道之間根據(jù)其各自動作的權(quán)重的加權(quán)混合。

.times : Float32Array

一個Float32Array類型的值,由傳入構(gòu)造器中時間數(shù)組參數(shù)轉(zhuǎn)化而來。

.values : Float32Array

一個Float32Array類型的值, 由傳入構(gòu)造器中值數(shù)組參數(shù)轉(zhuǎn)化而來

.DefaultInterpolation : Constant

默認的參數(shù)插值類型: InterpolateLinear.

.TimeBufferType : Constant

Float32Array, 內(nèi)部用于時間數(shù)組的緩沖區(qū)的類型

.ValueBufferType : Constant

Float32Array, 內(nèi)部用于值數(shù)組的緩沖區(qū)的類型

方法

.clone () : KeyframeTrack

.createInterpolant () : Interpolant

根據(jù)傳入構(gòu)造器中的插值類型參數(shù),創(chuàng)建線性插值(LinearInterpolant),立方插值(CubicInterpolant)或離散插值 (DiscreteInterpolant)

.getInterpolation () : Interpolant

返回插值類型

.getValueSize () : Number

返回每個值的大小(即values數(shù)組的長度除以times數(shù)組的長度

.InterpolantFactoryMethodDiscrete ( result ) : DiscreteInterpolant

根據(jù)時間(times)和值(values)創(chuàng)建一個新的離散插值(DiscreteInterpolant)。 可傳入一個Float32Array類型的變量來接收結(jié)果, 否則會自動創(chuàng)建一個長度適宜的新數(shù)組。

.InterpolantFactoryMethodLinear ( result ) : LinearInterpolant

根據(jù)時間(times)和值(values)創(chuàng)建一個新的線性插值(LinearInterpolant)。 可傳入一個Float32Array類型的變量來接收結(jié)果, 否則會自動創(chuàng)建一個長度適宜的新數(shù)組。

.InterpolantFactoryMethodSmooth ( result ) : CubicInterpolant

根據(jù)時間(times)和值(values)創(chuàng)建一個新的立方插值(CubicInterpolant)。 可傳入一個Float32Array類型的變量來接收結(jié)果, 否則會自動創(chuàng)建一個長度適宜的新數(shù)組。

.optimize () : this

刪除等效的順序鍵,這些鍵在變形目標序列中很常見。

.scale () : this

縮放所有關(guān)鍵幀的時間。說明: 這個方法很有用,例如, 可用于轉(zhuǎn)化為某一特定幀率(正如animationClip.CreateFromMorphTargetSequence內(nèi)部所做的一樣)。

.setInterpolation ( interpolationType : Constant ) : this

設(shè)置插值類型。 參閱Animation Constants以供選擇。

.shift ( timeOffsetInSeconds : Number ) : this

及時刪除之前或之后的所有關(guān)鍵幀。

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

刪除開始時間(startTime)之前以及結(jié)束時間(endTime)之后的關(guān)鍵幀,不改變[startTime, endTime]范圍內(nèi)的任何值。

.validate () : Boolean

在軌道上執(zhí)行最小驗證,有效則返回true

如果出現(xiàn)以下情況,該方法會在控制臺輸出錯誤日志: 軌道為空; value size值不可靠; times數(shù)組或values數(shù)組中的元素不是數(shù)字;times數(shù)組中的元素亂序。

靜態(tài)方法

.toJSON ( track : KeyframeTrack ) : JSON

將該軌道轉(zhuǎn)化為JSON

源碼

src/animation/KeyframeTrack.js


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號