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



[maya python] การลบโหนดวัสดุและเท็กซ์เจอร์ที่ไม่ใช้ทิ้งให้หมด
เขียนเมื่อ 2017/01/30 22:18
แก้ไขล่าสุด 2021/09/28 16:42
ปกติพอเราลบพื้นผิวโพลิกอนหรือผิว NURBS ที่ไม่ต้องการออกจากฉากไป หากผิวนั้นเป็นผิวที่ได้มีการป้อนวัสดุให้ไว้ วัสดุที่เคยสร้างไว้จะยังคงเหลืออยู่ไม่ได้หายไปไหน ทั้งที่ก็อาจไม่ได้จำเป็นต้องใช้แล้ว

หากวัสดุไม่ได้ใช้แล้วเหลือไว้ก็ไม่มีประโยชน์ ลบทิ้งดีกว่า แต่บางทีเราก็อาจขี้เกียจมานั่งไล่ดูว่าวัสดุอันไหนที่ไม่ได้ใช้แล้วบ้าง

แต่หากใช้การเขียนโค้ดแล้วก็สามารถทำให้ค้นหาและลบของที่ไม่ใช้ออกได้โดยอัตโนมัติไม่ยากนัก

นอกจากจะลบโหนดของวัสดุแล้ว สิ่งที่ควรลบไปด้วยก็คือเชดดิงกรุปของวัสดุนั้นๆ ซึ่งโดยปกติจะถูกสร้างขึ้นมาพร้อมกัน

แล้วนอกจากนี้ที่ยังอาจต้องการลบไปด้วยก็คือพวกโหนดของเท็กซ์เจอร์ต่างๆซึ่งเชื่อมต่ออยู่กับวัสดุ เช่นเท็กซ์เจอร์รูปภาพจากไฟล์ ดังนั้นเราจะให้โปรแกรมทำการลบไปด้วย

แล้วก็สำหรับโหนดไฟล์ภาพนั้นอาจมีการเชื่อมต่ออยู่กับโหนด placed2d หรือ placed3d ด้วย ดังนั้นหากมีก็ควรจะลบไปด้วย

โค้ดที่จะใช้เขียนได้ดังนี้
# ลบวัสดุ
tr = mc.ls(tr=1)
for mat in mc.ls(mat=1):
    try:
        sg = mc.listConnections(mat+'.outColor')[0]
    except: continue
    for con in mc.listConnections(sg):
        if(con in tr):
            break
    else:
        try:
            mc.delete(mat)
            mc.delete(sg)
            print(u'ลบ '+mat+u' และ '+sg)
        except: 0

# ลบ bump
for b in mc.ls(typ='bump2d')+mc.ls(typ='bump3d'):
    if(mc.listConnections(b+'.outNormal')==None):
        mc.delete(b)
        print(u'ลบ '+b)

# ลบ multiplyDivide และ plusMinusAverage
for b in mc.ls(typ='multiplyDivide')+mc.ls(typ='plusMinusAverage'):
    if(mc.listConnections(b+'.output')==None):
        mc.delete(b)
        print(u'ลบ '+b)

# ลบเท็กซ์เจอร์

place2d = mc.ls(typ='place2dTexture')+mc.ls(typ='place3dTexture')

for tex in mc.ls(tex=1):
    pla = ''
    for con in mc.listConnections(tex,c=1):
        if('.out' in con):
            break
        if(pla=='' and con in place2d):
            pla = con
    else:
        mc.delete(tex)
        print(u'ลบ '+tex)
        if(pla):
            mc.delete(pla)
            print(u'ลบ '+pla)

แค่รันโค้ดนี้โหนดวัสดุที่ไม่ถูกใช้ก็จะถูกลบออกทั้งหมด รวมทั้งเท็กซ์เจอร์ทั้งหมดที่เคยเชื่อมกับวัสดุเหล่านั้นด้วย

