Posted by: thitipat | มีนาคม 13, 2008

CityGen (Real-Time City Generator)

หายไปพักใหญ่เลย วุ่นมากครับกับงานเอกสารปริญญานิพนธ์ แทบจะเอาไม้บรรทัดมาวัดเลยก็ว่าได้ ล่าสุดวันนี้ก็ส่งแล้วเรียบร้อย (แกะเล่มปริญญานิพนธ์ 1 รอบเพราะปกในตกตัว s ไปตัวนึง)

หลังจากที่ส่งเอกสารต่างๆ เรียบร้อยแล้ว เลยเอาเวลาที่มีมาเผยแพร่เรื่องงานที่ทำซักหน่อย ถือว่าเป็นการกระจายความรู้อีกทางหนึ่ง

บ่นซะเยอะเลย ก่อนอื่นก็ต้องขอขอบคุณผู้มีพระคุณเหล่านี้ก่อน

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

และคนที่อยากจะขอบคุณมากที่สุดก็คือแม่และพ่อที่ช่วยขัดเกลาผมให้ไม่หลงไปในทางที่ผิด และคอยสั่งสอนในเรื่องต่างๆ ขอบคุณที่ให้ผมได้เรียนในสิ่งที่รัก… ขอบคุณครับ

โปรเจ็คนี้เกิดมาจากความคิดที่อยากจะสร้างเครื่องมืออะไรซักอย่างที่จะใช้ในการสร้างภาพกราฟิกส์ 3 มิติ โดยอัตโนมัติเพื่อนำไปใช้ในเกมส์หรือภาพยนต์ได้ แต่ก็ยังนึกไม่ออกว่าจะสร้างอะไรดี พอดีได้มีโอกาส เห็นงานวิจัยเรื่อง Procedural Modeling of Buildings และ Procedural Modeling of Cities

คุยไปคุยมาก็มาลงตัวที่การสร้างเมืองด้วยการใช้ Multi-Agent

สำหรับงานนี้ก็ทำด้วยภาษา Python บนระบบปฏิบัติการ Ubuntu 7.10 เครื่องมือที่ใช้ก็มีตามนี้ครับ

  • wxGlade
  • Python Imaging Library (PIL)
  • Numpy
  • Soya 3D

ออกตัวไว้ก่อนว่างานนี้ก็ไม่ได้สวยสมจริงอะไรเลยครับ (ยังจะกล้าเอามาโชว์อีกนะ - -”) งานนี้ก็ใช้การประยุกต์เรื่อง Perlin Noise ในการสร้างภาพสำหรับนำมาใช้เป็นแผนที่บอกระดับความสูงจากค่าสี (Gray-Scale) และ Multi-Agent ซึ่งเป็น AI อย่างหนึ่งที่จะตอบสนองกับเงื่อนไขที่เรากำหนดไว้ เราก็นำมาใช้แทนประชากรที่จะเลือกตั้งถิ่นฐานตามสภาพภูมิประเทศที่เหมาะสม โดยโมเดลในการเลือกตำแหน่งที่เราได้จากการสังเกตุก็คือ

  1. เมืองจะมีลักษณะการกระจายตัวแบบปกติ (หนาแน่นที่จุดศูนย์กลาง ถ้านึกไม่ออกก็ให้เราลอง นึกถึงเมืองจริงๆ ดูว่าตามแถบชานเมืองจะมีคนอาศัยไม่หนาแน่นเท่ากับใจกลางเมือง)
  2. การเลือกตั้งถิ่นฐานจะพิจารณาจากปัจจัยเรื่องแหล่งน้ำกับสภาพภูมิประเทศ
  3. การเลือกสร้างบ้านของประชากรก็จะพิจารณาจากเพื่อนบ้าน ถ้าไม่มีเพื่อนบ้านก็จะมีโอกาสน้อยลงที่จะสร้างบ้าน ซึ่งได้แนวคิดมาจาก Boids Algorithm

การเลือกตั้งถิ่นฐานนั้นเราก็จะทำบนภาพ 2 มิติก่อนแล้วค่อยนำไป Render เป็น 3 มิติอีกทีหนึ่งหลังจากที่นั่งปรับนู่นปรับนี่ไปเรื่อยๆ งานนี้ก็ออกมาหน้าตาดังภาพครับ ^^


เมืองจะมีการเติบโตบริเวณศูนย์กลาง

ประชากรจะสร้างที่อยู่ใกล้แหล่งน้ำกับที่ราบ
มุมนี้จะเห็นชัดเจนว่ากลางเมืองหนาแน่นกว่าชานเมือง
งานนี้ยังไม่มีการปรับพื้นที่ก่อนสร้างอาคารเลยเห็นถนนเอียงๆ แบบนี้ - -”

ขั้นตอนการทำงานก็มีประมาณนี้ครับ

  1. สร้างภาพแผนที่ความสูงขึ้นมาก่อน จากนั้นก็คำนวณระดับน้ำ
  2. ปรับค่าการกระจายตัวของประชากร
  3. ปรับเปลี่ยน Texture และ ปิด/เปิด เอฟเฟ็คต์ต่างๆ
  4. สั่ง Render

โปรแกรมก็จะทำการแสดงผลในรูปแบบ 3 มิติ ออกมาครับ

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

ต่อไปผมก็จะค่อยๆ ทยอยเขียนพวกเรื่องอื่นๆ ที่เกี่ยวข้องกับงานนี้ เช่น เรื่องการสร้าง GUI ด้วย wxGlade หรือว่าการสร้างไฟล์เดเบียนแพ็คเก็จสำหรับโปรแกรมที่ทำด้วยภาษาไพธอน ฯลฯ ครับ ไว้หลังจากทำ tutorial ให้กับทาง soya 3d เสร็จแล้วจะรีบโพสต์ให้อ่านกันครับ ^^

Responses

ที่หนึ่งเฟ้ย 5555

ขอบใจนะ คราวหลังไม่ต้องบอกก็ได้ - -”

Great!

PS. Why dont you port this to run on Window?

No plan yet, its a prototype. I think I must change many things.

เยี่ยม…ยอด…มาก

Leave a response

Your response:

หมวดหมู่