« »

WIP = Work In Progress

by nuch

ฟู่…  ในที่สุดความเป็นไปได้มันก็เกิดแล้ว

หลังจากที่งมโข่งมึนตึ๊บตั้งนาน…  ในที่สุดก็มีแนวโน้มจะสำเร็จสักที.. กับความพยายาม render ในสไตล์เส้นพู่กัน

โชคดีที่ได้อาจารย์ที่ดี ที่พยายามเหลือเกินในการสอนคนที่ไม่รู้อะไรเลย ให้เข้าใจคอมพิวเตอร์และเรนเดอร์แมนได้
งานนี้เราอ้างอิงจาก paper เรื่อง Artistic Silhouettes: A Hybrid Approach โดย J.D. Northrup and Lee Markosian จาก Brown University ซึ่ง present ในงาน NPAR2000

ยอมรับเลยว่า ตอนแรกที่อ่าน paper ตัวนี้มึนมากๆ  เพราะเราไม่คุ้ยเคยกับภาษาทางคณิตศาสตร์ และโปรแกรมมิง ในภาษาอังกฤษ  อีกทั้งยังไม่ค่อยเข้าใจคอนเซปมันเท่าไรนัก…  ก็ได้อาจารย์ช่วยอธิบายด้วยล่ะ .. แต่ก็พอเข้าใจได้ในระดับหนึ่ง  เรายังไม่เข้าใจเรื่องการคำนวน matrix ซึ่งใช้หาค่า normal หน้ากล้องเท่าไรนัก  แต่คิดว่า จุดนี้เกิดจากความรู้ทางคณิตศาสตร์เรื่อง matrix เราอ่อนเกินไป

ไอเดียในการหาเส้น edge จาก Paper นี้ คือ หาค่า normal ของ face บน polygon โดยเปรียบเทียบ face 2 อันที่ใช้ edge ร่วมกัน .. จากนั้นเอาค่า normal ที่ได้ (ซึ่งจะไปแปลงเทียบกับ normal หน้ากล้องแล้ว … คือ หา normal ในมุมมองของกล้องที่จะใช้เรนเดอร์น่ะ) มาทำการ dot matrix หรือไงเนี่ย..  ซึ่งถ้า normal หน้าหนึ่งเป็นค่าบวก หน้าหนึ่งเป็นค่าลบ  แสดงว่า edge ที่เชื่อม faces 2 อันนั้นเป็นเส้นขอบที่จะมองเห็น …  ก็ทำการเปรียบเทียบอย่างนี้ไปทุก edge (ซึ่งกินเวลามาก ถ้าทำกับ polygon ที่มีจำนวน edges เยอะมากๆ)  ก็จะได้เส้นขอบที่ต่อเนื่อง…
…จากนั้นก็ทำการหาว่า เส้นไหนที่โดนพื้นผิวของวัตถุบัง … ซึ่งตรงนี้ อาจารย์แนะนำให้ใช้ maya plugin ที่เรียกว่า rayIntersect  ใช้ง่าย ใช้ดี และเร็วด้วย  (ฟรีอีกต่างหาก หาได้ที่ www.highend3d.com )  จากนั้นก็ project เส้นให้ไปอยู่ในระนาบ 2 มิติ  เพราะเส้นที่เกิดขึ้น ถ้ามองในระนาบ 2 มิติ จะเห็นว่ามันมีเส้นตัดทับซ้อนกันมั่วไปหมด ดูไม่เป็นเส้นเดียวกันเลย …  ซึ่งขั้นตอนตรงนี้ จะเป็นจุดเริ่มที่เราทำต่างออกไปจาก paper…
ใน paper เขาจะอธิบายด้วยการสร้าง curveID โดย random ค่า id จาก range สี  แล้วก็ sample pixel เพื่อหาทิศทางของเส้น และกำจัดเส้นเกินไป…  แต่ทว่า..  เรายังไม่มีความสามารถพอที่จะทำอย่างนั้นได้…  แน่นอนว่า melscript มันค่อนข้างมีข้อจำกัด.. ในการ sample pixel .. จนบัดนี้ เรายังไม่รู้เลยว่า  mel มันทำได้ด้วยหรือ … แต่ถ้าเป็น python น่ะทำได้แน่ๆ …  แต่เราก็เพิ่งศึกษา python … และอาจารย์ก็ดูสภาพแล้ว คงไม่สำเร็จแน่ๆ ด้วยประสบการณ์ python อันน้อยนิดของเรา…   อีกทั้งพอดีว่า เราเสนอไอเดียที่จะใช้ mel script หาค่า curve intersect ด้วย..   ก็เลยเลยเถิดมา.. …
เมื่อหาค่าเส้นตัดกันได้ และทำการสรุปได้ว่าจะเอาเส้น curve ไหน ไม่เส้นไหน และเส้นไหนเชื่อมกันได้  ถึงขั้นตอนนี้ เราควรจะเหลือเส้นใน scene ได้น้อยที่สุด จนเกือบเท่าจำนวนเส้นที่ลากจริง… 
… ด้วย Renderman studio ตัวใหม่ล่าสุดที่มาแทน Renderman Artist Tool … (ใหม่มาก.. ชนิดที่ว่า ยังไม่วางขายสักที แต่มีให้ทดลองใช้ที่โรงเรียน และ studio บางที่…  และแน่นอน ยังไม่มีเวอร์ชั่นโจรสลัด) ที่มีคำสั่งพิเศษที่ทำให้เรนเดอร์เส้น curve ได้ (ที่จริง RAT ก็มีนะ แต่ว่าอาจารย์อยากให้ใช้ RMS น่ะ) และยังใส่ shader/texture ให้เส้น curve ได้ด้วย…   เราก็กำหนดความหนาของเส้น และใส่ texture พู่กันไป…  (ภาพที่เห็น เราใส่ texture ไปในส่วน opacity… ส่วน color เราแค่เลือกสีธรรมดา.. ) …  ก็ได้ดั่งภาพที่เห็น…

