有效地获取间隔中的所有动画帧

时间:2016-05-02 07:59:16

标签: 3dsmax maxscript

我正在为我的场景编写动画导出脚本,我只需要检测那些场景中某些对象的动画键出现的帧。我只需要导出所有动画的一部分(时间间隔)。

目前我正在使用以下代码

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帧,包含很多不同的动画对象,包括位置,旋转和缩放键。因此,密钥在我的集合中被复制多次&#34;密钥&#34; - 总共有大约1,000,000个密钥。

我需要在很短的时间间隔(约50帧)中选择键,但由于集合非常大,所以选择所需的键并删除重复需要很长时间(大约一分钟)。

有没有办法更有效地在指定的时间间隔内使用动画键获取所有帧?

1 个答案:

答案 0 :(得分:1)

由于帧数通常不会达到数百万,因此使用bitarray应该更快,更高效。权衡是它只能存储等于或大于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