เข้าใจกับทิศใน Environemt map

วิธีการเข้าใจทิศใน Environment map คือการนำภาพ Environment map ที่มีการบอกทิศจาก Environment map มาแล้วจาก skylibs มาแบ่งเป็นส่วนๆ

ภาพ environemnt map จาก skylibs

เนื่องจากเราจะใช้ blender ในการต่อยอดอีกจำนวนมาก skylibs กับ blender ใช้แกนไม่เหมือนกัน จึงลองนำภาพ environment map ดังกล่าวใส่เข้าไปใน blender ก่อน
 

เมื่อนำไปใส่ใน blender ผ่านแท็บ shading

ภาพหลังจากการใส่ environemt map เข้าไปใน blender 

เมื่อเปรียบเทียบแกน จะเห็นสีแสดงตามตารางดังนี้

Blender | Skylibs 
X+         |   Z- (ม่วง)
X-          |   Z+ (น้ำเงิน)
Y+         |  X- (ฟ้า)
Z+         | Y+ (เขียว)
Z-          |  Y- (เหลือง)

ต่อมาเราจะแยกภาพดังกล่าวออกมาเป็น 6 ภาพ โดยสีไม่ผสมปนเปกัน เพื่อให้แน่ใจว่าเข้าใจการทำงานของแกนต่างๆ 

โดยต่อจากนี้เราจะเขียน python โดยใช้ระบบแกนของ blender 
ถ้าเรามองจากด้านแกน X+ (มองเข้าไปยังแกน X-) เราจะเห็นสีของ environment map ดังนี้ 



เรามาลองมองหาความกว้างของสีฟ้าจากมุมสูงดูบ้าง โดยจะเป็นการมองจากมุมองด้านบน  (จาก Z+ ไป -Z) เราจะเห็นภาพดังนี้


และสุดท้ายมองจากแกน Y แต่รอบนี้ขอมองจาก (-Y ไป Y) เพื่อดูสีฟ้า จะเห็นดังนี้ 

โดยเราสามารถพิจารณาเป็นลูกบากศ์แนบในวงกลมหนึ่งหน่วยได้ ปัญหาคือ ถ้าเราอยากรู้มุมซ้ายบนของสี่เหลี่ยม จะมีพิกัดเป็นเท่าไร
โดยเราจะเริ่มจาก ให้ทั้ง 3 แกนมีค่าระยะห่างเป็น S เท่ากัน เพราะเป็นลูกบากศ์


ใช้พิทาโกรัส จะได้ว่าในระนาบ XY จะมีจุดอยู่ที่ S√2

จากนั้นใช้พิทาโกรสซ้อนอีกครั้งจะได้ S√3 และเนื่องจากมันแนบในวงกลมทำให้่ได้ว่า S√3=1 จึงแก้ได้ว่า S=√3/3



เราจะได้พิกัด 4 มุมมาเป็นค่าดังนี้




ที่นี้ลองเขียน python เพื่อดึงรูปออกมาดู ตามต่าพิกัดดังกล่าว
สมมุติเราจะสร้างภาพขนาด 256x256 
เพื่อความง่าย เราจะเริ่มจาก for loop กันก่อน โดยจะลองสร้างภาพที่มีการไล่สีจากดำไปขาว  โดยที่มุมซ้ายบนมีค่าสีเป็น 0 มุมขวาล่างมีค่าสีเป็น 1 มุมขวาบนและซ้ายล่างมีค่าสีเป็น 0.5 ซึ่งจะหาได้โดยการนำค่าสีแต่ละแกนบวกกันหาร 2 

ภาพที่ต้องการ



จากนั้นเราจะทำเปลี่ยน linspace จาก 0,1 เป็น -√3/3 ถึง -√3/3 ในแกน x และ z 
จากนั้นจะได้พิกัด XYZ มา ทำการแปลงเป็น spherical coordinate เพื่อเอาไปดึงค่าสีจาก environment map จึงสามารถแยกออกมาได้ตามด้านล่าง เท่านี้ก็จะสามารถดึงสีออกจาก environment map ออกมาเป็นส่วนๆ ได้แล้ว

Comments