1 อธิบาย
ถ้าเลื่อนทั้งภาพด้วย Transform ทุกอย่างจะขยับเท่ากัน เหมือนรูปถ่ายแผ่นเดียว แต่กล้องจริงที่เลื่อนข้างทำให้ของใกล้วิ่งเร็ว ของไกลวิ่งช้า ความต่างนี้คือ parallax และเป็นสิ่งที่ตาใช้บอกว่าฉากมีมิติ
2.5D คือการตัด plate เป็นชั้น (ท้องฟ้า เขา พื้นกลาง พื้นใกล้) แปะแต่ละชั้นบนการ์ดในระยะที่ถูก แล้วถ่ายด้วยกล้อง 3D การ์ดที่ไกลขึ้นต้องใหญ่ขึ้นตามระยะ ภาพตอนกล้องนิ่งจึงเหมือนเดิมทุกพิกเซล ต่างกันแค่ตอนกล้องขยับ
shift (px) = f_px · T / Z · f_px = 320 / tan(½ hFOV) ≈ 6222 ลงมือลอง
เปลี่ยนเป็น 2.5D แล้วตั้งระยะการ์ดใกล้ กลาง และเขา ให้จุดสีทับวงส้ม (คลาดไม่เกิน 8%)
ดูแถบ “มองจากด้านบน” ใต้ภาพ: วงส้มบอกความลึกจริงของแต่ละจุด
3 เจาะลึก
ทำไมของใกล้วิ่งเร็วกว่า
กล้อง pinhole วางจุดที่ลึก Z ไว้บนจอที่ f·X/Z เมื่อกล้องเลื่อนข้าง T จุดนั้นเลื่อนบนจอ f·T/Z ตัว Z อยู่ใต้เส้นเศษส่วน ของที่ลึกกว่าจึงเลื่อนน้อยกว่าเสมอ
กล้อง plate ของเรา (35 มม. บนเซนเซอร์ 36 มม.) มี f ≈ 622 px ในเฟรมกว้าง 640 เลื่อน 1 ม. หินที่ลึก 10 ม. วิ่ง 62 px ภูเขาที่ราว 89 ม. วิ่งแค่ราว 7 px
| ความลึก | เลื่อนต่อ 1 ม. | ตัวอย่างใน plate |
|---|---|---|
| 7 m | 89 px | หินใกล้ซ้ายล่าง |
| 18 m | 35 px | หินซ้ายกลาง |
| 89 m | 7 px | เขาลูกหน้า |
| ∞ | 0 px | ท้องฟ้า |
การ์ดไกลต้องใหญ่ขึ้นตามระยะ
ถ้าย้ายการ์ดออกไปไกลสองเท่าโดยไม่ขยาย มันจะดูเล็กลงครึ่งหนึ่งในกล้อง ต้องขยายการ์ดตามระยะ (ขนาด ∝ ระยะ) ให้เต็มกรอบภาพเท่าเดิม ภาพตอนกล้องนิ่งจึงเหมือน plate ทุกพิกเซล
กฎนี้ทำให้การวางระยะการ์ด “ไม่เสียอะไร” ตอนกล้องนิ่ง ระยะจะมีผลก็ต่อเมื่อกล้องเปลี่ยนตำแหน่งเท่านั้น จึงต้องเช็กโดยเลื่อนกล้องข้างหรือดันเข้าเสมอ
- 1แยกชั้นจาก depth หรือ roto
- 2premult แต่ละชั้น
- 3วางการ์ดที่ระยะจริง + ขยาย
- 4ขยับกล้องเช็ก
ขอบชั้นและ overscan
ขอบชั้นที่ตัดแข็งจะเห็นเป็นเส้นตอนกล้องขยับ ใน figure ชั้นใกล้จะจางออกที่ขอบด้านไกล และชั้นหลังทึบเต็มอยู่ใต้ส่วนที่จางนั้น ภาพตอนนิ่งจึงไม่มีขอบดำหรือรอยต่อ
เมื่อการ์ดใกล้เลื่อนเยอะ ขอบเฟรมของมันจะโผล่เข้ามา ต้องมีภาพเผื่อเกินขอบ (overscan) ใน figure ใช้การยืดพิกเซลขอบออกไป ซึ่งพอใช้ได้แค่เมื่อกล้องเลื่อนน้อยหรือ texture แทบไม่มีลาย อย่างพื้นทรายนี้ ถ้าเลื่อนมากหรือมีลวดลายชัด ต้อง paint เผื่อจริง (ดู P5)
การ์ดอยู่ตรงไหน ให้ความลึกของมันบอก ไม่ใช่ความรู้สึก
เมื่อไรการ์ดไม่พอ
การ์ดหนึ่งใบมีความลึกเดียว พื้นที่ยาวจาก 5 ม. ถึง 40 ม. บนการ์ดใบเดียวจะเลื่อนเท่ากันทั้งแผ่น ถ้ากล้องเลื่อนมาก ขอบใกล้กับขอบไกลของพื้นจะดูผิด ทางแก้คือแยกชั้นย่อยเพิ่ม หรือใช้ geometry ที่เอียงตามพื้นจริงแล้วฉายภาพลงไป (บทถัดไป)
4 ในงานจริง
ทำใน Nuke
- แยกชั้นด้วย Roto หรือ key จาก depth แล้ว Premult แต่ละชั้น
- ต่อแต่ละชั้นเข้า Card ของตัวเอง วางระยะตามความลึกจริงและขยายตามระยะ
- รวมการ์ดด้วย Scene แล้วต่อ ScanlineRender กับ Camera ที่ track มาหรือที่ animate เอง
- เช็กที่เฟรมนิ่งว่าภาพตรงกับ plate แล้วเล่นทั้งช็อตดู parallax
พลาดบ่อย → แก้ยังไง
- ✗ ย้ายการ์ดไปไกลแต่ไม่ขยาย แล้วแก้ขนาดด้วย Transform 2D✓ ขยายการ์ดตามระยะใน 3D ภาพนิ่งจะตรงเองและ parallax ถูก
- ✗ ตัดขอบชั้นแข็ง ๆ✓ ให้ขอบนุ่ม และให้ชั้นด้านหลังเต็มอยู่ใต้ขอบนั้น
- ✗ ตัดสินระยะการ์ดจากเฟรมนิ่ง✓ ระยะเห็นผลเฉพาะตอนกล้องขยับ เล่นช็อตหรือ scrub ทุกครั้ง
- ✗ ไม่มีภาพเผื่อขอบเฟรมของการ์ดใกล้✓ paint เผื่อขอบออกไปให้พอกับระยะที่กล้องเลื่อน การยืดพิกเซลขอบใช้ได้แค่เมื่อเลื่อนน้อยหรือ texture แทบไม่มีลาย (ดู P5)
เช็กก่อนส่งช็อต
- เฟรมนิ่งตรงกับ plate ต้นฉบับ
- การ์ดเรียงจากใกล้ไปไกลตามความลึกจริง
- ไม่มีขอบดำหรือเส้นรอยต่อระหว่างชั้นตอนกล้องขยับ
- ขอบเฟรมของการ์ดใกล้ไม่โผล่ตลอดช็อต
5 เช็กตัวเอง
กล้องเลื่อนข้าง 1 ม. หินที่ลึก 10 ม. เลื่อน 62 px ภูเขาที่ลึก 100 ม. จะเลื่อนประมาณเท่าไร
🔒 ตอบคำถามด้านบนก่อน แล้วการ์ดนี้จะเปิด
1. ย้ายการ์ดจาก 10 ม. ไป 20 ม. ต้องทำอะไรกับขนาดเพื่อให้ภาพนิ่งเหมือนเดิม
2. เลื่อนกล้อง 2 ม. การ์ดที่ 20 ม. เลื่อนบนจอราวเท่าไร (f ≈ 622 px)
ตัวเลขมาจากไหน: ฉากสร้างใหม่ในเบราว์เซอร์จาก plate ทะเลทรายและ depth pass จาก Blender (กล้อง 35 มม. เซนเซอร์ 36 มม. สูง 1.6 ม. ก้ม 4°) ตัวเลข parallax คำนวณจากสูตร pinhole: เลื่อนกล้อง T ม. จุดที่ลึก Z ม. เลื่อน ≈ 622·T/Z px ในเฟรมกว้าง 640 การแยกชั้น, ค่า "stretch", ตาข่ายความลึก และ clean plate อัตโนมัติ เป็นแบบสอนหลักการ (ขอบวัตถุและการลบหินทำแบบง่าย) ไม่ใช่ผลจาก Nuke