1 อธิบาย
การ solve กล้อง 3D หาความลึกด้วย triangulation คือเห็นจุดเดียวกันจากกล้องสองตำแหน่ง แล้วหาว่าเส้นสายตาสองเส้นตัดกันตรงไหน ถ้ากล้องไม่เคลื่อนที่ ก็ไม่มี parallax และไม่มีความลึก
เลื่อนแถบ “ใช้เฟรม 1 กับเฟรม” ไปที่เฟรม k เพื่อใช้การเคลื่อนของกล้องมากขึ้น แล้วดูในมุมมองด้านบนว่าแถบความลึกของหินใกล้แคบลงแค่ไหน เทียบกับตัวเลข “ความลึกเขา ±” ที่ยังสูงอยู่ จากนั้นสลับ “การเคลื่อนกล้อง” เป็น “หมุนอย่างเดียว (nodal)” แล้วสังเกตว่าแถบนั้นไม่แคบลงเลย
σ_Z ≈ Z² · σ_px / (f_px · B)2 ลงมือลอง
โจทย์: ใช้ move จริง ทำให้ความไม่แน่นอนของความลึกของหินใกล้เหลือไม่เกิน 2% (ที่ track คลาด 0.5 px)
ดูตัวเลข baseline ระหว่างกล้องสองตัว และค่าความไม่แน่นอนของหินใกล้ขณะเลื่อน k แบบ หมุนอย่างเดียว (nodal) พาไปถึงไม่ได้
3 เจาะลึก
Triangulation: เส้นสายตาสองเส้นมาตัดกัน
จุดที่ track ได้ในหนึ่งเฟรมบอกแค่ทิศทาง คือเส้นจากกล้องผ่าน pixel นั้นออกไป จุดจริงอยู่ตรงไหนบนเส้นก็ได้ พอมีอีกเฟรมที่กล้องย้ายตำแหน่งไปแล้ว ได้เส้นที่สอง จุดที่สองเส้นตัดกันคือตำแหน่ง 3D
ถ้ากล้องขยับนิดเดียว สองเส้นเกือบขนานกัน track ผิดไปแค่เศษ pixel จุดตัดก็เลื่อนไปตามแนวเส้นได้ไกล นี่คือแถบสีในมุมมองด้านบน
- 1Track จุดในเฟรม 1
- 2Track จุดเดียวกันในเฟรม k
- 3เส้นจากกล้องแต่ละตัว
- 4จุดตัด = ความลึก
Baseline กับระยะทาง
สำหรับสองมุมมอง ความไม่แน่นอนของความลึกประมาณ σZ ≈ Z² · σpx / (f_px · B) โดย Z คือระยะ, σpx คือ track error, f_px คือ focal เป็น pixel และ B คือ baseline ความแม่นจึงดีขึ้นตาม baseline และแย่ลงตามระยะยกกำลังสอง
ในภาพนี้ ตลอดการเคลื่อนของกล้องราว 0.94 m หินใกล้ (ห่างราว 7.4 m) เลื่อนบน plate ราว 65 px ส่วนภูเขา (ราว 150 m) เลื่อนราว 20 px จุดใกล้ให้ความลึก จุดไกลส่วนใหญ่ช่วยยึดการหมุน
| เปลี่ยนอะไร | ความไม่แน่นอนของความลึก |
|---|---|
| baseline B ×2 | ลดลงครึ่งหนึ่ง |
| ระยะ Z ×2 | ราว ×4 |
| track error ×2 | ×2 |
| f_px ×2 (focal ยาวขึ้นหรือภาพละเอียดขึ้น) | ลดลงครึ่งหนึ่ง |
Rotation only: ทุกจุดอยู่บนทรงกลม
pan บนขาตั้งกล้องที่กล้องหมุนรอบจุดศูนย์กลางของตัวเองอย่างเดียว เส้นสายตาทุกเส้นเริ่มจากจุดเดียวกัน จึงไม่มี parallax และไม่มีความลึกให้หา solve ยังหาการหมุนได้ แต่รู้แค่ทิศของแต่ละจุด ไม่รู้ระยะ ข้อดีคือ 2D track ใช้ได้ทั้งเฟรม และถ้าไม่มี feature ไหนอยู่ครบตลอดการ pan ให้ใช้ 3D solve แบบ rotation only
fit แบบ rotation only ถูกต้องเฉพาะเมื่อ move เป็น nodal จริง ถ้ากล้องเคลื่อนที่ด้วย มันจะลื่นมากกว่า solve เต็มรูปแบบ ยกเว้นฉากที่ไกลมาก ซึ่งขยับน้อยจนเคลื่อนแทบเป็นชั้นแบนชั้นเดียว แม้กล้องจะเคลื่อนที่
ก่อนเลือก nodal ให้ดูของใกล้กับของไกลในเฟรม ถ้ามันเลื่อนสัมพันธ์กัน กล้องไม่ได้ nodal
เมื่อข้อมูลอ่อน
ถ้า feature น้อยและแทบไม่มีความลึก solver ต่างตัวอาจให้ focal ต่างกันมาก นั่นแปลว่าข้อมูลบอกไม่ได้ ให้ล็อก focal จาก camera report แล้ว solve ด้วย camera motion ที่ตรงกับช็อตจริง (ใช้ rotation only เฉพาะเมื่อ move เกือบ nodal) และระบุชัดว่า lens เป็นค่าที่สมมติ
ให้มี track ที่ยังใช้ได้เยอะพอในทุกเฟรม อย่าให้เหลือแค่ไม่กี่จุด และกระจายทั้งใกล้และไกล ลบ feature บนท้องฟ้าออก เพราะเมฆเคลื่อนที่ และขอบวัตถุที่ตัดกับท้องฟ้าไม่ใช่จุดที่อยู่นิ่ง จึงดึง solve ให้เพี้ยน
4 ในงานจริง
ทำใน Nuke
- CameraTracker (NukeX): ตั้ง Camera Motion ให้ตรงกับช็อต Free Camera สำหรับกล้องที่เคลื่อนจริง Rotation Only สำหรับ nodal pan
- Roto ต่อเข้า mask ของ CameraTracker เพื่อตัดสิ่งที่เคลื่อนไหวออก
- Track แล้วลบ feature บนท้องฟ้าด้วยมือ รวมถึงตัวที่ไม่ได้ใช้
- Solve แล้วเช็กว่ามี feature ใกล้ (พื้น หิน) อยู่ใน solve ไม่ใช่มีแต่ภูเขาไกล
- Export เป็น Camera ถ้าเป็น nodal solve ใช้กับของไกลหรือท้องฟ้า ไม่อ่านระยะจากมัน
พลาดบ่อย → แก้ยังไง
- ✗ คาดว่า solve จาก pan บนขาตั้งจะบอกความลึกของสิ่งต่าง ๆ✓ ถือว่าเป็น solve การหมุนอย่างเดียว ไม่อ่านระยะจากมัน
- ✗ solve จาก feature ไกลอย่างเดียว เช่นภูเขาและท้องฟ้า✓ เพิ่ม track บนพื้นและหินใกล้ การหมุนดี แต่ความลึกและ translation ต้องมาจากจุดใกล้
- ✗ ปล่อย feature บนท้องฟ้าไว้✓ ลบออกทั้งหมด เพราะเมฆเคลื่อนที่และขอบที่ตัดกับท้องฟ้าไม่ใช่จุดนิ่ง จึงดึง solve
- ✗ ใช้ rotation only fit กับกล้องที่เลื่อนตำแหน่งด้วย✓ ใช้ solve เต็มรูปแบบ (free move)
- ✗ เชื่อ focal จาก solver ตัวใดตัวหนึ่งทั้งที่ solver ต่างตัวให้ค่าต่างกันมาก✓ สมมติ lens จาก camera report solve แค่ rotation และระบุว่าเป็นค่าสมมติ
เช็กก่อนส่งช็อต
- เช็กแล้วว่ากล้องเลื่อนตำแหน่งจริงก่อนจะใช้ความลึกจาก solve
- track กระจายทั้งใกล้และไกล
- ลบ feature ท้องฟ้าและ mask สิ่งที่เคลื่อนไหวแล้ว
- ไม่มีเฟรมไหนที่เหลือจุด track แค่ไม่กี่จุด
- ใช้ nodal solve เฉพาะ move ที่ nodal จริง
- ถ้า lens เป็นค่าสมมติ ระบุไว้ชัดเจน
5 เช็กตัวเอง
ในแบบ หมุนอย่างเดียว (nodal) ทำไมแถบความลึกของหินใกล้ไม่แคบลงเลย ไม่ว่าจะเลื่อน k ไปแค่ไหน
🔒 ตอบคำถามด้านบนก่อน แล้วการ์ดนี้จะเปิด
1. baseline เท่าเดิม แต่จุดอยู่ไกลกว่าเดิมสองเท่า ความไม่แน่นอนของความลึกเปลี่ยนอย่างไร
2. track ทั้งหมดอยู่บนภูเขาไกล ส่วนไหนของ solve อ่อนที่สุด
ตัวเลขมาจากไหน: shot มือถือ 48 เฟรม (640×360) เรนเดอร์ใน Blender (Cycles) จากฉากทะเลทรายของเรา เพิ่มจอเขียวบนเสาและโดรนบินผ่าน เฟรม 1 คือกล้องเดียวกับ plate นิ่ง ตำแหน่งจริงของทุกจุดมาจาก 3D ของฉากเอง (truth.json, dist.f32) ตำแหน่งกล้องและความลึกของจุดเป็นค่าจริงของฉากในภาพนี้ แถบความลึกคำนวณจากสูตรสองมุมมอง โดยสมมติ track คลาด 0.5 px ซึ่งเป็นค่าสำหรับสอน ไม่ได้วัดจาก tracker จริง มุมมองด้านบนเป็นแผนภาพแบบสอนหลักการ