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

L7 LensDistort กับตารางเส้นตรง

k1 กับ k2 ทำอะไรกับเส้น

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

1 อธิบาย

ตารางหมากรุกคือเส้นตรงล้วน เหมาะดูว่า distortion ทำอะไร k1 คุมความโค้งหลัก k2 คุมเพิ่มเฉพาะช่วงไกลจากกลาง (มุมภาพ) เลนส์มุมกว้างบางตัวต้องใช้ทั้งสองค่า

ในงานจริงค่าพวกนี้ได้จากการถ่าย lens grid ที่กองถ่าย แล้วให้โปรแกรม track หาค่า ไม่ใช่กะด้วยตา

2 ลงมือใน mini compositor

SkyVFX mini compositor · L7640×360 · float · 1001

3 เจาะลึก

อ่านตารางหมากรุกให้เป็น

ในโมเดลของห้องทดลอง จุดบนภาพต้นทางที่ระยะ r จากกลาง (มุมภาพ = 1) จะไปอยู่ที่ r × (1 + k1 r² + k2 r⁴) เส้นที่ผ่านกลางภาพพอดียังตรง เพราะจุดบนเส้นนั้นแค่เลื่อนเข้าออกตามแนวเดิม เส้นที่อยู่ห่างกลางจะโค้ง และโค้งมากขึ้นเมื่อเข้าใกล้ขอบ

k1 ติดลบ จุดถูกดึงเข้าหากลาง เส้นโป่งออก (barrel) k1 เป็นบวก จุดถูกดันออก เส้นหุบเข้า (pincushion)

k1k2r = 0.5 ขยับr = 1 (มุม) ขยับ
−0.10−2.5%−10%
+0.10+2.5%+10%
0+0.1+0.63%+10%
−0.1+0.1−1.9%0%

k2 กับเส้นที่เป็นคลื่น

k2 คูณกับ r⁴ ที่กลางทาง (r = 0.5) r⁴ เหลือแค่ 0.0625 แต่ที่มุมเท่ากับ 1 k2 จึงแทบไม่แตะกลางภาพ แต่เปลี่ยนมุมได้เต็มที่ ดูแถวที่สามในตาราง: กลางทางขยับไม่ถึง 1% มุมขยับ 10%

ถ้า k1 กับ k2 เครื่องหมายตรงข้ามกัน เช่น −0.1 กับ +0.1 กลางทางยังโป่งแบบ barrel แต่ที่มุมดึงกลับมาจนไม่ขยับเลย เส้นตรงจะกลายเป็นคลื่น เลนส์มุมกว้างบางตัวให้รูปแบบนี้ ค่า k1 ตัวเดียวจึงตามไม่ทัน

เส้นเป็นคลื่น = ต้องใช้ k2 ด้วย

มุมดำ และขอบที่หายไป

ตอน barrel แรง ๆ พิกเซลที่มุมของภาพผลลัพธ์ต้องไปดึงข้อมูลจากนอกขอบภาพต้นทาง ซึ่งไม่มีอะไรอยู่ จึงเห็นมุมดำ นี่คือเหตุผลเดียวกับที่ CG ต้องเรนเดอร์มี overscan ก่อน redistort

pincushion ทำกลับกัน ภาพที่ขอบถูกดันออกนอกเฟรมและหายไป ถ้า undistort plate ที่เป็น barrel ผลจะคล้าย pincushion ขอบ plate บางส่วนจะหลุดเฟรม ถ้าต้องเก็บไว้ ให้ทำในฟอร์แมตที่ใหญ่ขึ้น

ใช้ตารางหมากรุกตรวจงานจริง

ก่อนเชื่อ node เลนส์ในช็อต ให้ส่งภาพหมากรุกผ่าน undistort แล้ว redistort แล้วเทียบกับต้นฉบับด้วย Merge difference ภายในเฟรมควรเหลือแค่เส้นจาง ๆ ที่ขอบช่อง จากการ resample ถ้าเห็นเส้นหนาหรือการเลื่อนตรงนั้น แปลว่าสองทิศไม่ใช่คู่กลับกันจริง ส่วนขอบนอกสุดยังอาจต่างได้ เพราะภาพบางส่วนอาจหลุดเฟรมไปแล้วตามที่อธิบายข้างบน