คำสั่งหลักๆที่ใช้ก็คือ ls() ซึ่งเอาไว้ลิสต์รายชื่อโหนดชนิดต่างๆตามที่กำหนด โดย mc.ls(mat=1) คือลิสต์โหนดวัสดุทั้งหมด และ mc.ls(tex=1) คือลิสต์เท็กซ์เจอร์ทั้งหมด

และอีกคำสั่งที่สำคัญคือ listConnections() ใช้เพื่อตรวจหาความเชื่อมโยงระหว่างโหนด

รายละเอียดมีเขียนไว้ในเนื้อหามายาไพธอนบทที่ ๓๐ สามารถอ่านเพิ่มเติมเพื่อทำความเข้าใจได้

เงื่อนไขที่ตรวจว่าให้ลบวัสดุก็คือดูว่ามีชื่อของโหนดที่เป็นทรานสฟอร์มอยู่ในลิสต์การเชื่อมต่อหรือไม่ โดย mc.ls(tr=1) คือการลิสต์โหนดที่เป็นทรานสฟอร์มทั้งหมด

โปรแกรมจะวนหาซ้ำตามวังวน for ถ้าหาแล้วเจอการเชื่อมต่อก็จะเข้าเงื่อนไขแล้ว break ออกไป แต่ถ้าวนจนครบทั้งหมดแล้วยังไม่เข้าเงื่อนไขก็แสดงว่าไม่พบการเชื่อมต่อใดๆ ก็จะเข้ามาที่ else ซึ่งมีคำสั่ง delete ซึ่งทำการลบทั้งวัสดุและเชดดิงกรุ๊ปของวัสดุนั้นทิ้งไป

ส่วนเงื่อนไขที่ตรวจว่าให้ลบเท็กซ์เจอร์ก็คือดูว่ามีการเชื่อมต่อที่มี .out อยู่หรือไม่ ดังนั้นจะไม่ถูกลบตราบใดที่เจอ .outColor ซึ่งแสดงว่าใช้เป็นสีอยู่ หรือ .outTransparency ซึ่งแสดงว่าใช้แทนความโปร่งแสง เป็นต้น



เพื่อเป็นการทดสอบการใช้งาน อาจลองทดสอบการใช้ด้วยการสร้างพื้นผิวที่ใช้วัสดุที่มีลายดังที่สร้างไว้ในเนื้อหามายาไพธอนบทที่ ๓๖

เช่น ลองสร้างตารางโกะดังในตัวอย่างสุดท้ายขึ้นมา ซึ่งจะมีการสร้างโหนดวัสดุขึ้นมา ๔ อัน คือ ๔ อันทางซ้ายนี้ (ส่วน ๓ อันทางขวาเป็นวัสดุตั้งต้นที่มีอยู่แล้วแต่แรก เราจะไม่ไปยุ่งมัน)



หลังจากสร้างพื้นผิวขึ้นมาเสร็จก็ลองเอาโค้ดไปรันดูก็จะพบว่าไม่เกิดอะไรขึ้น เพราะว่าวัสดุกำลังเชื่อมต่อกับผิวอยู่

แต่หลังจากนั้นถ้าเราลองลบพื้นผิวออกไป แล้วก็เอาโค้ดมารันอีกที ก็จะพบว่าโหนดวัสดุและโหนดไฟล์ถูกลบทิ้งไปด้วย



วิธีการเขียนโค้ดทั้งหมดนี้เรียบเรียงขึ้นมาเอง ไม่ได้อ้างอิงจากที่ไหน จึงอาจไม่ใช่วิธีที่ดีที่สุด บางทีอาจมีวิธีที่ดีกว่านี้อยู่ก็เป็นได้ หากใครสามารถเขียนให้ดีและทำงานเร็วกว่านี้ก็มีลองแนะนำกันได้เช่นกัน


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

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

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

หมวดหมู่

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

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

目录

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

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

按类别分日志



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

  查看日志

  推荐日志

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