หน้าแรก · Lab · Camera & Lens Lab

L4 Lens distortion

เส้นตรงในโลกจริง โค้งใน plate

Camera & Lens Lab · ~6 นาที · ฟรี

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 (ส้ม)

SkyVFX Lab · L4interactive · 1001

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 แต่ดีกว่าเดา

  1. 1Lens grid หน้ากอง
  2. 2Detect + Solve
  3. 3Master LD node
  4. 4Undistort / Redistort

ลำดับงานที่ถูก

undistort สำเนา plate ไว้ track → solve → เรนเดอร์ CG ในพื้นที่ไม่บิด → redistort เฉพาะ CG → Merge over plate เดิมที่ไม่ได้แตะ ทุกครั้งที่บิดภาพคือการ resample ซึ่งทำให้นุ่มลง plate ฮีโร่จึงไม่ควรผ่านไปกลับ

เรนเดอร์ CG ให้มี overscan เพราะการ redistort แบบ barrel ดึงพิกเซลจากนอกเฟรมเข้ามาที่มุม ถ้าไม่มี จะเห็นแถบดำที่ขอบ และ Crop ที่ใส่เพื่อลด bbox ต้องไม่ตัด overscan ทิ้ง

ภาพทำอะไร
plate ฮีโร่ไม่แตะ
สำเนา plate สำหรับ trackUndistort
CG / elementRedistort (มี overscan)

STMap: เรนเดอร์ครั้งเดียว ใช้ได้ทุกคน

STMap คือภาพที่แต่ละพิกเซลเก็บพิกัด UV ว่าจะไปดึงสีจากตรงไหน เรนเดอร์ STMap ของการ undistort และ redistort ไว้ครั้งเดียว ใครในทีมก็ใช้ได้ผลเหมือนกัน ไม่ต้องเปิด node เลนส์ของโปรแกรมต้นทาง

ตรวจง่าย ๆ: เสาที่ตรงในโลกจริงต้องตรงใน plate ที่ undistort แล้ว

4 ในงานจริง

ทำใน Nuke

  1. LensDistortion (อาจต้องใช้ NukeX แล้วแต่ license): Analysis → Detect บน lens grid แก้จุดที่ผิด แล้ว Solve
  2. เก็บ LensDistortion ตัว master ไว้ใน backdrop แล้ว copy ไปใช้ จะได้ไม่เผลอแก้ตัวจริง
  3. สำเนา plate → LensDistortion (undistort) → CameraTracker
  4. ScanlineRender มี overscan → LensDistortion (redistort) → Merge over plate เดิม
  5. LensDistortion เขียนผลเป็น STMap ได้ แล้วใช้ node STMap บิดภาพ
  6. ใช้ 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 เช็กตัวเอง

เช็กตัวเอง 1 ข้อ

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