การทำแอนิเมชันแบบคีย์เฟรมกำหนดว่าค่าหนึ่งเปลี่ยนแปลงอย่างไรตามเวลา ตัวอย่างเช่น คุณสามารถระบุตำแหน่งที่วัตถุควรอยู่ในจุดเริ่มต้นของแอนิเมชันและตำแหน่งที่มันควรเคลื่อนต่อไป แล้วคำนวณตำแหน่งของมันในจุดใดก็ได้ระหว่างคีย์เฟรมเหล่านั้น สิ่งนี้มีประโยชน์สำหรับการตรวจสอบโค้งการเคลื่อนที่ การตรวจสอบเวลาแอนิเมชัน และการส่งออกค่าที่สุ่มตัวอย่างเพื่อการวิเคราะห์ต่อไป Aspose.3D for Python via .NET ทำให้คุณสามารถสุ่มตัวอย่างลำดับคีย์เฟรมในช่วงเวลาที่กำหนดโดยไม่ต้องเรนเดอร์ฉาก 3D ในบทเรียนนี้ คุณจะสร้างแอนิเมชันตำแหน่งแบบง่าย ประเมินค่าที่ผ่านการอินเตอร์โพเลตทุกครึ่งวินาที และบันทึกผลลัพธ์ลงในไฟล์ CSV.

ติดตั้ง Aspose.3D for Python

ติดตั้ง Aspose.3D for Python via .NET เวอร์ชัน 26.10 โดยใช้ pip:

pip install aspose-3d==26.10.0

ตัวอย่างนี้ใช้เฉพาะโมดูล aspose.threed.animation และโมดูล csv ที่มาพร้อมกับ Python เท่านั้น คุณไม่จำเป็นต้องมีไฟล์ GLB/GLTF หรือกราฟิกการ์ดที่รองรับ Vulkan เนื่องจากโค้ดทำการคำนวณแอนิเมชันแทนการเรนเดอร์ภาพ.

สำหรับข้อมูลแพลตฟอร์มและการติดตั้ง ให้ดูเอกสาร Aspose.3D for Python documentation.

สร้างและประเมินการเคลื่อนไหวแบบคีย์เฟรมใน Python

ตัวอย่างนี้จำลองตำแหน่ง X ของวัตถุ ตำแหน่งเริ่มที่ 0, เพิ่มขึ้นเป็น 10 หน่วยหลังจากสองวินาที, และกลับไปที่ 0 หลังจากห้าวินาที.

เวลา (วินาที)ตำแหน่ง Xการกระทำ
00เริ่มต้น
210ถึงตำแหน่งสูงสุด
50กลับสู่จุดเริ่มต้น

ค่าระหว่างคีย์เฟรมเหล่านี้ถูกคำนวณโดยใช้ การอินเทอร์โพเลชันเชิงเส้น. ตัวอย่างสร้างโค้งแอนิเมชันเชิงตัวเลขแบบสแตนด์อโลน; ไม่ได้แนบลำดับนี้กับอ็อบเจกต์ฉากจริง.

ตัวอย่างโค้ด Python แบบสมบูรณ์

สคริปต์ต่อไปนี้สร้าง KeyframeSequence เพิ่มคีย์เฟรมสามคีย์เฟรม ประเมินเวลา timestamp สิบหนึ่งค่า ตรวจสอบค่าคีย์เฟรม และส่งออกผลลัพธ์ไปยัง 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.")

ทำความเข้าใจวิธีการประเมินค่า keyframe

กำหนดลำดับของ keyframe

คลาส KeyframeSequence แสดงถึงโค้งเชิงตัวเลขที่มีค่าที่กำหนดในช่วงเวลาที่เฉพาะเจาะจง บรรทัดนี้สร้างลำดับที่ชื่อ PositionX:

sequence = KeyframeSequence("PositionX")

ชื่อช่วยระบุลำดับ ไม่ได้ทำการผูกลำดับกับเมชหรือคุณสมบัติโหนดโดยอัตโนมัติ สำหรับรายละเอียดเพิ่มเติม ดูที่ KeyframeSequence API reference.

เพิ่มคีย์เฟรมด้วยการแทรกเชิงเส้น

แต่ละครั้งที่เรียก add() จะระบุ timestamp, ค่า value, และประเภทของการอินเทอร์โพเลชัน:

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 บอกให้ลำดับคำนวณค่ากลางอย่างสัดส่วนระหว่างคีย์เฟรม ผลลัพธ์คือค่าจะเพิ่มอย่างต่อเนื่องจาก 0 ถึง 10 ในช่วงสองวินาทีแรกและลดลงอย่างต่อเนื่องจาก 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 คือ timestamp ที่ร้องขอ, t0 และ t1 คือเวลาของ keyframe ที่ล้อมรอบ, และ v0 และ v1 คือค่าที่สอดคล้องกันของพวกมัน.

ระหว่างสองคีย์เฟรมแรก การประเมินค่าในเวลา 1.5 วินาทีให้ผลลัพธ์เป็น:

[ v(1.5) = 0 + \frac{1.5 - 0}{2 - 0}(10 - 0) = 7.5 ]

