Programming

LOD ชื่อนี้สำคัญไฉน ?

posted on 19 May 2008 13:06 by azimuth3d  in Programming

หลังจากที่เรา คลุกตัวเองอยู่กับการ Design หน้าตาของ terrain ของเราอยู่นาน คราวนี้เรามาหาวิธีทำให้มันเป็นจริง ในแบบ real time กันดีกว่า

Basic Mesh

วิธีสร้าง mesh จาก heightmap ที่เรามี ก็คือ การสร้าง patch ย่อยๆ ให้มีจำนวนเท่ากับ heightmap ใจแต่ละด้านจำนวน 2n

จาก Wireframe เราจะเห็นครับว่า เราสร้าง mesh ของ terrain อย่่างไรหนึ่ง patch มี 2 polygon ที่เห็นเป็นจุด Vertex แต่ละจุดนั่นเราจะใช้ค่า y จาก heightmap มากำหนดค่า

ดูจากโค้ดข้างล่างเราจะสร้างข้อมุลของ vertex ใน component x และ z โดยการวนลูป


double dStartX = - 100.0;

double dStartZ = -100.0;

const unsigned int uNumPatch = 513;

Vertex patch[uNumPatch ][uNumPatch ];

for(unsigned int i = 0; i < uNumPatch; i++)
{

for(unsigned int j = 0; j < uNumPatch; j++)
{

 

patch[i][j].x = dStartX + i;

patch[i][j].z =dStartZ + j;

patch[i][j].y = heightmap[i][j];

}

}
แค่นี้เราก้ได้ ข้อมุลของแต่่ละ patch แล้วละนะ แต่สำหรับแต่ใช้งานจริง ๆ มันไม่ง่ายแบบนี้นะสิครับ เพราะถ้า Terrain ของเรามีขนาดใหญ่ ซ่ะ ใครๆ ก็อยากให้มันมีขนาดใหญ่ละ พื้นที่แคบ ๆ ไม่สวยงามแน่นอน เวลาเรา render แล้วใช้ความละเอียดปกติ ทำให้โปรแกรมของเราทำงานข้าลง ดงั้นัน้ จึงมีการคิดค้น technique ที่เรียกว่า LOD (Level of Detail) ขึ้น

LOD หรือ Level Of Detail นั่นเป็นเทคนิคที่เราจะเลือกใช้ในการเลือกความละเอียดของ mesh สมัพันธ์กับความจำเป็นที่ต้องใช้งาน อย่างเช่น ถ้า mesh นั่นอยู่ใกล้เราจะใช้ polygon ทั้งหมดในการ render แต่เมื่อมันห่าง ออกไป ไกล ห่างออกไป ไกลซ่ะเหลือเกิน ไปโน่นแล้ว เราจะลดความละเลียดของ mesh ลง โดยใช้ Algorithm หลายๆรูป แบบในการจัดการ งงไหม เนี่ย ถ้าคุณงง คุณไมรู้ เราจะตามไปดู แต่ถ้าคุณเข้าใจที่ผมบ่นมาแล้ว ไม่ต้องดูนะ :P


ภาพยอดฮิตสำหรับการอธิบาย เกี่ยกวับ LOD น้อง bunny กระต่ายน้อยเป็นสัตว์ ตัวแรกที่เค้าใช้ทดลองกันครับ ก็คล้ายกับ Utah Teapot ละนะ :P จากที่เห็น เรามีกระต่ายตัวเดียวแต่ มีหลายๆ Resolution แต่ก็คงรูปร่างเดิมไว้ จากนั้นเราลองเอามาวางในตำแหน่งที่ห่างจากจุดเรามอง เริ่มจากตัวที่มีจำนวน polygon มากที่สุด ไปถึง ตัวที่ ขี้เหร่ ที่สุด ผมเรียกงั้นละนะ (แทบจะไม่ใช่กระต่ายแล้วละ ) พอจะเห็นประโยชณ์ของ LOD ยังละ เมือ่วัตถุอยู่ไกลออกไป เราสามรถใช้ความละเอียดที่ตำ่ลงตามไปด้วยได้ โดยไม่เห็นความเปลี่ยนแปลง

มีถึงวิธิการ ส่วนนี้ยากเข้าขั้นพอสมวรใคร ปวดหัวไปหายาแก้ปวดมากินได้ อนุุญาติ เอ้า ลุยกันต่อ จะเขียนแค่คร่าวๆ นะครับ

