หน้าแรก · Lab · FX elements: ไฟ ควัน ระเบิด

FE4 Heat distortion

ไอร้อนต้องสั่นอยู่กับที่ เหนือไฟ และเบามาก

FX elements: ไฟ ควัน ระเบิด · ~6 นาที · ฟรี

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 0

2 ลงมือลอง

โจทย์: ทำให้ไอร้อนดูน่าเชื่อ ไม่มี drift อยู่เฉพาะเหนือเปลวไฟ และเบาพอ (UV scale 0.5–2 px ช่วงสอนของเรา)

แก้ตามตัวเลขการเลื่อนทั้งเฟรมและค่าการบิดข้าง/ใต้เปลวไฟก่อน แล้วดูตอนเล่น (เล่นอยู่แล้วตั้งแต่เริ่ม) ตัดสิน UV scale ด้วยตา ควรรู้สึกว่าเป็นไอร้อน ไม่ใช่ผิวน้ำ

SkyVFX Lab · FE4interactive · 1001

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 ขึ้นด้านบนเร็ว ๆ

  1. 1Noise เร็ว ยืดแนวตั้ง
  2. 2Grade ให้ centred ที่ 0
  3. 3mask เหนือไฟ
  4. 4Copy เข้า u/v
  5. 5IDistort ค่าต่ำ
  6. 6Blur เล็กน้อย

อยู่ตรงไหนใน comp

ไอร้อนบิดพื้นหลังที่อยู่หลังอากาศร้อน จึงวางไว้ใต้ควันและใต้ glow ถ้าไปบิดภาพหลัง glow จะเกิดวงมืดรอบแสง

กฎเดียวกันใช้กับไอร้อนจากปากกระบอกปืน ตั้ง offset ให้เป็น 0 เพื่อไม่ให้เฟรมเลื่อน

  1. 1Plate
  2. 2Heat distortion
  3. 3ควัน
  4. 4Glow

4 ในงานจริง

ทำใน Nuke

  1. Noise: ยืดแนวตั้งให้เป็นเส้นเล็ก ๆ และ animate ให้ไหลขึ้นเร็วมาก
  2. Grade: ปิด black clamp แล้วเลื่อนค่าลง (offset หรือ blackpoint) จน map มีศูนย์กลางที่ 0
  3. Roto ที่ feather ไปทางด้านบน หรือ alpha ของไฟจาก Shuffle + Blur ใช้คูณ map ให้เป็น 0 นอกแนวอากาศร้อน
  4. Copy: ส่ง red/green ของ map เข้า forward.u / forward.v (หรือ backward) ให้ตรงกับ UV channels ของ IDistort แล้วลบ channel ที่เกินออกทีหลัง
  5. IDistort: UV scale คือความแรง ตั้งให้ต่ำ แล้วต่อ Blur เล็กน้อยที่ mask ด้วย mask เดียวกัน
  6. วางทั้งหมดนี้บนพื้นหลัง ใต้ควันและใต้ 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 เช็กตัวเอง

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

ส่ง 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