คุณไม่จำเป็นต้องทำสูตรนี้ด้วยตนเอง KeyframeSequence.evaluate() ทำการคำนวณตามการตั้งค่าการอินเทอร์โพเลชันของลำดับ

ตรวจสอบค่าที่ประเมิน

สำหรับ keyframes ตัวอย่าง ผลลัพธ์คือ:

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 ตรวจสอบค่าที่ timestamp ของ keyframe ที่กำหนดไว้สามค่า. พวกเขาใช้ความคลาดเคลื่อนเล็กน้อยแทนการเปรียบเทียบ floating-point อย่างตรงไปตรงมา.

ค่าที่เปลี่ยนแปลงระหว่างคีย์เฟรมยืนยันว่าลำดับกำลังถูกสุ่มตัวอย่างตลอดช่วงเวลาของมัน.

ส่งออกค่าคีย์เฟรมเป็น CSV

หลังจากประเมินลำดับแล้ว สคริปต์จะเขียนเวลาและตำแหน่ง X ที่คำนวณได้ลงใน keyframe_animation.csv โดยใช้โมดูล csv ของ Python ไฟล์จะเริ่มต้นด้วย:

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 วินาที. ค่าที่อยู่นอกกรอบคีย์ที่กำหนดจะถูกควบคุมโดยพฤติกรรมการขยายล่วงหน้าและหลัง ซึ่งแยกจากการแทรกค่าระหว่างกรอบคีย์.

เลือกการแทรกค่าตามความตั้งใจ การแทรกค่าตามเส้นตรงทำให้เกิดการเปลี่ยนแปลงคงที่ในแต่ละส่วน การแทรกค่าแบบอื่นอาจสร้างลักษณะการเคลื่อนที่ที่แตกต่างและอาจต้องการการตั้งค่า keyframe เพิ่มเติม ดูที่ อ้างอิง API การเคลื่อนไหว ก่อนเปลี่ยนโหมดการแทรกค่า

แยกการประเมินค่าแอนิเมชันจากแอนิเมชันของฉาก. โค้ดจะประเมินเส้นโค้งเชิงตัวเลขเท่านั้น. มันไม่ได้อัปเดตตำแหน่ง X ของโหนดในฉากหรือสร้างแอนิเมชันที่เรนเดอร์. เพื่อย้ายวัตถุ 3 มิติ ลำดับต้องเชื่อมต่อกับคุณสมบัติที่ทำแอนิเมชันที่เหมาะสมในฉาก.

ไม่จำเป็นต้องเรนเดอร์ด้วย GPU ไม่มีการเรียก Scene.render() หรือ backend การเรนเดอร์ใด ๆ นี้ทำให้ตัวอย่างนี้เหมาะสำหรับการทำงานกับค่าการเคลื่อนไหวบนเครื่องที่ไม่มี GPU ที่รองรับ Vulkan.

รับใบอนุญาตชั่วคราวฟรี

คุณสามารถ ขอรับใบอนุญาตชั่วคราวฟรี 30 วัน เพื่อประเมิน Aspose.3D for Python via .NET โดยไม่มีข้อจำกัดของรุ่นทดลอง. ทำตาม คู่มือการให้ใบอนุญาต Aspose.3D เพื่อใช้ใบอนุญาตในแอปพลิเคชันของคุณ.

แหล่งเรียนรู้ฟรี

สำรวจแหล่งข้อมูลเหล่านี้เพื่อดำเนินการทำงานกับการสร้างแอนิเมชัน 3D และกระบวนการประมวลผลไฟล์ใน Python:

  • Aspose.3D for Python Developer Guide – เอกสารสำหรับการโหลด, การสร้างและการประมวลผลฉาก 3D.
  • Aspose.3D Animation API Reference – คลาสสำหรับคีย์เฟรม, การแทรกค่า, คลิปแอนิเมชัน, และการผูกคุณสมบัติ.
  • Free Online 3D Applications – เครื่องมือแบบเบราว์เซอร์สำหรับงานไฟล์ 3D ที่รองรับ.
  • Aspose.3D Tutorials and Articles – ตัวอย่างเชิงปฏิบัติเพิ่มเติมสำหรับการทำงานกับรูปแบบ 3D.

สรุป

คุณสามารถใช้ KeyframeSequence.evaluate() ใน Aspose.3D for Python via .NET เพื่อคำนวณค่าการเคลื่อนไหวในช่วงเวลาที่กำหนดโดยไม่ต้องเรนเดอร์โมเดล ในตัวอย่างนี้ กรอบคีย์สามกรอบกำหนดโค้งตำแหน่ง X ในขณะที่ตัวประเมินคำนวณตำแหน่งกลางและส่งออกเป็น CSV เพื่อปรับตัวอย่าง ให้เปลี่ยนค่ากรอบคีย์หรือช่วงการสุ่มตัวอย่าง สำหรับการเคลื่อนไหวระดับโมเดล ขั้นตอนต่อไปคือผูกโค้งการเคลื่อนไหวกับคุณสมบัติของฉากและนำไปใช้กับวัตถุ

อ่านต่อ