φυβλαςのβλογ
บล็อกของ 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
ภาษา mongol
ภาษาศาสตร์
maya
ความน่าจะเป็น
บันทึกในญี่ปุ่น
บันทึกในจีน
-- บันทึกในปักกิ่ง
-- บันทึกในฮ่องกง
-- บันทึกในมาเก๊า
บันทึกในไต้หวัน
บันทึกในยุโรปเหนือ
บันทึกในประเทศอื่นๆ
qiita
บทความอื่นๆ

บทความแบ่งตามหมวด



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

  ค้นหาบทความ

  บทความแนะนำ

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

บทความแต่ละเดือน

2024年

1月 2月 3月 4月
5月 6月 7月 8月
9月 10月 11月 12月

2023年

1月 2月 3月 4月
5月 6月 7月 8月
9月 10月 11月 12月

2022年

1月 2月 3月 4月
5月 6月 7月 8月
9月 10月 11月 12月

2021年

1月 2月 3月 4月
5月 6月 7月 8月
9月 10月 11月 12月

2020年

1月 2月 3月 4月
5月 6月 7月 8月
9月 10月 11月 12月

ค้นบทความเก่ากว่านั้น

ไทย

日本語

中文