ทุกการบิดคือการ resample ซึ่งทำให้ภาพนุ่มลง plate จริงจึงไม่ควรถูกบิดไปกลับ บิดเฉพาะสำเนาที่ใช้ track และบิดเฉพาะ CG

  1. 1CheckerBoard
  2. 2Undistort
  3. 3Redistort
  4. 4Difference กับต้นฉบับ

4 ในงานจริง

ทำใน Nuke

  1. CheckerBoard ที่ขนาดเท่า plate ใช้ดูว่า node เลนส์ทำอะไรกับเส้นตรง
  2. LensDistortion (NukeX): solve จาก lens grid ที่ถ่ายในกอง ไม่ใช่ปรับค่าด้วยตา
  3. ทดสอบ round trip: CheckerBoard → LensDistortion (undistort) → LensDistortion (redistort) → Merge difference กับต้นฉบับ
  4. ส่งต่อให้ทีมเป็น STMap แล้วใช้ node STMap บิดภาพ ได้ผลเหมือนกันทุกคน (ทวนจาก L4)

พลาดบ่อย → แก้ยังไง

  • ✗ ใช้แค่ k1 กับเลนส์ที่เส้นเป็นคลื่น✓ ให้ solver หา k2 ด้วย แล้วเช็กมุมภาพบนตารางหมากรุก
  • ✗ เห็นมุมดำหลัง redistort แล้วแก้ด้วยการขยายภาพ✓ เรนเดอร์ CG ให้มี overscan การขยายภาพทำให้ขนาดและตำแหน่งไม่ตรงกับการ track (ทวนจาก L4)
  • ✗ undistort แล้ว redistort plate จริงก่อน merge✓ plate จริงไม่ต้องบิด บิดเฉพาะสำเนาไว้ track และบิดเฉพาะ CG
  • ✗ เชื่อ node เลนส์โดยไม่ทดสอบ round trip✓ ส่งตารางหมากรุกผ่านไปกลับ แล้วดู difference

เช็กก่อนส่งช็อต

  • ค่าเลนส์มาจาก lens grid หรือเส้นตรงใน plate ไม่ใช่กะ
  • มุมภาพบนตารางหมากรุกตรง ไม่เป็นคลื่น
  • Round trip เหลือแค่เส้นจางจากการ resample
  • CG มี overscan พอสำหรับ redistort ไม่มีมุมดำ
  • plate จริงไม่ผ่านการบิดไปกลับ

5 เช็กตัวเอง

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

ค่า distortion ที่ถูกต้องควรได้มาจากไหน

สิ่งที่ได้เรียน

🔒 ตอบคำถามด้านบนก่อน แล้วการ์ดนี้จะเปิด

คำถามเพิ่ม

1. k1 = 0, k2 = +0.1 ในโมเดลของเรา จุดกลางทาง (r = 0.5) กับจุดที่มุมขยับเท่าไร

2. บนตารางหมากรุก เส้นโป่งออกช่วงกลาง แต่กลับมาตรงที่มุม หมายถึงอะไร

ตัวเลขมาจากไหน: ภาพคำนวณในเบราว์เซอร์ Saturation, Multiply, Clamp, Invert, Keymix, Copy และ Grade ตรงกับ Nuke 17.0v2 (ตรวจแล้ว) ส่วน Blur, Defocus, Glow, Sharpen, ChromaticAberration, Vignette, LensDistort, Grain, Erode, Toe, Keyer และ Despill เป็นแบบสอนหลักการ ไม่เท่า node ใน Nuke เป๊ะ Transform ในห้องนี้ก็เป็นแบบสอนหลักการเช่นกัน ใช้ bilinear ไม่ concatenate และตัดขอบที่เฟรม ภาพเป็นเรนเดอร์ Blender ของเราเอง (green screen สร้างด้วยโค้ดล้วน ฉากทะเลทรายใช้ภูเขาจาก Gaea 2.3 ท้องฟ้าเป็น HDRI CC0 จาก Poly Haven หินและหญ้าจาก Poly Haven CC0 ทรายและหินผาจาก Quixel และ rig หุ่นจาก Mixamo โดย Quixel และ Mixamo ใช้ในเรนเดอร์เท่านั้น)