1 อธิบาย
อากาศร้อนหักเหแสง พื้นหลังที่อยู่หลังกองไฟจึงดูสั่นไหว ใน comp เราเลื่อน pixel ของ plate ด้วย map ของ IDistort ค่าใน map บอกว่าจะเลื่อนไกลแค่ไหน และเครื่องหมายบวกหรือลบบอกทิศทาง
ตอนเริ่ม ทั้งเฟรมเลื่อนไปทางเดียวและสั่นแรงเกิน ลองสลับแผนที่ noise เป็น "กึ่งกลาง 0" แล้วดูตัวเลขการเลื่อนทั้งเฟรม เลือก "เหนือเปลวไฟ" แล้วดูค่าการบิดข้าง/ใต้เปลวไฟ จากนั้นลด UV scale ติ๊ก "แสดงแผนที่ displacement" เพื่อดู map (แดง = ดึงสีจากทางขวา ภาพจึงเลื่อนซ้าย น้ำเงิน = กลับกัน)
IDistort: out(x, y) = in(x + s·u, y + s·v), u, v centred on 02 ลงมือลอง
โจทย์: ทำให้ไอร้อนดูน่าเชื่อ ไม่มี drift อยู่เฉพาะเหนือเปลวไฟ และเบาพอ (UV scale 0.5–2 px ช่วงสอนของเรา)
แก้ตามตัวเลขการเลื่อนทั้งเฟรมและค่าการบิดข้าง/ใต้เปลวไฟก่อน แล้วดูตอนเล่น (เล่นอยู่แล้วตั้งแต่เริ่ม) ตัดสิน UV scale ด้วยตา ควรรู้สึกว่าเป็นไอร้อน ไม่ใช่ผิวน้ำ
3 เจาะลึก
ทำไม map 0 … 1 ทำให้ทั้งเฟรมไหล
IDistort อ่านค่าใน map เป็นระยะเลื่อนหน่วย pixel เช่น ค่า 1 ใน red คือ pixel นั้นไปดึงสีจากตำแหน่งที่อยู่ทางขวา 1 px ภาพจึงเลื่อนไปทางซ้าย 1 px ถ้า map มีแต่ค่าบวก ทุก pixel ก็ถูกดันไปทางเดียวกัน ค่าเฉลี่ยของ map จึงกลายเป็นการไหลของทั้งภาพ
วิธีแก้คือทำให้ map มีทั้งค่าบวกและค่าลบ รอบ 0 ปิด black clamp ใน Grade แล้วเลื่อนค่าลงครึ่งหนึ่งของช่วง การดันซ้ายกับขวาจะหักล้างกันโดยเฉลี่ย เหลือแค่การสั่นอยู่กับที่
| map | การเลื่อนเฉลี่ย | สิ่งที่เห็น |
|---|---|---|
| noise 0 … 1 | ไม่ใช่ 0 ไปทางเดียว | plate ทั้งแผ่นไหลพร้อมสั่น |
| noise centred (−0.5 … 0.5) | ราว 0 | สั่นอยู่กับที่ทั้งเฟรม |
| centred และ mask เหนือไฟ | 0 นอก mask | สั่นเฉพาะในอากาศร้อน |
ไอร้อนลอยขึ้นเท่านั้น
อากาศร้อนลอยขึ้นจากต้นไฟ ความบิดจึงอยู่เป็นแนวเหนือเปลวไฟ มีทิศทางชัด แรงใกล้ไฟแล้วจางลงด้านบน ด้านข้างและด้านล่างไม่มีเลย ในรูปนี้ mask เป็นแนวเสาที่วาดด้วยสูตรเหนือยอดเปลว เริ่มแรงขึ้นเหนือยอดไฟแล้วค่อย ๆ จางขึ้นไป ใน Nuke ใช้ Roto ที่ feather ไปทางด้านบน หรือ alpha ของไฟที่ blur แล้วดันขึ้นก็ได้
เมื่อ map centred แล้ว การคูณด้วย mask ทำให้ค่านอก mask เป็น 0 ซึ่งแปลว่าไม่เลื่อนเลย ถ้า map ยังเป็น 0 … 1 การ mask จะไม่ช่วย เพราะในบริเวณ mask ภาพยังไหลไปทางเดียว
ถ้าพื้นใต้กองไฟหรือหินข้าง ๆ สั่น แปลว่า mask ผิด
น้อยไว้ก่อน และต้องเร็ว
ภาพของไอร้อนคือการเลื่อนเล็กมากกับความนุ่มนิดหน่อย ไม่ใช่คลื่นใหญ่ ถ้าสั่นแรงจะดูเหมือน filter ผิวน้ำมากกว่าอากาศร้อน ในรูปนี้ช่วงราว 0.5–2 px ที่ 640×360 เป็นช่วงสำหรับสอน ไม่ใช่กฎ ค่าจริงขึ้นกับความละเอียด ระยะ และความร้อนของไฟ
ไอร้อนจริงเปลี่ยนรูปเร็วมาก ต่างกันชัดในแต่ละเฟรม noise ที่เคลื่อนช้าจะดูเหมือนวุ้นไหล ให้ animate noise ขึ้นด้านบนเร็ว ๆ
- 1Noise เร็ว ยืดแนวตั้ง
- 2Grade ให้ centred ที่ 0
- 3mask เหนือไฟ
- 4Copy เข้า u/v
- 5IDistort ค่าต่ำ
- 6Blur เล็กน้อย
อยู่ตรงไหนใน comp
ไอร้อนบิดพื้นหลังที่อยู่หลังอากาศร้อน จึงวางไว้ใต้ควันและใต้ glow ถ้าไปบิดภาพหลัง glow จะเกิดวงมืดรอบแสง
กฎเดียวกันใช้กับไอร้อนจากปากกระบอกปืน ตั้ง offset ให้เป็น 0 เพื่อไม่ให้เฟรมเลื่อน
- 1Plate
- 2Heat distortion
- 3ควัน
- 4Glow
4 ในงานจริง
ทำใน Nuke
- Noise: ยืดแนวตั้งให้เป็นเส้นเล็ก ๆ และ animate ให้ไหลขึ้นเร็วมาก
- Grade: ปิด black clamp แล้วเลื่อนค่าลง (offset หรือ blackpoint) จน map มีศูนย์กลางที่ 0
- Roto ที่ feather ไปทางด้านบน หรือ alpha ของไฟจาก Shuffle + Blur ใช้คูณ map ให้เป็น 0 นอกแนวอากาศร้อน
- Copy: ส่ง red/green ของ map เข้า forward.u / forward.v (หรือ backward) ให้ตรงกับ UV channels ของ IDistort แล้วลบ channel ที่เกินออกทีหลัง
- IDistort: UV scale คือความแรง ตั้งให้ต่ำ แล้วต่อ Blur เล็กน้อยที่ mask ด้วย mask เดียวกัน
- วางทั้งหมดนี้บนพื้นหลัง ใต้ควันและใต้ glow
พลาดบ่อย → แก้ยังไง
- ✗ ปล่อย noise ไว้ที่ 0 … 1 ทั้ง plate ไหล✓ ปิด black clamp แล้วเลื่อนค่าให้ centred ที่ 0
- ✗ ไอร้อนอยู่ข้าง ๆ หรือใต้เปลวไฟ✓ mask ให้อยู่เป็นแนวเหนือต้นไฟ จางลงด้านบน
- ✗ เลื่อนแรงจนดูเหมือน filter ผิวน้ำ✓ ลด UV scale ลงจนรู้สึกมากกว่าเห็น แล้วเติมความนุ่มนิดเดียว
- ✗ noise เคลื่อนช้า✓ animate ให้เร็วขึ้นมาก ไอร้อนจริงเปลี่ยนรูปทุกเฟรม
- ✗ บิดภาพหลัง glow จนเกิดวงมืด✓ ย้าย distortion ไปไว้ใต้ glow และใต้ควัน
เช็กก่อนส่งช็อต
- ไม่มี drift ของทั้งเฟรม ขอบภาพไม่เลื่อน
- ไอร้อนอยู่เหนือไฟเท่านั้น พื้นและหินข้าง ๆ นิ่ง
- กด play แล้วรู้สึกว่าเป็นไอร้อน ไม่ใช่ผิวน้ำ
- noise สั่นเร็ว ไม่ไหลช้าเป็นวุ้น
- distortion อยู่ใต้ควันและ glow ไม่มีวงมืด
- ลบ channel u/v ที่เกินออกแล้ว
5 เช็กตัวเอง
ส่ง noise ที่มีค่า 0 … 1 เข้า IDistort ตรง ๆ จะเกิดอะไร
🔒 ตอบคำถามด้านบนก่อน แล้วการ์ดนี้จะเปิด
1. ไอร้อนจากกองไฟควรบิดภาพตรงไหน
2. หลังใส่ heat distortion มีวงมืดรอบแสงของไฟ สาเหตุน่าจะเป็นอะไร
ตัวเลขมาจากไหน: map ของไอร้อนเป็น value noise ที่สร้างในเบราว์เซอร์ การบิดภาพเป็น IDistort แบบสอนหลักการ (อ่านค่าแบบ bilinear ใช้ map หนึ่งชุดสำหรับแกน x และหนึ่งชุดสำหรับแกน y) mask "เหนือเปลวไฟ" เป็นแนวเสาที่วาดด้วยสูตรเหนือยอดเปลว ช่วง 0.5–2 px ที่ 640×360 เป็นช่วงสำหรับสอนในรูปนี้ ไม่ใช่กฎ element ทุกชิ้นเป็นของเราเอง: จำลองด้วย Mantaflow ใน Blender 5.2 แล้วเรนเดอร์ Cycles ด้วยกล้องเดียวกับ plate (EmberGen สั่ง export แบบไม่เปิดหน้าจอไม่ได้บนเครื่องนี้) ไม่ใช้ stock element