φυβλαςのβλογ
บล็อกของ phyblas



[maya python] การลบโหนดวัสดุและเท็กซ์เจอร์ที่ไม่ใช้ทิ้งให้หมด
เขียนเมื่อ 2017/01/30 22:18
ปกติพอเราลบพื้นผิวโพลิกอนหรือผิว 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 ซึ่งแสดงว่าใช้แทนความโปร่งแสง เป็นต้น



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

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



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

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



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


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

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

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

หมวดหมู่

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

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

สารบัญ

รวมคำแปลวลีเด็ดจากญี่ปุ่น
python
-- numpy
-- matplotlib

-- pandas
-- pytorch
maya
การเรียนรู้ของเครื่อง
-- โครงข่าย
     ประสาทเทียม
บันทึกในญี่ปุ่น
บันทึกในจีน
-- บันทึกในปักกิ่ง
บันทึกในไต้หวัน
บันทึกในยุโรปเหนือ
บันทึกในประเทศอื่นๆ
เรียนภาษาจีน
qiita
บทความอื่นๆ

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



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

  ค้นหาบทความ

  บทความแนะนำ

หลักการเขียนทับศัพท์ภาษาจีนกวางตุ้ง
การใช้ unix shell เบื้องต้น ใน linux และ mac
หลักการเขียนทับศัพท์ภาษาจีนกลาง
g ในภาษาญี่ปุ่นออกเสียง "ก" หรือ "ง" กันแน่
ทำความรู้จักกับปัญญาประดิษฐ์และการเรียนรู้ของเครื่อง
ค้นพบระบบดาวเคราะห์ ๘ ดวง เบื้องหลังความสำเร็จคือปัญญาประดิษฐ์ (AI)
หอดูดาวโบราณปักกิ่ง ตอนที่ ๑: แท่นสังเกตการณ์และสวนดอกไม้
พิพิธภัณฑ์สถาปัตยกรรมโบราณปักกิ่ง
เที่ยวเมืองตานตง ล่องเรือในน่านน้ำเกาหลีเหนือ
บันทึกการเที่ยวสวีเดน 1-12 พ.ค. 2014
แนะนำองค์การวิจัยและพัฒนาการสำรวจอวกาศญี่ปุ่น (JAXA)
เล่าประสบการณ์ค่ายอบรมวิชาการทางดาราศาสตร์โดยโซวเคนได 10 - 16 พ.ย. 2013
ตระเวนเที่ยวตามรอยฉากของอนิเมะในญี่ปุ่น
เที่ยวชมหอดูดาวที่ฐานสังเกตการณ์ซิงหลง
บันทึกการเที่ยวญี่ปุ่นครั้งแรกในชีวิต - ทุกอย่างเริ่มต้นที่สนามบินนานาชาติคันไซ
หลักการเขียนคำทับศัพท์ภาษาญี่ปุ่น
ทำไมจึงไม่ควรเขียนวรรณยุกต์เวลาทับศัพท์ภาษาต่างประเทศ
ทำไมถึงอยากมาเรียนต่อนอก
เหตุผลอะไรที่ต้องใช้ภาษาวิบัติ?

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

2019年

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

2018年

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

2017年

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

2016年

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

2015年

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

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

ไทย

日本語

中文