2016-05-02 7 views
0

私は自分のシーンのアニメーション書き出しスクリプトを作成しています。シーンの一部のオブジェクトのアニメーションキーが表示されているフレームだけを検出する必要があります。私はすべてのアニメーションの一部(時間間隔)だけをエクスポートする必要があります。 インターバル内のすべてのアニメーションフレームを効果的に取得する

は現在、私はすべてのオブジェクトのすべてのキーを収集するために、次のコード

keys = #() 
for o in objects do 
(
    join keys o.position.controller.keys 
    join keys o.rotation.controller.keys 
    join keys o.scale.controller.keys 
) 

を使用していますし、その後

timeValues = (for k in keys where k.time >= animationRange.start and k.time <= animationRange.end collect k.time) as array 
timeValues = makeUniqueArray timeValues 

は、重複を時間間隔を選択し、ドロップします。

しかし問題は、私のシーンには位置、回転、スケールキーを持つ多くの異なるアニメーションオブジェクトが合計で約3000フレーム含まれていることです。だから私のコレクションの "キー"にはキーが何度も複製されています - 合計で約1,000,000のキーがあります。

小さな時間間隔(約50フレーム)でキーを選択する必要がありますが、コレクションが非常に大きいので、目的のキーを選択して複製をドロップするのに時間がかかりました(約1分)。

指定した時間間隔のアニメーションキーを含むすべてのフレームをより効果的に取得する方法はありますか?

答えて

1

フレームカウントが頻繁に数百万になることはないので、ビット配列を使用する方が高速でメモリ効率が良いはずです。トレードオフは、1つ以上の値しか格納できないということです。キーがフレーム0から始まり、時間+ 1を格納していれば、負のキーの場合は、それに応じてオフセットを調整します。

frames = #{} 

for o in objects do 
(
    for key in o.position.controller.keys do append frames key.time 
    for key in o.rotation.controller.keys do append frames key.time 
    for key in o.scale.controller.keys do append frames key.time 
) 

frames.count = animationRange.end 
frames 
関連する問題