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

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



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

  ค้นหาบทความ

  บทความแนะนำ

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

ไทย

日本語

中文