โมเดลแอนิเมชันแบบ GLB หรือ GLTF จะเก็บข้อมูลเรขาคณิตและแอนิเมชันแทนที่จะเป็นโฟลเดอร์ของภาพที่เตรียมไว้แล้ว เพื่อสร้างภาพย่อหรือชุดเฟรม คุณต้องประเมินแอนิเมชันของโมเดลในช่วงเวลาที่กำหนดและเรนเดอร์แต่ละฉากที่ได้เป็นภาพ การสอนนี้อธิบายวิธี เรนเดอร์เฟรมแอนิเมชัน GLB ใน Python ด้วยการใช้ Aspose.3D for Python via .NET. คุณจะโหลดโมเดลแอนิเมชัน, เลือกคลิป, ตัวอย่างไทม์ไลน์, และบันทึกแต่ละเฟรมเป็นภาพ PNG ที่มีหมายเลข คุณสามารถใช้ภาพที่ได้เป็นตัวอย่างโมเดลหรือเป็นอินพุตสำหรับกระบวนการลำดับภาพแยกต่างหาก.
ติดตั้ง Aspose.3D for Python via .NET
ติดตั้ง แพ็คเกจ โดยใช้ pip:
pip install aspose-3d
คุณจะต้องมีเพิ่มเติม:
- ไฟล์
.glbแบบเคลื่อนไหวหรือไฟล์.gltfพร้อมบัฟเฟอร์และเทกเจอร์ที่เกี่ยวข้อง - สภาพแวดล้อมการเรนเดอร์ที่เข้ากันได้กับข้อกำหนดฮาร์ดแวร์ของ Aspose.3D ดูที่ ข้อกำหนดระบบ
- ตำแหน่งกล้องที่ทำให้วัตถุที่เคลื่อนไหวอยู่ในมุมมองตลอดช่วงเวลาที่สุ่มตัวอย่าง
เรนเดอร์คลิปแอนิเมชันเป็นเฟรม 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. เมื่อเรนเดอร์จับสถานะการเคลื่อนไหวที่ใช้ได้อย่างถูกต้อง ภาพจะแสดงโมเดลในจุดต่อเนื่องของการเคลื่อนไหวของมัน.
วิธีการทำงานของโค้ดการเรนเดอร์เฟรม
โหลดฉากและเลือกคลิปแอนิเมชัน
เมธอด Scene.from_file() เปิดโมเดล, ในขณะที่ scene.animation_clips ให้การเข้าถึงคลิปแอนิเมชันที่มันมีอยู่ ตัวอย่างใช้คลิปแรกและอ่านคุณสมบัติ start และ stop เพื่อกำหนดช่วงเวลา โมเดลที่ไม่มีคลิปแอนิเมชันไม่สามารถสร้างลำดับแอนิเมชันด้วยเมธอดนี้ได้
สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับการเลือกคลิปและการแปลงโหนด ดู Load and Evaluate GLB/GLTF Animations in Python
สุ่มไทม์ไลน์เป็นช่วงเวลาที่สม่ำเสมอ
สคริปต์ใช้การสุ่มตัวอย่างห้าครั้งต่อวินาที หากคลิปมีความยาวสองวินาที มันจะร้องขอสิบเฟรมที่ช่วงเวลา ตั้งแต่ 0.0 ถึง 1.8 วินาทีเมื่อคลิปเริ่มที่ศูนย์ การละเว้นจุดสิ้นสุดที่แน่นอนช่วยหลีกเลี่ยงการสร้างเฟรมสุดท้ายที่ซ้ำซ้อนสำหรับแอนิเมชันที่วนกลับไปยังท่าทางเริ่มต้น
เมธอด clip.apply_to(timestamp) จะนำคลิปแอนิเมชันที่เลือกไปใช้ที่แต่ละ timestamp. ไม่เหมือนกับการประเมินลำดับ keyframe เดียว ขั้นตอนนี้มีจุดประสงค์เพื่ออัปเดตฉากที่แอนิเมตก่อนที่ภาพจะถูกเรนเดอร์.
เรนเดอร์ฉากที่อัปเดตจากกล้องหนึ่งตัว
ตัวอย่างนี้เพิ่มกล้องที่ตำแหน่งคงที่และเรียก scene.render() สำหรับแต่ละเฟรม นอกจากนี้ยังตั้งขนาดภาพเป็น 800 × 600 พิกเซลและรูปแบบเอาต์พุตเป็น PNG การทำให้กล้องคงที่ทำให้การเปรียบเทียบความแตกต่างระหว่างเฟรมง่ายขึ้น
Aspose.3D scene-rendering guide แสดงวิธีบันทึกมุมมอง 3D เป็นภาพ. สำหรับลำดับภาพเคลื่อนไหว, ตรวจสอบว่าภาพแต่ละภาพสะท้อนเวลาที่ตั้งใจไว้. หากเฟรมต่อเนื่องแสดงท่าทางเดียวกัน, ตรวจสอบว่าเส้นทางการเรนเดอร์กำลังใช้สถานะแอนิเมชันปัจจุบันหรือไม่.
ตั้งชื่อแต่ละเฟรม PNG อย่างสม่ำเสมอ
frame_0000.png รูปแบบช่วยให้ภาพเรียงลำดับตามชื่อไฟล์ได้อย่างถูกต้อง เหมาะสำหรับการสร้างภาพตัวอย่างขนาดเล็กหรือส่งผลลัพธ์ไปยังกระบวนการแยกภาพต่อเนื่องหรือวิดีโอ สคริปต์นี้ไม่ได้สร้างวิดีโอหรือ GIF ที่เคลื่อนไหว.
สคริปต์ยังเปรียบเทียบแฮชของไฟล์เพื่อเตือนเมื่อไฟล์ผลลัพธ์ทั้งหมดมีไบต์เดียวกัน แฮชที่แตกต่างกันไม่ได้พิสูจน์โดยตัวเองว่าแอนิเมชันถูกเรนเดอร์อย่างถูกต้อง; ตรวจสอบเฟรมตัวอย่างข้างเคียงกัน.
รับใบอนุญาตชั่วคราวฟรี
คุณสามารถ ขอรับใบอนุญาตชั่วคราวฟรี 30 วัน เพื่อเรนเดอร์เฟรมแอนิเมชัน GLB และ GLTF โดยใช้ Aspose.3D for Python via .NET โดยไม่มีข้อจำกัดการประเมินผล. เพื่อใช้ใบอนุญาตในแอปพลิเคชัน Python ของคุณ ให้ทำตาม คู่มือการให้ใบอนุญาต Aspose.3D.
แหล่งเรียนรู้ฟรี
สำรวจแหล่งข้อมูลต่อไปนี้เพื่อเรียนรู้เพิ่มเติมเกี่ยวกับการโหลดโมเดล 3D แบบเคลื่อนไหว, การทำงานกับคลิปแอนิเมชัน, และการเรนเดอร์ฉาก 3D โดยใช้ Aspose.3D for Python via .NET:
- Aspose.3D for Python Developer Guide – เรียนรู้วิธีการโหลด, แก้ไข, ทำแอนิเมชัน และเรนเดอร์โมเดล 3D ใน Python.
- Render 3D Scenes to Images – เรียนรู้วิธีการกำหนดค่ากล้องและเรนเดอร์ฉาก 3D เป็นไฟล์รูปภาพ.
- Aspose.3D Python API Reference – สำรวจคลาสและเมธอดสำหรับคลิปแอนิเมชัน, การเรนเดอร์ฉาก, กล้อง, และการประมวลผลไฟล์ 3D.
- Free Online 3D Applications – ดู, แปลง และประมวลผลโมเดล 3D ที่รองรับโดยตรงในเบราว์เซอร์ของคุณ.
- Aspose.3D Tutorials and Articles – ค้นหาบทแนะนำ Python ที่เป็นประโยชน์ซึ่งครอบคลุมการแอนิเมชัน GLB/GLTF, การประเมินคีย์เฟรม, และงานประมวลผล 3D อื่น ๆ.
สรุป
คุณสามารถสร้างภาพเฟรมโดยการสุ่มตัวอย่างไทม์ไลน์ของแอนิเมชันและเรนเดอร์ฉากในแต่ละช่วงเวลาที่เลือก ใช้ PNG ที่มีหมายเลขเพื่อสร้างภาพย่อ, เปรียบเทียบท่าทาง, หรือเตรียมลำดับภาพสำหรับเครื่องมืออื่น หากคุณต้องการค่าตัวเลขของแอนิเมชันแทนภาพ ให้ดูที่ บทแนะนำการประเมินคีย์เฟรม. สำหรับปัญหาการเรนเดอร์ ให้เยี่ยมชม ฟอรั่มสนับสนุน Aspose.3D.