Mesh Simplification

ก็ตรงๆ ครับไม่อ้อมค้อม Simply ก็คือทำให้ง่ายขึ้นนั่นเอง การลดความาซับซ้อนของ Mesh ดูจากภาพ

เรียก Edge Collape ครับ เป็นการลบ Edge หรือ เส้้นที่เชื่อมระหว่าง Vertex นั่นละออก ไปซ่ะ

ยิ่งมีอีกหลายวิธีเพื่อที่จะสร้าง LOD ในแต่ละ level อาเหนื่อยคราวหน้ามาว่ากันต่อ ละกันนะครับ ....

 



edit @ 19 May 2008 19:15:41 by azimuth3d

งานของเราเป็นงานด้าน Computer Graphicใช้การคำนวนเยอะ แหละ ต้องอาศัย hardware ที่ทำงานเกี่ยวกับ Graphic อย่าง VGA card มาช่วยคำนวนด้วย และสิ่งที่ทำให้ได้ มาซึ่ง ประสิิทธิภาพ และ คุณภาพของงานคือ แก๊สโซฮอล .......

Graphic API ตังหาก

ในยุคปัจจุบันสำหรับเครื่อง PC มีอยู่ 2 ตัวคือ

Direct3D หรือ Direct Graphic ผลิตผลของบริษัทยัักษใหญ่ Microsoft

ตัว SDK นั้นฟรี มีครบเรื่องสร้างเกมส์ แล้วยัง Support คอมโซลยอดฮิต Xbox360 ด้วย

OpenGL เป็น library ด้าน graphic ที่ใช้กันมานมนาม 10 กว่าปีแล้วครับ open นี่ที่คือ เปิดกว้างตามชื่อละ และยังเปิดเป็น open source อีกด้วย มีให้ใช้งานกันบนทุกระบบจริงๆ ไม่เว้นแม้่แต่ มือถือ PDA หรือ Hanheld device อื่นๆ น่าสนใจไหมละครับ

เอาเป็นว่าผมเลือก OpenGL แล้วกันเพราะผมใช้ linux อาไม่ต้องกลัว สำหรับแฟน Windows (ของแท้) แต่ละระบบมี library ที่แตกต่างกันไป ขึ้นอยุ่กับ ตัว compiler ที่เราใช้ การเขียนไม่แตกต่างกันครับ แล้วผมจะใช้ library ที่เป็นตัวกลางระหว่างระบบ กับ โปรแกรมของเรา เขียนเหมือนกันทุกประการ แต่ เอาไปใช้ compile ใช้งานในแต่ละระบบเท่านั้นเอง

ภาษาโปรแกรม

C/C++ เพราะต้องใช้ native ผมคิดว่านะ ถึงแม้เครื่องในปัจจุบันจะแรง มากก็ตาม แต่สำหรับงานในรูปแบบนี้ต้องใช้พลังของเครื่องมหาศาล

IDE(Integreted Development Environment)

ตัวที่มีให้ใช้ ทุกบน Windows และ linux ขอแนะนำ www.codeblocks.org ครับ พัฒนาเรื่ือยๆ จนมี Feature ที่น่าสนใจ อย่างสามารถใช้ compiler ได้หลายตัว ๆ แม้แต่ Tri core

GLUT

OpenGL Utility Toolkit เป็น library สำหรับสร้าง application และมีคำสั่งช่วยงานหลายอย่างมาก ถือว่าเป็นตัวกลางของเรา กับระบบเเลยทีดียว และลดงานของการ setup เพื่อใช้งาน OpenGL ในแต่ละระบบด้วย

สำหรับ Mingw32 หาได้จาก

http://www.martinpayne.me.uk/software/development/OpenGL/GLUT/GLUT-MinGW-3.7.6-2.mp.zip

สำหรับสาวก linux ใช้ freeglut ครับผม :D

http://freeglut.sourceforge.net/

 

edit @ 19 May 2008 01:02:11 by azimuth3d

edit @ 19 May 2008 11:35:13 by azimuth3d

มาเร่ิมสร้าง Terrain กัน

posted on 16 May 2008 22:41 by azimuth3d  in Programming

ก่อนอื่นเราต้องหาวิธีเก็บข้อมูลของภูมิประเทศของเราก่อนวิธีที่ง่าย และ ใช้เนื้อที่ในการเก็บน้อยคือ

