Đánh giá các hoạt ảnh trong tệp GLB hoặc GLTF cho phép bạn kiểm tra cách các đối tượng 3D di chuyển, quay và thay đổi kích thước theo thời gian mà không cần render cảnh. Bạn có thể sử dụng cách tiếp cận này để phân tích dữ liệu hoạt ảnh, xác minh các chuyển động, hoặc xuất các biến đổi để xử lý tiếp theo. Trong hướng dẫn này, bạn sẽ tải mô hình GLB có hoạt ảnh, kiểm tra các clip của nó, đánh giá năm thời điểm, và xuất các biến đổi của nút sang CSV.

Tải và đánh giá các hoạt ảnh GLB trong Python

Một đoạn hoạt hình chứa dữ liệu hoạt hình liên kết với một cảnh. Thời gian bắt đầu và kết thúc của nó xác định khoảng thời gian bạn có thể đánh giá. Quy trình làm việc là tải mô hình, chọn một đoạn hoạt hình, áp dụng nó tại các thời điểm cụ thể, kiểm tra các nút cảnh và xuất các biến đổi của chúng.

Cài đặt Aspose.3D for Python via .NET

Cài đặt Aspose.3D for Python via .NET, cung cấp API đánh giá hoạt ảnh được sử dụng ở đây:

pip install aspose-3d==26.10.0

Xem tài liệu cài đặt để biết thêm chi tiết.

Đánh giá hoạt ảnh và xuất các biến đổi nút

Ví dụ mã sau đánh giá đoạn hoạt ảnh đầu tiên tại năm thời điểm cách đều nhau và lưu dịch chuyển, quay và tỷ lệ cục bộ của mỗi nút vào animation_transforms.csv.

import csv
import aspose.threed as a3d

INPUT_FILE = "animated_model.glb"
OUTPUT_FILE = "animation_transforms.csv"
FRAME_COUNT = 5

def get_nodes(root):
    """Recursively collect all nodes in the scene."""
    nodes = [root]

for child in root.child_nodes:
        nodes.extend(get_nodes(child))

return nodes

# Load the animated model
scene = a3d.Scene.from_file(INPUT_FILE)

# Retrieve animation clips
clips = list(scene.animation_clips)

if not clips:
    raise RuntimeError("No animation clips found.")

print(f"Found {len(clips)} animation clip(s).")

for i, item in enumerate(clips):
    print(
        f"{i}: {item.name} "
        f"({item.start:.3f} to {item.stop:.3f} seconds)"
    )

# Select the first clip and collect scene nodes
clip = clips[0]
nodes = get_nodes(scene.root_node)

print(f"\nEvaluating: {clip.name}")
print(f"Scene nodes: {len(nodes)}")

records = []

for i in range(FRAME_COUNT):
    time = float(
        clip.start +
        (clip.stop - clip.start) * i / (FRAME_COUNT - 1)
    )

# Apply animation at the requested time
    clip.apply_to(time)

print(f"\nTimestamp: {time:.3f}s")

for index, node in enumerate(nodes):
        transform = node.transform

translation = str(transform.translation)
        rotation = str(transform.rotation)
        scaling = str(transform.scaling)

records.append([
            time,
            index,
            node.name or "(unnamed)",
            translation,
            rotation,
            scaling
        ])

print(
            f"  {node.name or '(unnamed)'}: "
            f"position={translation}, "
            f"rotation={rotation}"
        )

# Write evaluated transformations to CSV
with open(
    OUTPUT_FILE, "w", newline="", encoding="utf-8"
) as file:
    writer = csv.writer(file)

writer.writerow([
        "Time",
        "Node Index",
        "Node Name",
        "Translation",
        "Rotation",
        "Scaling"
    ])

writer.writerows(records)

print(f"\nSaved animation data to {OUTPUT_FILE}")

Cách hoạt động của việc đánh giá hoạt ảnh

Tải cảnh GLB và truy xuất các clip của nó

Scene.from_file() tải mô hình GLB hoặc GLTF. Bộ sưu tập scene.animation_clips cung cấp các clip có sẵn:

scene = a3d.Scene.from_file("animated_model.glb")
clips = list(scene.animation_clips)

Mỗi clip cung cấp một tên và một khoảng thời gian tính bằng giây thông qua name, start và stop. Xem Tham khảo API AnimationClip.

Áp dụng hoạt ảnh tại các thời gian cụ thể

