キーフレームアニメーションは、時間の経過に伴う値の変化方法を定義します。たとえば、アニメーションの開始時にオブジェクトがどこにあるべきか、次にどこへ移動すべきかを指定し、キーフレーム間の任意の時点でその位置を計算できます。これは、モーションカーブの検査、アニメーションタイミングの確認、さらなる分析のためのサンプリング値のエクスポートに役立ちます。Aspose.3D for Python via .NET を使用すると、3Dシーンをレンダリングせずに、指定したタイムスタンプでキーフレームシーケンスをサンプリングできます。このチュートリアルでは、シンプルな位置アニメーションを作成し、0.5秒ごとに補間された値を評価し、結果をCSVファイルに保存します。

Aspose.3D for Python のインストール

pip を使用してバージョン 26.10 の Aspose.3D for Python via .NET をインストールします:

pip install aspose-3d==26.10.0

この例では aspose.threed.animation モジュールと Python の組み込み csv モジュールのみを使用します。コードはアニメーション計算を行うだけで画像のレンダリングは行わないため、GLB/GLTF ファイルや Vulkan 対応のグラフィックスカードは必要ありません。

プラットフォームとインストール情報については、Aspose.3D for Python ドキュメント を参照してください。

Pythonでキーフレームアニメーションを作成および評価する

この例はオブジェクトの X 位置をモデル化しています。位置は 0 から始まり、2 秒後に 10 単位に達し、5 秒後に 0 に戻ります。

時間(秒)X 位置アクション
00開始
210最大位置に到達
50開始位置に戻る

これらのキーフレーム間の値は 線形補間 を使用して計算されます。サンプルはスタンドアロンの数値アニメーションカーブを作成しますが、シーケンスを実際のシーンオブジェクトに添付しません。

完全なPythonコード例

以下のスクリプトは KeyframeSequence を作成し、3つのキーフレームを追加し、11個のタイムスタンプを評価し、キーフレームの値を検証し、結果を 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 は、シーケンスにキーフレーム間の中間値を比例的に計算させます。その結果、最初の2秒間で値は0から10へと着実に増加し、次の3秒間で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 はそれぞれの値です。

最初の2つのキーフレームの間で、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 文は、3 つの定義されたキーフレームタイムスタンプでの値をチェックします。直接の浮動小数点等価ではなく、わずかな許容誤差を使用します。

キーフレーム間の変化する値は、シーケンスがその時間範囲全体でサンプリングされていることを確認します。

キーフレームの値を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がないマシンでもアニメーション値を扱うサンプルに適しています。

無料の一時ライセンスを取得

Aspose.3D for Python via .NET を評価するために、試用制限なしで 30 日間の無料一時ライセンスを リクエストできます。ライセンスをアプリケーションに適用するには、Aspose.3D ライセンス ガイド に従ってください。

無料学習リソース

Pythonでの3Dアニメーションおよびファイル処理ワークフローの作業を続けるために、以下のリソースをご確認ください。

結論

特定の時刻でモデルをレンダリングせずにアニメーション値を計算するには、Aspose.3D for Python via .NET の KeyframeSequence.evaluate() を使用できます。この例では、3 つのキーフレームが X 位置のカーブを定義し、評価器が中間位置を計算して CSV にエクスポートします。例を適用するには、キーフレームの値やサンプリング間隔を変更してください。モデルレベルのアニメーションの場合、次のステップはアニメーションカーブをシーンプロパティにバインドし、オブジェクトに適用することです。

続きを読む