Height Field Terrain

แปลงตรงตัวคือ "สนามความสูง" แค่นี้เราก็รู้แล้วละว่า terrain ของเราจะแบ่งออกเป็น Cell ย่อยๆ ซึ่งแต่ละส่วนย่อยๆ นั้นจะมีค่าความสูงต่างกันไป เพื่อให้เกิดภูมิประเทศ

จากรูป ด้านซ้ายจะเป็นข้่อมูลที่เราเก็บไว้ในไฟล์ เราจะเก็บในภาพ แบบ Grey Scale 256 สี เพราะเราต้องการเก็บความสูงเท่านั้น เพียงพอครับ ข้างล่างตัวอย่างของไฟล์ที่ใช้เก็บ height map

อยู่ในรูปแบบของภาพครับ ลองมาดูวิธีิีสร้างกันคร่าวๆ ก่อนอื่น เปิด gimp ขึ้นมาทำงานก่อน แล้วไปที่ Script Fu->Patterns->Render Map จะได้หน้าต่าง Set ค่าสำหรับสร้าง height mเลือก

เลือก gradient เป็น Default เพราะต้องการแค่ ดำ -> ขาว เท่านั้น ส่วน image size และ granularity ซึ่งเป็นค่าความละเอียดของแต่ละหน่วยใน terrain แล้วจะ Set ครับ ตามใจชอบ

มีอีกวิธีหนึ่งที่จะสร้าง heightmap ได้หลากหลายและ ได้ดั่งใจกว่านี้ครับ คือใช้โปรแกรมที่สร้าง Terrain ด้วยเฉพาะอย่าง

Terraform สำหรับผู้้ที่ใช้ linux และ Mac OS ถ้าใช้ Debian Base ( ubuntu , mint , TLE ....) ลงได้จาก synaptic หรือ apt-get เลยครับ

หรือว่าถ้าใช้ M$ Windows และ Mac OS ก็ต้อง Terragen (free for non-commercial)

ใน blog นี่ผมจะอธิบาบวิธีใช้คร่าวๆ แค่ Terraform เพราะผมเป็นแฟน linux อิอิ

พอเราได้ terraform มาอยู่่ในมือแล้ว จัดการ new terrain เลยวิธีการสร้างของ เค้ามีหลายแบบคือ

  • perlin noise สร้างความสูงจากการใช้ noise function
  • fractal ข้อมูลจากากรคำนวนที่รููปแบบซ้ำๆ มีแบบแผน
  • subdivision แบ่งพื้นผิวเป็นส่วนย่อยสร้างรายละเอียด ของ terrain

ผมเลือก Perlin noise นะครับ จากนั้นไปที่ File->New->Perlin noise

จะได้ Terrain ที่มีหลายสี แสดงสำหรับแต่ละส่วน คือ พื้นน้ำ พื้นราบ แล้ว ที่สูง เรียงตามลำดับความสูงซึ่งพื้นที่แต่ละชนิดสูงต่างกัน

เปลี่ยน view เป็น 3d light จะเห็นภาพคร่าวว่า Render ออกมาแล้วจะเป็นอย่างไร สวยงามหรือเปล่า

จบไปอีกหนึ่งตอน พักก่อนครับ ติดตามต่อไปตอนหน้า :D

edit @ 16 May 2008 22:42:54 by azimuth3d

edit @ 16 May 2008 23:02:42 by azimuth3d

Natural System Demo Project

posted on 16 May 2008 22:38 by azimuth3d  in Programming
ตัวผมเองตอนนี้มีโปรเจคสำคัญที่จะใช้ในการเปิด Studio อิสระที่ กำลัง form ตัวอยู่ละนะ = = ( หาสตางค์อยู่คร้าบ) เมื่อคิดถึงว่า Natural หรือ ธรรมชาติในความหมายกว้างๆ คือ สิ่งแวดล้อมล้อมตัวที่เป็น ธรรมชาติ เช่น ป่า ภูเขา แม่น้ำ ทะเล หรือ มหาสมุทร ตอนนี้ทรัพยากรของไทยเราเหลือน้อยมาก เราก็เลยมาสร้าง scene ที่เกี่ยวกับธรรมชาติซ่ะเลย ส่วนประกอบของงานเรามีอะไรบ้างลองมาดูกันเลย

