1 อธิบาย
เลนส์ทุกตัวบิดภาพ เส้นตรงจะโค้งมากขึ้นเมื่อเข้าใกล้ขอบเฟรม CG ที่เรนเดอร์จากกล้องที่ไม่มีเลนส์จึงเข้ากับ plate ตรงกลาง แต่ลื่นที่ขอบ
ตั้ง ภาพ เป็น grid chart (เลนส์เดียวกัน) แล้วเลื่อน k จนค่าความโค้งของเส้นตรงใกล้ 0 จากนั้นกลับไปที่ plate ตั้ง ทาง CG เป็น Redistort CG ด้วย k ของคุณ แล้วเล่น shot ดูค่าของกรวยที่ขอบเทียบกับกรวยตรงกลาง ตอนไม่มีเลนส์ กรวยที่ขอบคลาดได้ถึงราว 12 px ส่วนตรงกลางราว 0.6 px
plate → undistort (track only) · CG → redistort → over untouched plate2 ลงมือลอง
โจทย์: solve เลนส์ให้เส้นตรงโค้งไม่เกิน 0.5 px แล้ว redistort CG จนกรวยที่ขอบคลาดไม่เกิน 1 px ตลอด shot
ดูเส้นของ grid ใกล้ขอบเฟรมเทียบกับเส้นประตรงอ้างอิง ไม่ใช่ตรงกลาง เปิด ดูแบบ undistort เพื่อเห็นผลของ k แล้วตัดสินจากกรวยที่ขอบระหว่างเล่น shot
3 เจาะลึก
ทำไมลื่นแค่ที่ขอบ
เลนส์บิดภาพน้อยตรงกลางและมากขึ้นไปทางขอบ กล้อง CG ไม่มีเลนส์ จึงวางของได้ตรงกับ plate ที่กลางเฟรม แต่ยิ่งออกไปทางขอบ ตำแหน่งยิ่งต่างกัน และเมื่อกล้องขยับ ของที่เคลื่อนผ่านเฟรมจะเห็นเป็นการลื่น
ดังนั้นถ้าตรงกลางติดดีแต่ขอบลื่น อย่าเพิ่ง track ใหม่ ให้ตรวจเลนส์ก่อน
ตรวจที่ขอบเฟรมทุกครั้ง ตรงกลางดีอย่างเดียวยังไม่พอ
ลำดับที่ถูกต้อง
undistort plate เพื่อใช้ track และงาน 3D เท่านั้น เอากล้องหรือ corner pin ที่ได้ไปใช้กับ CG แล้ว redistort เฉพาะ CG ก่อน Merge ลงบน plate ที่ไม่ได้แตะ
ถ้ามี grid ที่ถ่ายผ่านเลนส์เดียวกัน ให้ solve จาก grid การ solve ยังประมาณจุดศูนย์กลางเลนส์ด้วย ซึ่งในเลนส์จริงมักไม่ตรงกลางเฟรม
- 1Solve เลนส์จาก grid
- 2Undistort plate (track เท่านั้น)
- 3Track / solve
- 4เรนเดอร์ CG + overscan
- 5Redistort เฉพาะ CG
- 6Merge บน plate เดิม
ทำไมห้าม redistort ทั้ง plate
undistort ทั้ง plate แล้ว comp แล้ว redistort ทั้งหมด ทำให้ plate ถูก filter เพิ่มสองรอบโดยไม่จำเป็น plate ที่ส่งออกต้องไม่ถูก resample เลย
LensDistortion แต่ละตัวคือการ resample หนึ่งรอบ จึงไม่ควรให้ plate ผ่าน undistort/redistort และ filter เฉพาะ CG
| ลำดับ | การ filter |
|---|---|
| plate → undistort → CornerPin | plate ถูก resample อย่างน้อยหนึ่งรอบ ใช้ track ได้ แต่ห้ามเป็นภาพที่ส่ง |
| CG → CornerPin → redistort | resample เฉพาะ CG |
| plate เดิม → Merge | plate ไม่ถูก filter เลย |
Overscan สำหรับ redistort
การ redistort ดึงพิกเซลจากนอกเฟรมเข้ามา ถ้า CG เรนเดอร์พอดีเฟรม จะเกิดขอบดำบาง ๆ ที่ขอบภาพหลัง redistort จึงต้องเรนเดอร์ CG หรือตั้ง ScanlineRender ให้มี overscan
ถ้าใส่ Crop เพื่อลด bbox ต้องไม่ตัดพิกเซล overscan เหล่านั้นทิ้ง
ดูขอบเฟรมหลัง redistort ด้วย gain สูง ขอบดำบาง ๆ จะโผล่ให้เห็น
เลนส์เป็นส่วนหนึ่งของ solve
focal length, distortion และ rotation ของกล้องเป็นคำตอบชุดเดียวกัน อย่าแก้ค่าใดค่าหนึ่งเอง ถ้าต้องการเลนส์อื่นให้ solve ใหม่
เก็บ LensDistortion ตัวหลักไว้ใน backdrop แล้ว copy ไปใช้ จะได้ไม่มีใครแก้ค่าโดยไม่ตั้งใจแล้วลามไปทั้ง script
4 ในงานจริง
ทำใน Nuke
- LensDistortion บน grid: แท็บ Analysis → Detect แก้จุดที่ขอบที่ผิด หรือวางเส้นเองด้วย Line Drawing Tools แล้ว Solve
- copy LensDistortion ตั้งเป็น undistort ใส่บน plate สำหรับ track และ solve กล้องเท่านั้น
- ScanlineRender ด้วยกล้องที่ solve ได้ และตั้ง overscan ไว้
- copy LensDistortion ตั้งเป็น redistort ใส่เฉพาะ CG หรือ output เป็น STMap แล้วใช้ node STMap กับ CG
- Merge (over) CG ลงบน plate ที่ไม่ได้ undistort
- ตรวจ: Merge (difference) comp กับ plate ต้องได้ 0 นอก element
พลาดบ่อย → แก้ยังไง
- ✗ undistort plate แล้วส่ง plate ที่ undistort ออกไป✓ ใช้ภาพ undistort แค่ track และ solve ส่วน plate ที่ส่งต้องเป็นตัวเดิม
- ✗ redistort ทั้ง comp แทนที่จะทำแค่ CG✓ redistort เฉพาะ CG แล้ว Merge ลงบน plate ที่ไม่ถูกแตะ
- ✗ CG ไม่มี overscan หลัง redistort มีขอบดำ✓ เรนเดอร์ CG หรือตั้ง ScanlineRender ให้มี overscan และอย่าให้ Crop ตัดทิ้ง
- ✗ เช็กแค่ตรงกลางเฟรมแล้วบอกว่าติดแล้ว✓ เล่นช็อตแล้วดูที่ขอบเฟรมทุกครั้ง
- ✗ เปลี่ยน focal หรือค่า distortion เองหลัง solve✓ ถือว่าเป็นคำตอบชุดเดียวกัน ถ้าจะเปลี่ยนให้ solve ใหม่
เช็กก่อนส่งช็อต
- grid หลัง undistort ดูตรงทั้งเฟรม รวมถึงมุม
- เล่นช็อตแล้ว CG ที่ขอบเฟรมไม่ลื่น ไม่ใช่แค่ตรงกลาง
- redistort ใส่เฉพาะ CG และ plate ไม่ถูก undistort
- ขอบเฟรมหลัง redistort ไม่มีขอบดำ
- difference ระหว่าง comp กับ plate เป็น 0 นอก element
- ค่าเลนส์ทุกตัว copy มาจาก LensDistortion ตัวหลัก
5 เช็กตัวเอง
กรวยตรงกลางเฟรมติดพื้นดี แต่กรวยที่ขอบซ้ายขวาลื่น สาเหตุน่าจะเป็นอะไร
🔒 ตอบคำถามด้านบนก่อน แล้วการ์ดนี้จะเปิด
1. ทำไม CG ที่จะ redistort ต้องเรนเดอร์แบบ overscan
2. ลำดับไหนถูกต้องสำหรับวาง CG ลงบน plate ที่มี lens distortion
ตัวเลขมาจากไหน: shot มือถือ 48 เฟรม (640×360) เรนเดอร์ใน Blender (Cycles) จากฉากทะเลทรายของเรา เพิ่มจอเขียวบนเสาและโดรนบินผ่าน เฟรม 1 คือกล้องเดียวกับ plate นิ่ง ตำแหน่งจริงของทุกจุดมาจาก 3D ของฉากเอง (truth.json, dist.f32) ภาพคำนวณในเบราว์เซอร์ ความบิดเป็นเลนส์แบบสอนหลักการที่เราใส่เอง (radial เทอมเดียว k = 0.06 ปรับขนาดให้มุมยังอยู่ในภาพที่เรนเดอร์) เลนส์จริงต้องใช้ model ของ solver เอง CG แบบ “ไม่มี lens” ใช้กล้องที่ focal ซึมการขยายกลางเฟรมของเลนส์ไว้ เหมือน solve ที่ไม่มี lens model (ค่าประมาณเพื่อสอน) ตำแหน่งจริงของกรวยมาจากกล้องในฉากที่เราเรนเดอร์เอง