Một mô hình GLB hoặc GLTF có hoạt ảnh lưu trữ dữ liệu hình học và hoạt ảnh thay vì một thư mục các hình ảnh đã sẵn sàng. Để tạo thumbnail hoặc chuỗi khung hình, bạn cần đánh giá hoạt ảnh của mô hình tại các thời điểm cụ thể và render mỗi cảnh kết quả thành một hình ảnh. Hướng dẫn này giải thích cách render các khung hình hoạt ảnh GLB trong Python bằng cách sử dụng Aspose.3D for Python via .NET. Bạn sẽ tải một mô hình có hoạt ảnh, chọn một clip, lấy mẫu timeline của nó, và lưu mỗi khung dưới dạng hình PNG có số thứ tự. Bạn có thể sử dụng các hình ảnh kết quả làm bản xem trước mô hình hoặc làm đầu vào cho một quy trình làm việc chuỗi hình ảnh riêng biệt.
Cài đặt Aspose.3D for Python via .NET
Cài đặt gói bằng pip:
pip install aspose-3d
Bạn cũng sẽ cần:
- Một tệp
.glbhoạt hình hoặc một tệp.gltfkèm theo các bộ đệm và kết cấu của nó. - Một môi trường render tương thích với yêu cầu phần cứng của Aspose.3D. Xem yêu cầu hệ thống.
- Vị trí camera giữ cho đối tượng hoạt hình luôn trong khung nhìn suốt thời gian mẫu.
Kết xuất một đoạn hoạt hình thành các khung PNG
Lưu đoạn mã sau dưới tên render_glb_animation_frames.py và chạy nó từ thư mục chứa 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()
Chạy nó với:
python render_glb_animation_frames.py
Kết quả mong đợi: một thư mục frames chứa các hình ảnh như frame_0000.png, frame_0001.png, và frame_0002.png. Khi trình render ghi lại các trạng thái hoạt ảnh đã áp dụng một cách chính xác, các hình ảnh sẽ hiển thị mô hình tại các điểm liên tiếp trong hoạt ảnh của nó.
Cách hoạt động của mã render khung
Tải cảnh và chọn một đoạn hoạt ảnh
Phương thức Scene.from_file() mở mô hình, trong khi scene.animation_clips cung cấp quyền truy cập vào các clip hoạt hình mà nó chứa. Ví dụ sử dụng clip đầu tiên và đọc các thuộc tính start và stop của nó để xác định phạm vi thời gian. Một mô hình không có clip hoạt hình không thể tạo ra chuỗi hoạt hình bằng phương pháp này.
Để biết thêm chi tiết về việc chọn clip và chuyển đổi nút, xem Load and Evaluate GLB/GLTF Animations in Python.
Lấy mẫu dòng thời gian theo các khoảng thời gian đều đặn
Kịch bản sử dụng năm mẫu mỗi giây. Nếu đoạn video kéo dài hai giây, nó sẽ yêu cầu mười khung hình tại các thời điểm từ 0.0 đến 1.8 giây khi đoạn video bắt đầu từ không. Việc loại trừ điểm cuối chính xác giúp tránh tạo ra một khung hình cuối cùng dư thừa cho các hoạt ảnh vòng lại về tư thế ban đầu.
Phương thức clip.apply_to(timestamp) áp dụng đoạn hoạt ảnh đã chọn tại mỗi dấu thời gian. Không giống như việc đánh giá một chuỗi keyframe đơn lẻ, bước này nhằm cập nhật cảnh hoạt hình trước khi hình ảnh được kết xuất.
Kết xuất cảnh đã cập nhật từ một camera
Ví dụ này thêm một camera ở vị trí cố định và gọi scene.render() cho mỗi khung hình. Nó cũng đặt kích thước ảnh 800 × 600 pixel và định dạng xuất PNG. Giữ camera cố định giúp việc kiểm tra sự khác biệt giữa các khung hình dễ dàng hơn.
The Aspose.3D hướng dẫn render cảnh cho thấy cách lưu một góc nhìn 3D dưới dạng hình ảnh. Đối với các chuỗi hoạt hình, hãy xác minh rằng mỗi hình ảnh phản ánh thời điểm mong muốn. Nếu các khung liên tiếp hiển thị cùng một tư thế, hãy kiểm tra xem đường render có đang sử dụng trạng thái hoạt hình hiện tại hay không.
Đặt tên mỗi khung PNG một cách nhất quán
Mẫu frame_0000.png giữ thứ tự của các hình ảnh khi sắp xếp theo tên tệp. Nó phù hợp để tạo các hình thu nhỏ xem trước hoặc chuyển đầu ra sang một quy trình làm việc chuỗi hình ảnh hoặc video riêng biệt. Script không tạo video hoặc GIF hoạt hình.
Kịch bản cũng so sánh các hàm băm của tệp để cảnh báo khi tất cả các tệp đầu ra có cùng byte. Các hàm băm khác nhau không tự nó chứng minh rằng hoạt ảnh được render đúng; hãy kiểm tra các khung hình đại diện cạnh nhau.
Nhận Giấy phép Tạm thời Miễn phí
Bạn có thể yêu cầu giấy phép tạm thời miễn phí 30 ngày để render các khung hình hoạt ảnh GLB và GLTF bằng Aspose.3D for Python via .NET mà không có giới hạn đánh giá. Để áp dụng giấy phép trong ứng dụng Python của bạn, hãy làm theo hướng dẫn cấp phép Aspose.3D.
Tài Nguyên Học Tập Miễn Phí
Khám phá các tài nguyên sau để tìm hiểu thêm về việc tải mô hình 3D hoạt hình, làm việc với các clip hoạt ảnh và kết xuất các cảnh 3D bằng Aspose.3D for Python via .NET:
- Aspose.3D for Python Developer Guide – Tìm hiểu cách tải, chỉnh sửa, tạo hoạt ảnh và render các mô hình 3D trong Python.
- Render 3D Scenes to Images – Tìm hiểu cách cấu hình camera và render các cảnh 3D thành tệp hình ảnh.
- Aspose.3D Python API Reference – Khám phá các lớp và phương thức cho các đoạn hoạt ảnh, render cảnh, camera và xử lý tệp 3D.
- Free Online 3D Applications – Xem, chuyển đổi và xử lý các mô hình 3D được hỗ trợ trực tiếp trong trình duyệt của bạn.
- Aspose.3D Tutorials and Articles – Tìm các hướng dẫn Python thực tế về hoạt ảnh GLB/GLTF, đánh giá keyframe và các nhiệm vụ xử lý 3D khác.
Kết luận
Bạn có thể tạo các hình ảnh khung bằng cách lấy mẫu từ dòng thời gian hoạt hình và render cảnh tại mỗi thời điểm đã chọn. Sử dụng các PNG được đánh số để tạo thumbnail, so sánh các tư thế, hoặc chuẩn bị một chuỗi hình ảnh cho công cụ khác. Nếu bạn cần các giá trị hoạt hình dạng số thay vì hình ảnh, hãy xem hướng dẫn đánh giá keyframe. Đối với các vấn đề render, hãy truy cập diễn đàn hỗ trợ Aspose.3D.
