Ключевые кадры определяют, как значение меняется со временем. Например, вы можете указать, где объект должен находиться в начале анимации и куда он должен переместиться дальше, а затем вычислить его позицию в любой момент между этими ключевыми кадрами. Это полезно для анализа кривых движения, проверки тайминга анимации и экспорта выборочных значений для дальнейшего анализа. Aspose.3D for Python via .NET позволяет выбрать образец последовательности ключевых кадров в заданный момент времени без рендеринга 3D‑сцены. В этом руководстве вы создадите простую анимацию позиции, будете оценивать её интерполированные значения каждые полсекунды и сохраните результаты в CSV‑файл.

Установить Aspose.3D для Python

Установите Aspose.3D for Python via .NET версии 26.10 с помощью pip:

pip install aspose-3d==26.10.0

Этот пример использует только модуль aspose.threed.animation и встроенный в Python модуль csv. Вам не нужен файл GLB/GLTF или совместимая с Vulkan видеокарта, поскольку код выполняет расчёты анимации, а не рендеринг изображений.

Для получения информации о платформе и установке обратитесь к Aspose.3D for Python documentation.

Создание и оценка анимации ключевых кадров в Python

Пример моделирует позицию X объекта. Позиция начинается с 0, достигает 10 единиц через две секунды и возвращается к 0 через пять секунд.

Время (секунды)Позиция XДействие
00Старт
210Достичь максимальной позиции
50Вернуться к старту

Значения между этими ключевыми кадрами вычисляются с использованием линейной интерполяции. Пример создает отдельную числовую анимационную кривую; он не привязывает последовательность к реальному объекту сцены.

Полный пример кода на Python

Следующий скрипт создает KeyframeSequence, добавляет три ключевых кадра, оценивает одиннадцать меток времени, проверяет значения ключевых кадров и экспортирует результаты в keyframe_animation.csv.

import csv

from aspose.threed.animation import (
    KeyframeSequence,
    Interpolation
)

OUTPUT_FILE = "keyframe_animation.csv"

# Create an animation curve
sequence = KeyframeSequence("PositionX")

# Define keyframes using linear interpolation
sequence.add(0.0, 0.0, Interpolation.LINEAR)
sequence.add(2.0, 10.0, Interpolation.LINEAR)
sequence.add(5.0, 0.0, Interpolation.LINEAR)

# Display the defined keyframes
print("Keyframes:")

for key in sequence.key_frames:
    print(
        f"Time: {key.time:.2f}s, "
        f"Value: {key.value:.2f}"
    )

# Evaluate the animation every 0.5 seconds
start_time = 0.0
end_time = 5.0
step = 0.5

records = []

print("\nEvaluated animation values:")
print("---------------------------")
print("Time (s) | X Position")

sample_count = int(
    round((end_time - start_time) / step)
) + 1

for i in range(sample_count):
    time = float(start_time + i * step)

# Evaluate the animation at this timestamp
    value = float(sequence.evaluate(time))

records.append([time, value])

print(f"{time:8.2f} | {value:10.3f}")

# Verify values at known timestamps
assert abs(sequence.evaluate(0.0) - 0.0) < 1e-5
assert abs(sequence.evaluate(2.0) - 10.0) < 1e-5
assert abs(sequence.evaluate(5.0) - 0.0) < 1e-5

# Export animation data to CSV
with open(
    OUTPUT_FILE,
    "w",
    newline="",
    encoding="utf-8"
) as file:

writer = csv.writer(file)

writer.writerow([
        "Time (seconds)",
        "X Position"
    ])

writer.writerows(records)

print(f"\nAnimation data saved to {OUTPUT_FILE}")
print("Keyframe validation passed.")

Поймите, как работает оценка ключевых кадров

Определить последовательность ключевых кадров

Класс KeyframeSequence представляет числовую кривую со значениями, определёнными в определённые моменты времени. Эта строка создаёт последовательность с именем PositionX:

sequence = KeyframeSequence("PositionX")

Имя помогает идентифицировать последовательность. Оно не привязывает последовательность автоматически к свойству меша или узла. Для подробностей см. Справочник API KeyframeSequence.

Добавить ключевые кадры с линейной интерполяцией

Каждый вызов add() предоставляет метку времени, значение и тип интерполяции:

sequence.add(0.0, 0.0, Interpolation.LINEAR)
sequence.add(2.0, 10.0, Interpolation.LINEAR)
sequence.add(5.0, 0.0, Interpolation.LINEAR)

