ใน
บทที่แล้วได้แนะนำแสงไปแบบหนึ่งแล้วคือดีเร็กชันนัลไลต์ ส่วนในบทนี้จะแนะนำอีก ๓ ชนิด
แสงทุกชนิดสามารถสร้างได้โดยฟังก์ชัน shadingNode() แต่ว่าก็มีฟังก์ชันเฉพาะสำหรับสร้างอยู่ ซึ่งในบทนี้จะใช้ฟังก์ชันเหล่านั้น
สำหรับสป็อตไลต์ใช้ฟังก์ชัน spotLight()
สำหรับพอยนต์ไลต์ใช้ฟังก์ชัน pointLight()
สำหรับแอมเบียนต์ไลต์ใช้ฟังก์ชัน ambientLight()
เริ่มจากสป็อตไลต์ ซึ่งเป็นแสงที่ปล่อยออกมาจากจุดจุดหนึ่ง โดยพุ่งไปยังมุมที่จำกัดบริเวณหนึ่ง คล้ายไฟที่ฉายจากไฟฉาย
คล้ายกับดีเร็กชันนัลไลต์ตรงที่ทิศทางที่หันมีผลต่อแสงที่ออกมา แต่มีค่าที่จำเป็นต้องปรับมากกว่า
ตารางแสดงค่าต่างๆของแสงแสงแบบสป็อตไลต์ พร้อมชื่อแฟล็กที่ใช้ในฟังก์ชัน spotLight()
ชื่อในรายการ |
ชื่อเต็ม |
ชื่อย่อ |
ชื่อย่อแฟล็ก |
คำอธิบาย |
減衰率 |
decayRate |
de |
d |
การลดหลั่นแสงตามระยะทาง |
円錐角度 |
coneAngle |
ca |
ca |
มุมขอบเขตของแสง ต้องกว้างไม่ถึง 180 |
周縁部の角度 |
penumbraAngle |
pa |
p |
ขอบเขตแสงสลัวที่ขอบ |
ドロップオフ |
dropoff |
dro |
do |
การลดหลั่นแสงตามระยะห่างจากมุมใจกลาง |
カラー |
color |
c |
rgb |
สีของแสง แบ่งย่อยเป็น cr cg cb |
強度 |
intensity |
in |
i |
ความเข้มแสง |
レイ トレース シャドウの使用 |
useRayTraceShadows |
urs |
rs |
เปิดใช้เงาแบบเรย์เทรซชาโดว |
シャドウ カラー |
shadowColor |
sc |
sc |
สีของเงา แบ่งย่อยเป็น scr scg scb |
深度マップシャドウの使用 |
useDepthMapShadows |
dms |
ไม่มี |
เปิดใช้เงาเด็ปธ์แม็ปชาโดว |
解像度 |
dmapResolution |
dr |
ไม่มี |
กำลังแยกภาพของเด็ปธ์แม็ปชาโดว |
อันไหนที่ไม่มีในแฟล็กจะไม่สามารถกำหนดค่าได้ตั้งแต่ตอนสร้าง ต้องมาปรับในภายหลัง
นอกจากนี้ตำแหน่งที่ตั้งของแสงก็จะมีผล ดังนั้นจังไม่ใช่แค่ปรับมุมการหมุนเหมือนอย่างดีเร็กชันนัลไลต์
เพื่อเป็นตัวอย่างลองเริ่มสร้างดูเลย ตัวอย่างคราวนี้ลองสร้างโต๊ะหินที่มีผิวขรุขระขึ้นมาตัวหนึ่งเป็นวัตถุทดสอบ แล้วสร้างดวงไฟมาส่องสว่างบนนี้อันหนึ่ง
import random
for i in range(4):
mc.polyCube(w=6,h=100,d=6,sy=20,n='khato%d'%(i+1))
for j in range(84):
mc.move(random.uniform(-2,2),0,random.uniform(-2,2),'khato%d.vtx[%d]'%(i+1,j),r=1)
mc.move(40,50,40)
mc.rotate(0,90*i,0,p=[0,0,0])
mc.polyCube(w=100,h=5,d=100,sx=20,sy=1,sz=20,n='tohin')
mc.move(0,100,0)
for i in range(881):
mc.move(random.uniform(-1,1),random.uniform(-2,2),2*random.uniform(-1,1),'tohin.vtx[%d]'%i,r=1)
mc.spotLight(ca=80,i=2,n='duangfai')
mc.move(0,125,50)
mc.rotate(-30,0,0)
mc.setAttr('duangfaiShape.dms',1)
mc.setAttr('duangfaiShape.dr',8192)
จะเห็นว่าแสงไฟกระทบบริเวณส่วนหนึ่งของโต๊ะ และบริเวณที่โดนแสงก็สว่างเท่ากันทั้งหมด (ภาพตัวอย่างนี้ไม่ได้เปิดโหมดให้แสดงเงาด้วย)
แต่ในธรรมชาติจริงๆแล้วจะไม่เป็นแบบนั้น แสงควรจะต่างไปตามตำแหน่ง เพราะยิ่งห่างจากแหล่งกำเนิดแสงก็ยิ่งได้รับพลังงานลดลง
เราสามารถปรับการลดหลั่นของแสงได้ที่ค่า decayRate (de) โดยการลดหลั่นแสงนั้นมีอยู่ ๔ แบบ
0 แสงไม่ลดลงตามระยะทาง (ค่าตั้งต้น)
1 แสงลดลงเป็นสัดส่วนกับระยะทาง (เชิงเส้น)
2 แสงลดลงเป็นสัดส่วนกับระยะทางกำลังสอง
3 แสงลดลงเป็นสัดส่วนกับระยะทางกำลังสาม
โดยทั่วไปในธรรมชาตินั้นแสงที่แผ่ออกจากแหล่งกำเนิดจะลดลงแบบกำลังสอง นั่นคือ d=2
ลองปรับ
mc.setAttr('duangfaiShape.in',1000)
mc.setAttr('duangfaiShape.de',2)
นอกจากนี้หากปรับดร็อปออฟ dropoff (dro) ก็จะทำให้ได้แสงที่ค่อยๆสลัวลงเมื่อห่างจากใจกลางมุมที่แสงฉาย
ลอง
mc.setAttr('duangfaiShape.dro',20)
ส่วน penumbraAngle (pa) เป็นการเพิ่มบริเวณที่ได้รับแสงเป็นบางส่วนเพิ่มเข้ามารอบๆ
ลอง
mc.setAttr('duangfaiShape.dro',0) # เอาดร็อปออฟออกก่อน
mc.setAttr('duangfaiShape.pa',30)
ต่อไปลองลบแสงไฟเดิมออกแล้วลองใช้ไฟเป็นสีดู สร้างดวงไฟคล้ายอันเดิมส่องบนโต๊ะอันเดิมแต่ตั้งสีให้เป็นแดง, เขียว และ น้ำเงิน แยกกันอย่างละดวงแล้วส่องมาจากคนละทิศ
for i in range(3):
mc.spotLight(rgb=[i==0,i==1,i==2],n='fai%d'%(i+1))
mc.move(0,125,50)
mc.rotate(-30,i*120,0,p=[0,125,0])
แบบนี้ก็ออกมากลายเป็นไฟเจ็ดสีคล้ายกับสัญลักษณ์ของช่องเจ็ดสีทีวีเพื่อคุณ
ลองลบแล้วสร้างใหม่โดยแต่งเติมใส่แฟล็กอะไรต่างๆก็จะดูสวยไปอีกแบบ
for i in range(3):
mc.spotLight(rgb=[i==0,i==1,i==2],ca=80,i=10000,d=2,do=15,n='fai%d'%(i+1))
mc.move(0,125,50)
mc.rotate(-30,i*120,0,p=[0,125,0])
อีกอย่างหนึ่งที่สป็อตไลต์สามารถทำได้ก็คือเอฟเฟ็กต์หมอกแสง (ライト フォグ, light fog)
ในธรรมชาตินั้นโดยทั่วไปเวลาที่แสงส่องลงมาโดยปกติแล้วเราจะไม่เห็นลำแสงแต่จะเห็นแค่แสงที่กระทบตัววัตถุ
แต่เมื่อมีฝุ่นละอองในอากาศมากก็จะทำให้เราเห็นแสงเป็นลำได้ ปรากฏการณ์แบบนี้สามารถทำได้ในมายา
เพียงแต่เนื่องจากว่าการใช้โค้ดเพื่อสร้างหมอกแสงขึ้นนั้นค่อนข้างยุ่งยาก และจะเห็นหมอกแสงได้ก็ต่อเมื่อเรนเดอร์เท่านั้น ดังนั้นในตอนนี้จะยังไม่พูดถึง
มาดูไฟชนิดต่อไป คือพอยนต์ไลต์
พอยนต์ไลต์จะคล้ายกับสป็อตไลต์ตรงที่เป็นแสงที่พุ่งออกจากจุดกำเนิดหนึ่งไป รอบๆ แต่ต่างกันตรงที่แสงจะพุ่งออกไปทุกทิศทางไม่ใช่แค่มุมใดมุมหนึ่ง
ดังนั้นพอยนต์ไลต์จึงไม่มีค่า coneAngle, penumbraAngle และ dropoff แบบที่สป็อตไลต์มี และการปรับมุมที่หมุนก็จะไม่มีผล แต่มีค่า decayRate และตำแหน่งที่ตั้งของไฟก็มีผลเช่นเดียวกัน
ลองลบสป็อตไลต์เดิมแล้วใส่พอยนต์ไลต์ที่มีความสว่างเท่าเดิมลงไปแทนดู
for i in range(3):
mc.pointLight(rgb=[i==0,i==1,i==2],i=10000,d=2,n='duangfai%d'%(i+1))
mc.move(0,125,50)
mc.rotate(-30,i*120,0,p=[0,125,0])
ก็จะได้แสงคล้ายเดิม เพียงแต่ว่าแสงส่องไปทั่ว ไม่มีขอบเขต
สุดท้าย แสงแอมเบียนต์ไลต์ เป็นแสงที่ง่ายที่สุด คือแค่วางลงในฉากก็ทำให้วัตถุทั้งหมดสว่างขึ้นมา ไม่สำคัญว่าอยู่ตรงไหนหรือหันไปทางไหน ไม่มีขอบเขตจำกัด สิ่งที่ปรับได้มีเพียงแค่ความสว่างและสีเท่านั้น สามารถใช้เป็นแสงเสริมเพื่อให้ทั้งฉากดูสว่างขึ้น
ลองสร้างแสงแอมเบียนต์ขึ้นเติมจากตัวอย่างที่แล้วโดยให้แสงปรับเพิ่มขึ้นตามเวลา
mc.ambientLight(n='saengsoem')
mc.expression(s='saengsoemShape.in = time/2')
จะเห็นว่าแสงมีอยู่หลากหลายแบบและสามารถปรับแต่งได้มากมาย หากเลือกใช้และปรับแต่งดีๆก็จะทำให้ได้ภาพที่สวยงามตามที่ต้องการ
อ้างอิง