1 อธิบาย
เลนส์จริงทำให้เส้นตรงโค้ง เลนส์มุมกว้างมักโค้งออก (barrel, ในโมเดลนี้ k1 ติดลบ) เลนส์ยาวบางตัวโค้งเข้า (pincushion, k1 บวก) CG เรนเดอร์ออกมาเส้นตรงเสมอ ถ้าไม่ใส่ distortion ให้ CG จะ "ลื่น" ตรงขอบภาพ
วิธีที่ถูก: undistort plate เพื่อ track เท่านั้น แล้ว redistort เฉพาะ CG ให้โค้งเหมือนเลนส์ ไม่แตะ plate ฮีโร่
x_d = x · (1 + k1·r² + k2·r⁴)2 ลงมือลอง
ปรับ k1 ให้ตาราง CG (ฟ้า) ทับเส้นของ plate (ส้ม)
3 เจาะลึก
ทำไมขอบภาพโดนหนักที่สุด
x_d = x(1 + k1 r² + k2 r⁴) โดย r คือระยะจากจุดกึ่งกลางเลนส์ (ให้มุมภาพ = 1) ตรงกลาง r ≈ 0 แทบไม่ขยับ พอออกไปขอบ r² โตเร็ว ในโมเดลของเรา k1 = −0.05 จุดที่มุมภาพขยับเข้า 5% ของระยะ จุดกลางทางขยับแค่ 1.25%
จุดกึ่งกลางเลนส์จริงมักไม่อยู่กลางภาพเป๊ะ และแต่ละโปรแกรมใช้โมเดลและการ normalize ต่างกัน ค่า k1 จากโปรแกรมหนึ่ง (แม้แต่เครื่องหมายบวกลบ) จึงเอาไปใส่อีกโปรแกรมตรง ๆ ไม่ได้
เก็บข้อมูลเลนส์
หน้ากอง: ถ่าย lens grid (ตารางหมากรุก) ทุกเลนส์ ถ้าเป็นซูมให้ถ่ายทุก focal ที่ใช้ ให้ตารางเต็มเฟรม แบนราบ ตั้งฉากกับกล้อง และคมชัด distortion เปลี่ยนตามระยะโฟกัสได้ด้วย ถ้าทำได้ให้ถ่ายใกล้กับระยะที่ใช้จริง
ไม่มี grid: ใช้เส้นที่ควรตรงใน plate เช่นเสาหรือขอบอาคาร ให้โปรแกรมดัดจนตรง แม่นน้อยกว่า grid แต่ดีกว่าเดา
- 1Lens grid หน้ากอง
- 2Detect + Solve
- 3Master LD node
- 4Undistort / Redistort
ลำดับงานที่ถูก
undistort สำเนา plate ไว้ track → solve → เรนเดอร์ CG ในพื้นที่ไม่บิด → redistort เฉพาะ CG → Merge over plate เดิมที่ไม่ได้แตะ ทุกครั้งที่บิดภาพคือการ resample ซึ่งทำให้นุ่มลง plate ฮีโร่จึงไม่ควรผ่านไปกลับ
เรนเดอร์ CG ให้มี overscan เพราะการ redistort แบบ barrel ดึงพิกเซลจากนอกเฟรมเข้ามาที่มุม ถ้าไม่มี จะเห็นแถบดำที่ขอบ และ Crop ที่ใส่เพื่อลด bbox ต้องไม่ตัด overscan ทิ้ง
| ภาพ | ทำอะไร |
|---|---|
| plate ฮีโร่ | ไม่แตะ |
| สำเนา plate สำหรับ track | Undistort |
| CG / element | Redistort (มี overscan) |
STMap: เรนเดอร์ครั้งเดียว ใช้ได้ทุกคน
STMap คือภาพที่แต่ละพิกเซลเก็บพิกัด UV ว่าจะไปดึงสีจากตรงไหน เรนเดอร์ STMap ของการ undistort และ redistort ไว้ครั้งเดียว ใครในทีมก็ใช้ได้ผลเหมือนกัน ไม่ต้องเปิด node เลนส์ของโปรแกรมต้นทาง
ตรวจง่าย ๆ: เสาที่ตรงในโลกจริงต้องตรงใน plate ที่ undistort แล้ว
4 ในงานจริง
ทำใน Nuke
- LensDistortion (อาจต้องใช้ NukeX แล้วแต่ license): Analysis → Detect บน lens grid แก้จุดที่ผิด แล้ว Solve
- เก็บ LensDistortion ตัว master ไว้ใน backdrop แล้ว copy ไปใช้ จะได้ไม่เผลอแก้ตัวจริง
- สำเนา plate → LensDistortion (undistort) → CameraTracker
- ScanlineRender มี overscan → LensDistortion (redistort) → Merge over plate เดิม
- LensDistortion เขียนผลเป็น STMap ได้ แล้วใช้ node STMap บิดภาพ
- ใช้ filter ที่คมกว่า (เช่น Lanczos) ทั้งตอน undistort, render และ redistort
พลาดบ่อย → แก้ยังไง
- ✗ undistort ทั้ง plate comp แล้ว redistort ทั้งหมดกลับ✓ redistort แค่ CG แล้ว over plate เดิม
- ✗ เรนเดอร์ CG พอดีเฟรม✓ เรนเดอร์มี overscan กันแถบดำที่มุม
- ✗ ก๊อป k1 จากโปรแกรมหนึ่งไปใส่อีกโปรแกรม✓ ส่งต่อเป็น STMap หรือใช้ node ของโมเดลเดียวกัน
- ✗ CG ลื่นที่ขอบ แล้วโทษ track✓ เช็ก distortion ก่อน
- ✗ ถ่าย grid แค่ focal เดียวของเลนส์ซูม✓ ถ่ายทุก focal ที่ใช้ในฉาก
เช็กก่อนส่งช็อต
- มี lens grid หรือ solve จากเส้นตรงใน plate
- plate ฮีโร่ไม่ผ่าน undistort/redistort
- CG มี overscan และไม่ถูก Crop ตัดทิ้ง
- เส้นตาราง CG ทับเส้น plate ที่มุมภาพ
- ไม่มีแถบดำที่ขอบหลัง redistort
5 เช็กตัวเอง
CG ลื่นเฉพาะที่ขอบภาพ แต่ตรงกลางนิ่ง น่าจะเป็นเพราะอะไร
🔒 ตอบคำถามด้านบนก่อน แล้วการ์ดนี้จะเปิด
1. โมเดลของเรา k1 = −0.08 จุดที่อยู่กลางทางระหว่างกึ่งกลางกับมุม (r = 0.5) ขยับกี่ %
2. ทำไมต้องเรนเดอร์ CG ให้มี overscan
ตัวเลขมาจากไหน: สูตรเลนส์เป็นแบบ thin lens มาตรฐาน (FOV, CoC, hyperfocal) ใช้ CoC = เส้นทแยงเซนเซอร์ ÷ 1500 ซึ่งเป็นธรรมเนียมทั่วไป ไม่ใช่ค่าตายตัว distortion ใช้โมเดล Brown–Conrady (k1, k2) ภาพ DOF จริงเรนเดอร์จาก Blender Cycles