アニメーション化されたGLBまたはGLTFモデルは、完成した画像のフォルダーではなく、ジオメトリとアニメーションデータを格納します。サムネイルやフレームシーケンスを作成するには、特定のタイムスタンプでモデルのアニメーションを評価し、得られたシーンを画像としてレンダリングする必要があります。このチュートリアルでは、Aspose.3D for Python via .NET を使用して、Python で GLB アニメーションフレームをレンダリングする方法を説明します。アニメーションモデルをロードし、クリップを選択し、タイムラインをサンプリングして、各フレームを番号付き PNG 画像として保存します。生成された画像は、モデルのプレビューとして、または別の画像シーケンスワークフローへの入力として使用できます。
Aspose.3D for Python via .NET のインストール
pip を使用して パッケージ をインストールします:
pip install aspose-3d
以下も必要です:
- アニメーション化された
.glbファイルまたは、バッファとテクスチャを含む.gltfファイル。 - Aspose.3D のハードウェア要件に適合したレンダリング環境。システム要件はsystem requirementsをご確認ください。
- サンプリングされたタイムライン全体でアニメーションオブジェクトが視界に入るようにするカメラ位置。
アニメーションクリップを PNG フレームとしてレンダリング
次のコードを render_glb_animation_frames.py として保存し、animated_model.glb があるフォルダーから実行してください。
import hashlib
import math
from pathlib import Path
import aspose.threed as a3d
from aspose.pydrawing import Color, Size
from aspose.pydrawing.imaging import ImageFormat
from aspose.threed.entities import Camera
from aspose.threed.utilities import Vector3
INPUT_FILE = Path("animated_model.glb")
OUTPUT_DIR = Path("frames")
FRAMES_PER_SECOND = 5
IMAGE_WIDTH = 800
IMAGE_HEIGHT = 600
def main():
if not INPUT_FILE.is_file():
raise FileNotFoundError(f"Input model not found: {INPUT_FILE}")
scene = a3d.Scene.from_file(str(INPUT_FILE))
clips = list(scene.animation_clips)
if not clips:
raise RuntimeError("The input model has no animation clips.")
clip = clips[0]
duration = float(clip.stop - clip.start)
if duration <= 0:
raise ValueError("The selected animation has no positive time range.")
# Use the same camera position for every frame.
camera = Camera()
camera_node = scene.root_node.create_child_node("PreviewCamera", camera)
camera_node.transform.translation = Vector3(3, 2, 6)
camera.look_at = Vector3.ORIGIN
options = a3d.ImageRenderOptions()
options.background_color = Color.white
options.asset_directories.append(str(INPUT_FILE.resolve().parent))
OUTPUT_DIR.mkdir(parents=True, exist_ok=True)
frame_count = max(1, math.ceil(duration * FRAMES_PER_SECOND))
hashes = set()
for frame_index in range(frame_count):
timestamp = float(clip.start) + frame_index / FRAMES_PER_SECOND
clip.apply_to(timestamp)
frame_path = OUTPUT_DIR / f"frame_{frame_index:04d}.png"
scene.render(
camera,
str(frame_path),
Size(IMAGE_WIDTH, IMAGE_HEIGHT),
ImageFormat.png,
options,
)
if not frame_path.is_file() or frame_path.stat().st_size == 0:
raise RuntimeError(f"Rendering did not create a usable PNG: {frame_path}")
hashes.add(hashlib.sha256(frame_path.read_bytes()).digest())
print(f"Frame {frame_index + 1}/{frame_count}: {frame_path} at {timestamp:.3f}s")
if frame_count > 1 and len(hashes) == 1:
print("WARNING: All PNG files are byte-identical. Check animation state and camera view.")
print(f"Created {frame_count} PNG file(s) in {OUTPUT_DIR}/")
if __name__ == "__main__":
main()
次の方法で実行:
python render_glb_animation_frames.py
期待される出力: frames ディレクトリには frame_0000.png、frame_0001.png、frame_0002.png などの画像が含まれます。レンダラーが適用されたアニメーション状態を正しくキャプチャすると、画像はアニメーションの連続したポイントでモデルを示します。
フレームレンダリングコードの仕組み
シーンをロードしてアニメーションクリップを選択する
The Scene.from_file() メソッドはモデルを開き、scene.animation_clips は含まれるアニメーションクリップへのアクセスを提供します。例では最初のクリップを使用し、その start と stop プロパティを読み取って時間範囲を決定します。アニメーションクリップがないモデルはこのメソッドではアニメーションシーケンスを生成できません。
クリップ選択とノード変換の詳細については、Python で GLB/GLTF アニメーションをロードおよび評価する を参照してください。
タイムラインを定期的にサンプリングする
スクリプトは1秒あたり5つのサンプルを使用します。クリップの長さが2秒の場合、クリップが0から開始するとき、0.0秒から1.8秒までのタイムスタンプで10フレームを要求します。正確な終点を除外することで、開始姿勢に戻るループアニメーションの余分な最終フレームが生成されるのを防ぎます。
clip.apply_to(timestamp) メソッドは、各タイムスタンプで選択されたアニメーションクリップを適用します。単一のキーフレームシーケンスを評価するのとは異なり、このステップは画像がレンダリングされる前にアニメーションシーンを更新することを目的としています。
1つのカメラから更新されたシーンをレンダリング
この例では、固定位置にカメラを追加し、各フレームで scene.render() を呼び出します。また、画像サイズを 800 × 600 ピクセルに設定し、PNG 出力形式を使用します。カメラを固定したままにすることで、フレーム間の違いをより簡単に検査できます。
The Aspose.3D scene-rendering guide は、3Dビューを画像として保存する方法を示しています。アニメーションシーケンスの場合、各画像が意図したタイムスタンプを反映しているか確認してください。連続するフレームが同じポーズを示す場合、レンダリングパスが現在のアニメーション状態を使用しているかどうかをチェックしてください。
各 PNG フレームに一貫した名前を付ける
frame_0000.png パターンは、ファイル名でソートしたときに画像の順序を保ちます。プレビューサムネイルの生成や、出力を別の画像シーケンスやビデオワークフローに渡すのに適しています。このスクリプトはビデオやアニメーション GIF を作成しません。
スクリプトは、すべての出力ファイルがバイト単位で同一であるかどうかを警告するために、ファイルハッシュも比較します。ハッシュが異なるだけでは、アニメーションが正しくレンダリングされたことを証明するものではありません。代表的なフレームを並べて確認してください。
無料の一時ライセンスを取得する
Aspose.3D for Python via .NET を使用して GLB および GLTF アニメーションフレームを評価制限なしでレンダリングするために、30 日間の無料一時ライセンスをリクエストできます。Python アプリケーションでライセンスを適用するには、Aspose.3D ライセンス ガイド に従ってください。
無料学習リソース
以下のリソースを参照して、アニメーション化された 3D モデルの読み込み、アニメーションクリップの操作、そして Aspose.3D for Python via .NET を使用した 3D シーンのレンダリングについて詳しく学びましょう:
- Aspose.3D for Python Developer Guide – Python で 3D モデルを読み込み、変更、アニメーション化、レンダリングする方法を学びます。
- Render 3D Scenes to Images – カメラの設定方法と、3D シーンを画像ファイルとしてレンダリングする方法を学びます。
- Aspose.3D Python API Reference – アニメーションクリップ、シーンレンダリング、カメラ、3D ファイル処理に関するクラスとメソッドを調べます。
- Free Online 3D Applications – 対応する 3D モデルをブラウザー上で直接表示、変換、処理します。
- Aspose.3D Tutorials and Articles – GLB/GLTF アニメーション、キーフレーム評価、その他の 3D 処理タスクをカバーする実践的な Python チュートリアルを見つけられます。
結論
アニメーションタイムラインをサンプリングし、選択した各タイムスタンプでシーンをレンダリングすることで、フレーム画像を生成できます。番号付き PNG を使用してサムネイルを作成したり、ポーズを比較したり、別のツール用の画像シーケンスを準備したりします。画像ではなく数値のアニメーション値が必要な場合は、キーフレーム評価チュートリアル を参照してください。レンダリングの問題については、Aspose.3D support forum を訪れてください。
