1 อธิบาย
motion vector เก็บว่าแต่ละ pixel เคลื่อนบนจอไปไกลเท่าไรในหนึ่งเฟรม vector blur ลากแต่ละ pixel ไปตาม vector ของมัน ส่วน shutter กำหนดว่าเส้นลากยาวกี่ส่วนของการเคลื่อนที่นั้น shutter 180° เท่ากับครึ่งเฟรม หุ่นที่วิ่งในเฟรมนี้ลำตัวเคลื่อนราว 13 px ต่อเฟรม มือและเท้าถึง 18 px เส้นลากที่ 180° จึงยาวราว 6–9 px
ลองเพิ่ม shutter จาก 0 สลับระหว่าง “หลัง merge (ทั้งภาพ)” กับ “บน layer CG แล้วค่อย merge” แล้วดูค่าที่ต่างจาก 3D blur ของ Blender จากนั้นเปิด view “ต่าง ×4” ดูมือและเท้า ซึ่งเคลื่อนเป็นแนวโค้ง เส้นลากตรง ๆ ตามไม่ทัน
streak = vector (px/frame) × shutter (frames)2 ลงมือลอง
โจทย์: ใช้ vector blur ให้ได้ใกล้กับ 3D motion blur ของ Blender (shutter 180°) จนค่าที่ต่างต่ำกว่าเป้าใน panel
slider shutter มีหน่วยเป็นสัดส่วนของเฟรมและเริ่มที่ 0 อย่าลืมดูด้วยว่า blur อยู่ตรงไหนของ tree สังเกตขอบหุ่นยนต์ใน view “ต่าง ×4”
3 เจาะลึก
motion vector เก็บอะไร
แต่ละ pixel เก็บการเคลื่อนบนจอเป็นหน่วย pixel ทั้งทิศทางและระยะ R คือแนวนอน G คือแนวตั้ง แต่ละ renderer ใช้ scale และเครื่องหมายต่างกัน ก่อนใช้จึงควรเช็กกับการเคลื่อนที่ที่รู้อยู่แล้ว เช่น ลำตัวของหุ่นยนต์ที่วิ่งผ่านเฟรม
Vector pass ของ Blender มี vector 2D สองชุดเป็น pixel ชุดหนึ่งคือการเคลื่อนจากเฟรมก่อนมาเฟรมนี้ อีกชุดคือจากเฟรมนี้ไปเฟรมถัดไป ทั้งคู่ชี้ไปทางที่ pixel เคลื่อน และ Cycles จะเขียน pass นี้เฉพาะตอนปิด motion blur เท่านั้น vector เป็นข้อมูล ไม่ใช่ภาพ ต้องอ่านแบบ raw ห้ามผ่าน colour transform
| ช่อง | เก็บอะไร |
|---|---|
| R | การเคลื่อนแนวนอน (pixel) บวก = ไปทางขวา |
| G | การเคลื่อนแนวตั้ง (pixel) บวก = ขึ้น ตามแกน y ของ Nuke |
| Vector pass ของ Blender | vector สองชุด: ไปเฟรมก่อน และไปเฟรมถัดไป |
shutter กำหนดความยาวเส้นลาก
เส้นลากยาวเท่ากับระยะที่ pixel เคลื่อนไปขณะ shutter เปิด คือ vector × สัดส่วนของเฟรม ในภาพนี้ลำตัวเคลื่อนราว 13 px ต่อเฟรม มือและเท้าที่แกว่งถึง 18 px ที่ 180° เส้นลากจะยาวประมาณครึ่งหนึ่งของระยะนั้น (ราว 6–9 px) และให้ shutter อยู่กึ่งกลางเฟรม (centred) เหมือนที่ render ภาพอ้างอิง
ที่ shutter 0 ไม่มี blur เลย error จึงสูงที่สุด blur type แบบ uniform ให้เส้นลากขอบชัดเหมือน shutter จริง
| shutter | สัดส่วนของเฟรม | ที่ 24 fps |
|---|---|---|
| 0° | 0 (ไม่มี blur) | 0 วินาที |
| 180° | 0.5 | 1/48 วินาที |
| 360° | 1 | 1/24 วินาที |
blur ชั้น CG ก่อน Merge
ถ้าใส่ vector blur หลัง Merge ทั้งเฟรม pixel ของ plate ที่อยู่นิ่งตรงขอบหุ่นยนต์จะโดน vector ของหุ่นยนต์ลากไปด้วย ทราย หิน และภูเขาตรงขอบจะเลอะตามหุ่นยนต์ ในภาพนี้ blur หลัง merge ที่ shutter 0.5 ยังไม่ถึงเป้า ส่วน blur ที่ชั้น CG ถึงเป้าได้
blur CG ที่ premult แล้วพร้อม alpha จากนั้นค่อย Merge over ลงบน plate ขอบที่ blur จะโปร่งเห็น plate ข้างหลังที่ยังคม
- 1CG + vector
- 2VectorBlur2 ที่ชั้น CG
- 3Merge over plate
- 4difference กับภาพอ้างอิง
เส้นตรงไม่ตามวงโค้ง
vector blur ลากแต่ละ pixel เป็นเส้นตรงตาม vector ของเฟรมนั้นเท่านั้น มือและเท้าที่แกว่งเคลื่อนเป็นวงโค้ง 3D blur จริงจึงโค้งตาม แต่ vector blur ได้เป็นเส้นตรง ส่วนที่หมุนเร็ว เช่น ใบพัด ก็ผิดแบบเดียวกัน
การเพิ่ม samples ช่วยให้เส้นลากเนียนขึ้น แต่ไม่ทำให้เส้นโค้ง ส่วนที่เคลื่อนเป็นวงโค้งชัด ๆ ให้ใช้ 3D motion blur ในเรนเดอร์ หรือแบ่ง shutter เป็นหลายช่วงที่แต่ละช่วงใช้การเคลื่อนที่ของช่วงนั้น แล้วเฉลี่ยรวมกัน
ถ้าตั้ง shutter ถูกแล้วมือยังดูผิด ปัญหาอยู่ที่วงโค้ง ไม่ใช่ปริมาณ blur
4 ในงานจริง
ทำใน Nuke
- Read EXR แบบ raw แล้วใช้ Shuffle2 (หรือ Copy ถ้า vector มาจากเรนเดอร์แยก) ย้าย vector ไปไว้ใน layer ที่ VectorBlur2 อ่าน
- sample pixel ที่รู้ทิศทางการเคลื่อน เช่น ลำตัว เพื่อเช็ก sign และ scale ก่อน
- VectorBlur2 บน CG ที่ premult: uv = layer ของ vector, ปรับ scale ให้ตรงกับ shutter ของ plate, ให้ shutter อยู่กึ่งกลางเฟรม, blur_type = uniform
- Merge2 (over) ลงบน plate หลัง blur แล้ว
- Merge2 (difference) เทียบกับเฟรมอ้างอิงที่มี 3D blur จริง แล้วปรับ scale จนตรง
- ถ้าเคลื่อนเฉพาะกล้องใช้ MotionBlur3D, ถ้าเป็น 2D transform ใช้ MotionBlur2D → VectorBlur2 ส่วนที่เป็นวงโค้งให้ไปใช้ 3D blur ในเรนเดอร์
พลาดบ่อย → แก้ยังไง
- ✗ ใส่ vector blur หลัง Merge ทั้งเฟรม✓ blur ที่ชั้น CG ก่อน แล้วค่อย Merge over plate
- ✗ shutter ไม่ตรงกับ plate (360° หรือ 0)✓ ใช้ shutter เดียวกับ plate 180° = 0.5 เฟรม แบบ centred
- ✗ เชื่อ sign และ scale ของ vector โดยไม่เช็ก✓ sample การเคลื่อนที่ที่รู้ทิศทาง แล้วแก้ sign หรือ scale ให้ตรงกับ renderer
- ✗ ใช้ vector blur กับส่วนที่หมุนหรือแกว่งเป็นวงโค้ง✓ ใช้ 3D motion blur หรือแบ่งเป็นหลายช่วงแล้วเฉลี่ย
- ✗ อ่าน layer vector ผ่าน colour transform✓ อ่านแบบ raw และห้าม grade vector
เช็กก่อนส่งช็อต
- shutter ของ vector blur ตรงกับ plate และอยู่กึ่งกลางเฟรม
- blur อยู่ที่ชั้น CG ก่อน Merge ไม่มี plate เลอะตามขอบ
- sign และ scale ของ vector เช็กกับการเคลื่อนที่ที่รู้แล้ว
- เทียบกับเฟรมอ้างอิงที่มี 3D blur แล้ว difference ใกล้ 0
- มือ เท้า และส่วนที่หมุน ดูทีละส่วนแล้วไม่มีเส้นตรงผิดธรรมชาติ
5 เช็กตัวเอง
plate ถ่ายด้วย shutter 180° ควรตั้ง shutter ของ vector blur เป็นเท่าไร (หน่วยเป็นเฟรม)
🔒 ตอบคำถามด้านบนก่อน แล้วการ์ดนี้จะเปิด
1. ใส่ vector blur หลัง Merge ทั้งเฟรม แล้วขอบหุ่นยนต์มีทรายกับหินเลอะตาม เพราะอะไร
2. shutter ถูกแล้ว แต่มือที่แกว่งยังต่างจาก 3D blur ของ Blender ควรแก้อย่างไร
ตัวเลขมาจากไหน: ภาพทั้งหมด render ด้วย Blender 5.2 Cycles จากฉากทะเลทรายและหุ่นยนต์ของเราเอง (tools/assets/passes_cg.py) แล้วคำนวณในเบราว์เซอร์ หุ่นวิ่ง (คลิป Mixamo "Running" ใช้แค่ใน render) ผ่านหน้ากล้องที่ระยะ 7 m เฟรมที่ปิด motion blur พร้อม Vector pass เทียบกับเฟรมเดียวกันที่เปิด 3D motion blur ของ Cycles ที่ 180° (shutter 0.5 แบบ centred) เป็นภาพอ้างอิง vector blur ของเรากระจายแต่ละ pixel ตามค่าเฉลี่ยของ vector สองชุดของ Blender เป็นแบบสอนหลักการ ไม่ใช่ VectorBlur2 ของ Nuke