Keyframe 動畫定義了值如何隨時間變化。例如,您可以指定物件在動畫開始時的位置以及接下來的移動位置,然後計算在這些關鍵幀之間任意時刻的位置信息。這對於檢查運動曲線、驗證動畫時序以及匯出取樣值以進一步分析非常有用。Aspose.3D for Python via .NET 允許您在不渲染 3D 場景的情況下,於指定的時間戳對關鍵幀序列進行取樣。在本教程中,您將建立一個簡單的位置動畫,每半秒評估一次其插值值,並將結果保存為 CSV 檔案。

安裝 Aspose.3D for Python

使用 pip 安裝 Aspose.3D for Python via .NET 版本 26.10:

pip install aspose-3d==26.10.0

此範例僅使用 aspose.threed.animation 模組以及 Python 內建的 csv 模組。您不需要 GLB/GLTF 檔案或相容 Vulkan 的顯示卡,因為此程式碼執行的是動畫計算,而非圖像渲染。

有關平台和安裝資訊,請參閱 Aspose.3D for Python 文件。

在 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")

名稱有助於識別序列。它不會自動將序列綁定到網格或節點屬性。欲了解詳細資訊,請參閱 KeyframeSequence API 參考。

使用線性插值添加關鍵幀

每次呼叫 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

在評估序列後,腳本使用 Python 的 csv 模組將時間和計算得到的 X 位置寫入 keyframe_animation.csv。檔案開頭如下:

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 許可指南以將許可證套用到您的應用程式中。

免費學習資源

探索這些資源,以便在 Python 中繼續使用 3D 動畫和文件處理工作流程:

結論

您可以在 Aspose.3D for Python via .NET 中使用 KeyframeSequence.evaluate() 來計算特定時間點的動畫值,而無需渲染模型。在此範例中,三個關鍵影格定義了 X 位置曲線,評估器計算中間位置並將其匯出為 CSV。若要調整範例,請更改關鍵影格的值或取樣間隔。對於模型層級的動畫,下一步是將動畫曲線綁定到場景屬性並套用到物件上。

閱讀更多