Hoạt động trung tâm là clip.apply_to(time). Đối với đoạn clip mẫu, có thời lượng khoảng 3.708 giây, năm dấu thời gian là:

MẫuThời gian (giây)
10.000
20.927
31.854
42.781
53.708

Bạn có thể thay đổi FRAME_COUNT để thu thập thêm mẫu. Những mẫu này là các trạng thái hoạt ảnh được đánh giá, không phải các khung hình ảnh đã được render.

Đọc dịch chuyển, quay và co giãn

Sau khi áp dụng clip, script duyệt qua tất cả các nút cảnh và đọc:

  • transform.translation: vị trí cục bộ của nút.
  • transform.rotation: vòng quay cục bộ của nút.
  • transform.scaling: tỉ lệ cục bộ của nút.

Đây là biến đổi cục bộ, không nhất thiết là tọa độ không gian toàn cục. Các biến đổi của nút cha cũng ảnh hưởng đến vị trí cuối cùng của một nút trong cảnh. Các nút không có hoạt ảnh có thể giữ nguyên các giá trị tại mỗi dấu thời gian.

Đầu ra CSV từ hoạt ảnh

Script tạo ra animation_transforms.csv. Đối với mẫu được cung cấp, console bắt đầu với:

Found 1 animation clip(s).
0: Animation_1 (0.000 to 3.708 seconds)

Evaluating: Animation_1

CSV chứa một hàng cho mỗi nút cảnh tại mỗi thời gian mẫu và các cột sau:

CộtMô tả
TimeDấu thời gian đánh giá tính bằng giây
Node IndexChỉ mục của nút trong quá trình duyệt đệ quy
Node NameTên của nút cảnh
TranslationVị trí cục bộ tại thời điểm
RotationXoay cục bộ tại thời điểm
ScalingTỷ lệ cục bộ tại thời điểm

Bạn có thể mở tệp CSV trong một ứng dụng bảng tính hoặc phân tích nó bằng Python để so sánh các phép biến đổi trong toàn bộ clip.

Những điều cần kiểm tra khi đánh giá hoạt ảnh

Nhiều đoạn clip. Ví dụ này đánh giá clips[0]. Để đánh giá một hoạt ảnh khác, chọn một chỉ mục khác hoặc lấy một đoạn clip theo tên bằng cách sử dụng scene.get_animation_clip(name).

Độ phân giải mẫu. Năm dấu thời gian cung cấp một cái nhìn tổng quan cơ bản, nhưng có thể bỏ lỡ chuyển động nhanh. Tăng FRAME_COUNT hoặc chọn các thời điểm cụ thể để kiểm tra chi tiết hơn.

Khung xương và các mục morph. Không phải tất cả các hiệu ứng hoạt hình đều xuất hiện dưới dạng thay đổi trong việc dịch chuyển, quay hoặc co giãn cục bộ của một nút. Quy trình làm việc CSV này không nắm bắt mọi loại biến dạng khung xương hoặc morph-target.

Phụ thuộc GLTF. Các tệp .gltf dựa trên văn bản có thể tham chiếu đến các bộ đệm và kết cấu bên ngoài. Giữ các tệp này ở các đường dẫn tương đối dự kiến của chúng.

Đánh giá các hoạt ảnh GLB có cần GPU không?

Ví dụ này không gọi Scene.render() hoặc backend render Vulkan. Nó đánh giá các thuộc tính hoạt hình và ghi dữ liệu CSV thay vì tạo hình ảnh. Việc render Aspose.3D có các yêu cầu phần cứng, không áp dụng cho quy trình chỉ sử dụng CSV của ví dụ này.

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í trong 30 ngày để đánh giá 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ề cách làm việc với mô hình 3D, hoạt ảnh và các định dạng tệp được hỗ trợ bằng Aspose.3D for Python via .NET:

Kết luận

Aspose.3D for Python via .NET 26.10 cho phép bạn đánh giá các đoạn hoạt hình GLB và GLTF tại các thời điểm đã chọn bằng AnimationClip.apply_to(). Bằng cách đọc các biến đổi của nút sau mỗi lần đánh giá, bạn có thể kiểm tra chuyển động và xuất dữ liệu hoạt hình có cấu trúc mà không cần render mô hình. Điều chỉnh ví dụ để đánh giá các đoạn bổ sung, tăng tần suất lấy mẫu, hoặc phân tích các nút đã chọn.

Đọc thêm