LEVEL 3 · ระดับสูง
Constraint — ค่าที่ถูกเขียนทับหลังคุณคีย์ไปแล้ว
ถึงเวลาไขปริศนาที่ปลูกไว้ตั้งแต่บทที่ 1
สร้างกล่องหนึ่งใบ คีย์ตำแหน่งไว้ที่จุดกำเนิดชัด ๆ แล้วใส่ constraint ชนิด Copy Location ชี้ไปที่เป้าหมายที่ (7, 3, 2):
=== ก่อนใส่ constraint ===
ค่าใน property (box.location) : (0.0, 0.0, 0.0)
ตำแหน่งจริงหลังประเมิน (matrix_world) : (0.0, 0.0, 0.0)
=== หลังใส่ Copy Location -> Target(7, 3, 2) ===
ค่าใน property (box.location) : (0.0, 0.0, 0.0) ← ไม่ขยับเลยสักนิด
ตำแหน่งจริงหลังประเมิน (matrix_world) : (7.0, 3.0, 2.0) ← แต่ของไปอยู่โน่นแล้วนี่คือคำตอบ กล่องอยู่ที่ (7, 3, 2) จริง แต่ค่าที่คุณคีย์ไว้ยังเป็น (0, 0, 0) ครบถ้วนไม่ถูกแตะ
constraint ไม่แก้ค่าของคุณ มันทำงานทีหลัง บนผลลัพธ์ที่คำนวณเสร็จแล้ว
10.1 ทำไมนี่คือคำอธิบายของอาการยอดฮิต
อาการที่ทุกคนเคยเจอ: เลื่อนค่าใน N-panel แล้วของไม่ขยับ หรือคีย์ตำแหน่งไว้แล้วของดื้อไปอยู่ที่อื่น
เกือบทุกครั้งคำตอบคือมี constraint ตัวหนึ่งทำงานอยู่ท้ายสาย และมันชนะเสมอ เพราะมันได้คิวหลัง
สิ่งที่ควรทำเมื่อเจออาการนี้ ไม่ใช่การไล่ลบคีย์ แต่คือเปิดแท็บ Object Constraint Properties ดูว่ามีอะไรอยู่ในนั้น
10.2 ทำไมออกแบบให้ไม่เขียนทับ
เพราะถ้า constraint เขียนกลับลง property ค่าที่คุณตั้งใจคีย์จะถูกทำลายถาวรทันทีที่เปิดไฟล์ และคุณจะย้อนกลับไม่ได้เลย
การแยกสองชั้นนี้ออกจากกันทำให้ ปิด constraint แล้วของกลับไปที่เดิมทันที ซึ่งเป็นสิ่งที่ทำให้มันปลอดภัยพอจะใช้จริง
💡 อุปมา: ค่าที่คุณคีย์ = สิ่งที่คุณพิมพ์ลงในเอกสาร · constraint = ตัวกรองที่แสดงผลทับตอนพิมพ์ออกกระดาษ — ต้นฉบับไม่เคยเปลี่ยน จุดที่อุปมานี้ใช้ไม่ได้ คือ constraint ไม่ได้ทำงานแค่ตอน "พิมพ์ออก" มันทำงานทุกเฟรม และผลของมันเป็นข้อมูลที่ constraint ตัวถัดไปเอาไปใช้ต่อได้
10.3 ลำดับใน stack มีความหมาย
constraint หลายตัวบนวัตถุเดียวกันทำงานเรียงจากบนลงล่าง ตัวล่างรับผลของตัวบนมาแล้วทำต่อ สลับลำดับ = ได้ผลคนละอย่าง
นี่คือเหตุผลที่ constraint stack เป็น "รายการที่เรียงได้" ไม่ใช่ "กล่องติ๊กถูก"