Interpolation.LINEAR указывает последовательности вычислять промежуточные значения пропорционально между ключевыми кадрами. В результате значение плавно увеличивается от 0 до 10 в течение первых двух секунд и плавно уменьшается от 10 до 0 в течение следующих трёх секунд.

Вычислить значение в метке времени

Ключевая операция:

value = sequence.evaluate(1.5)

Для этого примера ожидаемый результат через 1.5 секунды составляет 7.5. Линейная интерполяция следует этой формуле:

[ v(t) = v_0 + \frac{t - t_0}{t_1 - t_0}(v_1 - v_0) ]

Здесь t — запрошенная метка времени, t0 и t1 — окружающие времена ключевых кадров, а v0 и v1 — их соответствующие значения.

Между первыми двумя ключевыми кадрами, оценка на 1,5 секунды дает:

[ v(1.5) = 0 + \frac{1.5 - 0}{2 - 0}(10 - 0) = 7.5 ]

Вам не нужно реализовывать эту формулу самостоятельно. KeyframeSequence.evaluate() выполняет вычисление в соответствии с настройками интерполяции последовательности.

Проверьте вычисленные значения

Для образцов ключевых кадров вывод выглядит так:

Keyframes:
Time: 0.00s, Value: 0.00
Time: 2.00s, Value: 10.00
Time: 5.00s, Value: 0.00

Evaluated animation values:
---------------------------
Time (s) | X Position
    0.00 |      0.000
    0.50 |      2.500
    1.00 |      5.000
    1.50 |      7.500
    2.00 |     10.000
    2.50 |      8.333
    3.00 |      6.667
    3.50 |      5.000
    4.00 |      3.333
    4.50 |      1.667
    5.00 |      0.000

Animation data saved to keyframe_animation.csv
Keyframe validation passed.

Операторы assert проверяют значения в три заданных временных метки ключевых кадров. Они используют небольшую погрешность вместо прямого сравнения чисел с плавающей точкой.

Изменяющиеся значения между ключевыми кадрами подтверждают, что последовательность образуется по всему её временно́му диапазону.

Экспортировать значения ключевых кадров в CSV

После оценки последовательности скрипт записывает время и вычисленную позицию X в keyframe_animation.csv, используя модуль csv Python. Файл начинается с:

Time (seconds),X Position
0.0,0.0
0.5,2.5
1.0,5.0
1.5,7.5
2.0,10.0

Вы можете открыть этот CSV в приложении для работы с электронными таблицами, построить полученную кривую движения или снова считать его в Python для анализа. Чтобы получить более детальные результаты, уменьшите step с 0.5 до более маленького интервала и скорректируйте желаемый диапазон времени.

Практические соображения

Только образец в пределах заданного диапазона времени. Этот учебник оценивает времена от 0 до 5 секунд. Значения за пределами определённых ключевых кадров управляются поведением пред‑ и пост‑экстраполяции, которое отличается от интерполяции между ключевыми кадрами.

Выбирайте интерполяцию осознанно. Линейная интерполяция обеспечивает постоянные изменения в каждом сегменте. Другие стили интерполяции могут создавать различные характеристики движения и могут требовать дополнительных настроек ключевых кадров. Обратитесь к справке по API анимации перед изменением режима интерполяции.

Отличайте оценку анимации от анимации сцены. Код оценивает только числовую кривую. Он не обновляет позицию X узла сцены и не создает отрендеренную анимацию. Чтобы переместить 3D‑объект, последовательность должна быть подключена к соответствующему анимированному свойству в сцене.

GPU-рендеринг не требуется. Вызов Scene.render() или рендерингового бэкенда не производится. Это делает пример подходящим для работы с анимационными значениями на машинах без совместимого с Vulkan GPU.

Получить бесплатную временную лицензию

Вы можете запросить бесплатную 30‑дневную временную лицензию, чтобы оценить Aspose.3D for Python via .NET без ограничений пробной версии. Следуйте руководству по лицензированию Aspose.3D, чтобы применить лицензию к вашему приложению.

Бесплатные учебные ресурсы

Изучите эти ресурсы, чтобы продолжить работу с 3D‑анимацией и процессами обработки файлов в Python:

Заключение

Вы можете использовать KeyframeSequence.evaluate() в Aspose.3D for Python via .NET для расчёта значений анимации в определённые моменты времени без рендеринга модели. В этом примере три ключевых кадра определяют кривую позиции по оси X, а оценщик вычисляет промежуточные позиции и экспортирует их в CSV. Чтобы адаптировать пример, измените значения ключевых кадров или интервал выборки. Для анимации на уровне модели следующим шагом является привязка кривых анимации к свойствам сцены и их применение к объектам.

Читать далее