φυβλαςのβλογ
phyblas的博客



maya python เบื้องต้น บทที่ ๓๙: แสงแบบต่างๆ
เขียนเมื่อ 2016/03/19 12:37
แก้ไขล่าสุด 2021/09/28 16:42
ในบทที่แล้วได้แนะนำแสงไปแบบหนึ่งแล้วคือดีเร็กชันนัลไลต์ ส่วนในบทนี้จะแนะนำอีก ๓ ชนิด

แสงทุกชนิดสามารถสร้างได้โดยฟังก์ชัน 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')





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



อ้างอิง

<< บทที่แล้ว      บทถัดไป >>
หน้าสารบัญ


-----------------------------------------

囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧

ดูสถิติของหน้านี้

หมวดหมู่

-- คอมพิวเตอร์ >> เขียนโปรแกรม >> python >> mayapython
-- คอมพิวเตอร์ >> 3D >> maya

ไม่อนุญาตให้นำเนื้อหาของบทความไปลงที่อื่นโดยไม่ได้ขออนุญาตโดยเด็ดขาด หากต้องการนำบางส่วนไปลงสามารถทำได้โดยต้องไม่ใช่การก๊อปแปะแต่ให้เปลี่ยนคำพูดเป็นของตัวเอง หรือไม่ก็เขียนในลักษณะการยกข้อความอ้างอิง และไม่ว่ากรณีไหนก็ตาม ต้องให้เครดิตพร้อมใส่ลิงก์ของทุกบทความที่มีการใช้เนื้อหาเสมอ

目录

从日本来的名言
模块
-- numpy
-- matplotlib

-- pandas
-- manim
-- opencv
-- pyqt
-- pytorch
机器学习
-- 神经网络
javascript
蒙古语
语言学
maya
概率论
与日本相关的日记
与中国相关的日记
-- 与北京相关的日记
-- 与香港相关的日记
-- 与澳门相关的日记
与台湾相关的日记
与北欧相关的日记
与其他国家相关的日记
qiita
其他日志

按类别分日志



ติดตามอัปเดตของบล็อกได้ที่แฟนเพจ

  查看日志

  推荐日志

ตัวอักษรกรีกและเปรียบเทียบการใช้งานในภาษากรีกโบราณและกรีกสมัยใหม่
ที่มาของอักษรไทยและความเกี่ยวพันกับอักษรอื่นๆในตระกูลอักษรพราหมี
การสร้างแบบจำลองสามมิติเป็นไฟล์ .obj วิธีการอย่างง่ายที่ไม่ว่าใครก็ลองทำได้ทันที
รวมรายชื่อนักร้องเพลงกวางตุ้ง
ภาษาจีนแบ่งเป็นสำเนียงอะไรบ้าง มีความแตกต่างกันมากแค่ไหน
ทำความเข้าใจระบอบประชาธิปไตยจากประวัติศาสตร์ความเป็นมา
เรียนรู้วิธีการใช้ regular expression (regex)
การใช้ unix shell เบื้องต้น ใน linux และ mac
g ในภาษาญี่ปุ่นออกเสียง "ก" หรือ "ง" กันแน่
ทำความรู้จักกับปัญญาประดิษฐ์และการเรียนรู้ของเครื่อง
ค้นพบระบบดาวเคราะห์ ๘ ดวง เบื้องหลังความสำเร็จคือปัญญาประดิษฐ์ (AI)
หอดูดาวโบราณปักกิ่ง ตอนที่ ๑: แท่นสังเกตการณ์และสวนดอกไม้
พิพิธภัณฑ์สถาปัตยกรรมโบราณปักกิ่ง
เที่ยวเมืองตานตง ล่องเรือในน่านน้ำเกาหลีเหนือ
ตระเวนเที่ยวตามรอยฉากของอนิเมะในญี่ปุ่น
เที่ยวชมหอดูดาวที่ฐานสังเกตการณ์ซิงหลง
ทำไมจึงไม่ควรเขียนวรรณยุกต์เวลาทับศัพท์ภาษาต่างประเทศ