Terrain หรือ ภูมิประเทศ ใช้สร้างส่วนที่เป็นผืนป่า ภูเขา หรือ พื้นดินที่ราบสูง

ภาพตัวอย่างเอามาจากเว็บชาวบ้านอีกที ไม่ว่ากันนะ เป็นภููมิประเทศที่มีความสูงต่ำแตกต่างกันเราจะมาว่ากันอีกทีเรื่องของการ render อีกที และ การจัดการ

พื้นน้ำ ทะเล หรือ มหาสมุทร หลายชื่อเหลือเกิน สรุปได้ว่าคือพื้นน้ำที่มีบริเวณกว้างในส่วนนี้จะมีการเคลื่อนไหวด้วย คือคลื่นในท้องทะเล เองและ คลื่นที่กระทบฝั่ง (ยากไปอกีแนะ )

ท้องฟ้า และ เฆม

สีท้องฟ้าที่สมจริง และ เหมาะกับช่วงเวลาของวันทำให้ Scene ดูน่าสนใจมากขึ้น ด้วยการสร้าง SkyDome ครอบส่วนที่พื้นที่ทั้งหมด ส่วนเฆมจะใช้กลุ่มของ particle โดยคำนวนการกระเจิงของแสงของก้อนเฆมด้วย

  1. เครื่องคอมพิวเตอร์ สำคัญมากละเนี่ย Spec ของเครื่องนั้นไม่ต้องมากมายครับ ยอ้นไป ไม่เกิน 7 ปีจากนี้ สามารถทำงานนี้ได้ แบบ fairly good
  2. ระบบปฎิบัติการ หรือ OS แล้วแต่สะดวกครับ เพราะงานนี้ผมใช้ OpenGL ซึ่งไม่ยึดติดระบบอยู่แล้ว ผมใช้ Ubuntu 8.04 (Hardy heron ) สำหรับ สาวก linux เฮกันได้เลยครับ :)
  3. โปรแกรมที่ใช้คือ Gimp , Terraform และ Blender 3 ตัวครอบจักรวาล
คราวหน้าเรามาดูเรื่องรายละเอียดขอแต่ละส่วนกัน :D

วันแรกกับ Exteen

posted on 16 May 2008 22:11 by azimuth3d  in Programming

หลังจากที่เริ่มคิดจะเขียน blog ของตัวเองมานานหลายเดือน  คืนนี้พึ่งได้รับคำแนะนำจากเพื่อนที่คุย m ด้วยกันว่าต้องเขียนที่ Exteen สิ มีคนเข้ามาอ่านแน่นอน (นึกในใจว่า เออ จริงเหรอ ลองดูละกัน) แต่บังเอิญคิดดังไปหน่อยเพื่อนจึงยกตัวอย่าง blog ที่มีเนื้อหาสาระ ใกล้เคียงกับ Style การเขียนของผมให้ ดู อืม มันจริงๆ ด้วยแฮะ   งั้นขอเกริ่นก่อนแล้วกันนะ ว่า Blog แห่งนี้จะมีเนื้อหาเรื่องอะไรบ้าง

  • Game Programming   ส่วนนี้หาย๊ากยาก สำหรับประเทศเรา บทความที่เขียนกันอยู่ยังไม่เจาะลึกเท่าไหร่  ผมจึงรับอาสาเจาะให้ คอยติดตามอ่านละกัน
  • Technique การใช้ Linux   ผมใช้ Linux มานานพอสมควร หลายปีแล้วละ  จึงมีหัวใจเป็น OSS ครับ Linux จงเจริญ! โปรดคอยติดตามชม
  • เรื่องทั่วไป สับเพเหระ (บ่น)  เรื่องของตัวผม เรื่องของชาวบ้าน เรื่องคนข้างบ้าน เรื่องของ blog ชาวบ้าน อันสุดท้ายนี้ไม่เขียนละนะ  = = ล้อเล่น  รับรองว่าเช้มข้น
  • สุดท้าย รุปสวยๆ กับ trip  ที่มันส์สุดๆ   ตัวผุ้เขียนเอง เป็นช่างภาพ สมัครเล่นด้วย แม้ ฝีมือยังไม่เทพ  แต่บ่ยั้น จะเก็บภาพสวยๆมาให้ดูกัน

:D 

 

edit @ 16 May 2008 22:24:29 by azimuth3d