ที่จริง มันก็ยังไม่เสร็จดีซะทีเดียว  ที่ผ่านมา วุ่นวายกับการหาเส้น สร้างเส้น เลือกเส้น เขียนสคริป loop กันมั่วไปหมด…   อย่างที่ขึ้นหัวข้อ มันคือ Work In Progress…
หลังจากนี้ เราก็คงพัฒนาต่อในเรื่องของการทำงานกับแสง โดยใช้ light source เป็นตัวกำหนดจุดเริ่มต้นของเส้นพู่กัน และ ใช้ค่าแสง เป็นตัวกำหนดความหนาของเส้นด้วย

ที่จริง สคริปตัวนี้ก็มีปัญหาอีกอย่างคือเรื่องที่มันใช้เวลาคำนวนค่อนข้างนาน  อย่าง torus ตัวนี้มี 800 edges ซึ่งใช้เวลาเรนเดอร์ราวๆ 30 วินาทีต่อเฟรม…  เคยลองทดสอบกับโมเดลมังกรที่เป็น low-res มี 7012 edges แล้ว ใช้เวลาเกิน 15 นาที ในการเรนเดอร์ต่อเฟรม …  เรียกว่านานโขอยู่นะ  (แต่ก็เคย render งานที่เฟรมละ 35 นาทีมาแล้วนะ…) 
ปัญหาอีกข้อคือ.. มันกินแรมมากๆ  ไม่รู้ว่าเป็นที่มายาเองหรือเปล่า แต่ยิ่งเรนเดอร์ไป ยิ่งเสียแรมมากขึ้น  เหมือนกับว่ามันไม่ clear cache เมื่อเรนเดอร์จบแต่ละเฟรมเลย …  อาจารย์ก็แนะนำว่า ถ้าเขียนใหม่ด้วย c++ ให้เป็น Plugin ไปเลย มันจะทำงานเร็วขึ้น และก็ไม่เสียแรมมากขนาดนี้… 
….
-__-‘
เฮ้อ… เรียนอีกภาษาหรือเนี่ย…  แต่ว่าเดี๋ยวโรงเรียนก็ปิดแล้ว คงทำไรมากไม่ได้ เพราะไม่มี RMS (Renderman studio) ที่บ้าน…   อาจจะลองทำ UI ให้ใช้งานง่ายๆ หรือถ้าบ้าพอ ก็คงลองเขียนเป็น Plugin ดู…
:-)

One Response to “WIP = Work In Progress”

  1. Jack Says:

    อืมมม ที่ว่า Maya rend แล้ว RAM หมดนี่ ใช้ renderer อะไรหรอคับ
    ใช่ MentalRay ป่าว ถ้าใช่ก็ไม่แปลกหรอก
    แต่ถ้าไม่ใช่ลอง rend แบบ command line ดู (render)

    อ่า อิจฉาคนได้ใช้ renderMan Studio อยากลองใช้มั่งจัง
    เอามาฝากหน่อยจิ

    555555

Leave a Reply

:D :-) :( :o 8O :? 8) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: