ShadowWares Forum

Programming (Applications) => GUI Applications & Graphics Programming => ข้อความที่เริ่มโดย: ac_toto ที่ พฤษภาคม 15, 2012, 02:26:19 pm



หัวข้อ: จะทำรูปสามเลี่ยมให้มีมิติได้อย่างไรครับ
เริ่มหัวข้อโดย: ac_toto ที่ พฤษภาคม 15, 2012, 02:26:19 pm
ผมใช้ GLUT สร้าง สามเหลี่ยมขึ้นมาสองรูป แล้วต้องการที่จะให้มันมีมิติ แบบมีแสงแล้วเห็นถึงความลึกครับ
จากที่ลองหาดูใน Google เหมือนว่าจะมีแต่แบบที่เป็นของเขาเช่น glutSolidSphere , glutSolidTeapot เป็นต้น
ผมไม่ทราบว่าตาม Code ของผมทางด้านล่างจะสามารถสร้างเป็นพื้นผิวแล้วมีมิติ มีแสง มีเงา ได้อย่างไรครับ

ของคุณครับ...

Code: (c)
   glClearColor (0.9,0.9,0.9,0.0);
    glMatrixMode(GL_PROJECTION);
    glOrtho(-100.0f, 100.0f, -100.0f, 100.0f, 100.0f, -100.0f);
    glMatrixMode(GL_MODELVIEW);

    glLoadIdentity();

   glRotatef (-15.0, 1.0, 0.0, 0.0);
    glRotatef ( 15.0, 0.0, 1.0, 0.0);
    glColor3f(0.4, 0.4, 0.4);

   glColor3f((rand()%101)/100.0, (rand()%101)/100.0, (rand()%101)/100.0);
   glBegin(GL_TRIANGLES);
      glVertex3f(  50.0, -50.0, -50.0 );
      glVertex3f(  50.0, -50.0,  50.0 );
      glVertex3f( -50.0, -50.0,   0.0 );

      glVertex3f(  50.0, -50.0, -50.0 );
      glVertex3f( -50.0, -50.0,   0.0 );
      glVertex3f(   0.0,  50.0,   0.0 );
   glEnd();


หัวข้อ: Re: จะทำรูปสามเลี่ยมให้มีมิติได้อย่างไรครับ
เริ่มหัวข้อโดย: ShadowMan ที่ พฤษภาคม 15, 2012, 02:50:59 pm
GLUT เป็นหน้ากากของ OpenGL และ OpenGL สามารถทำได้ทุกอย่าง ว่าด้วยเรื่องของสามมิติ หมายรวมถึงแสงและเงาด้วย ครับ
ลองไล่ดู Link ด้านล่าง ว่าอันไหนคือสิ่งที่กำลังสนใจอยู่

(http://www.shadowwares.com/forum/images/reserved_for_member.png) (http://www.shadowwares.com/forum/index.php?action=register)


หัวข้อ: Re: จะทำรูปสามเลี่ยมให้มีมิติได้อย่างไรครับ
เริ่มหัวข้อโดย: ac_toto ที่ พฤษภาคม 15, 2012, 03:54:29 pm
ผมลองดูตามลิงค์ต่างๆที่ให้มาแล้วครับ สิ่งที่ผมต้องการคงจะประมาณตามลิงค์ด้านล่างครับ
http://www.shadowwares.com/forum/index.php?topic=677.0 (http://www.shadowwares.com/forum/index.php?topic=677.0)

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

พอลอง random สีต่างๆมาใส่ก็พอจะมองออกว่าเป็นอะไรขึ้นมาหน่อย
ใส่รูป ขยายเมื่อเมาส์ชี้

สิ่งที่ผมต้องการจริงๆควรจะเป็นประมาณรูปนี้ครับผม ( ไม่ใช่รูปเดียวกันกับด้านบนครับ )
ใส่รูป ขยายเมื่อเมาส์ชี้


หัวข้อ: Re: จะทำรูปสามเลี่ยมให้มีมิติได้อย่างไรครับ
เริ่มหัวข้อโดย: ShadowMan ที่ พฤษภาคม 15, 2012, 04:02:13 pm
ถ้าไม่มีแสงและเงา มิติจะไม่มีทางเกิดขึ้นได้เลยครับ
เอ... คุณกำลังทำ texture mapping/blending อยู่หรือเปล่า?


หัวข้อ: Re: จะทำรูปสามเลี่ยมให้มีมิติได้อย่างไรครับ
เริ่มหัวข้อโดย: ac_toto ที่ พฤษภาคม 15, 2012, 04:21:14 pm
ผมกำลังทำตามลิงค์นี้อยู่ครับ คือการเอาจุดต่างๆมาประมวลผล แล้วสร้างออกมาเป็นพื้นผิวแบบ 3D
http://www.cgal.org/Manual/latest/doc_html/cgal_manual/Surface_reconstruction_points_3/Chapter_main.html#chap:surface_reconstruction_points_3 (http://www.cgal.org/Manual/latest/doc_html/cgal_manual/Surface_reconstruction_points_3/Chapter_main.html#chap:surface_reconstruction_points_3)

ที่นี้พอผมทำไปแล้วก็ได้ไฟล์ Object File Format (.off) มาตามลิงค์ด้านล่างนี้
http://segeval.cs.princeton.edu/public/off_format.html (http://segeval.cs.princeton.edu/public/off_format.html)

เสร็จแล้วก็ต้องเอาไฟล์นี้มาสร้างเป็นรูปในแบบ 3D (ที่กำลังพยายามทำอยู่)
ซึ่งในไฟล์จะบอกเป็นรูปสามเหลี่ยมทั้งหมด แล้วเอามาวาดจะได้รูปตามความเห็นที่แล้ว

ต้องขออภัย ผมไม่ทราบว่าเขาเรียกว่า texture mapping/blending หรือเปล่าครับ ?


หัวข้อ: Re: จะทำรูปสามเลี่ยมให้มีมิติได้อย่างไรครับ
เริ่มหัวข้อโดย: ShadowMan ที่ พฤษภาคม 15, 2012, 04:52:52 pm
ok, ผมเข้าใจความหมายแล้วครับ
สิ่งที่คุณกำลังทำเข้าเรียกว่า Image Reconstruction และวิธีที่เห็นนั้นใช้สามเหลี่ยมอันเล็กๆ เพื่อมาสร้างเป็นบริเวณแสงน้อย (หลอกตา เรื่องแสงและเงาด้วยลายเส้น)
หากต้องการทำสิ่งนี้ด้วย GLUT หรือ OpenGL ไม่แนะนำครับ เพราะเป็นเรื่องที่ยากเอาเรื่อง ให้ใช้ CGAL  (http://www.cgal.org/)แทนน่าจะง่ายกว่ามาก นอกจากนี้ตัวที่น่าสนใจ และอาจจะง่ายกว่าคือ Algorithm พวก mesh และ polyhedron ซึ่งคาดว่าเป็นความสามารถหนึ่งของ CGALเช่นกัน

โดยส่วนตัวผมยังไม่เคยเล่นพวกนี้บน C เคยเล่นแต่บน MATLAB เพื่อเรียนรู้หลักการของมันเทานั้น จึงให้คำตอบที่ชี้ชัดไม่ได้

ในกรีที่ต้องการ Reconstruct object file แบบไม่มีการประมวลผลอะไร ให้ export ไฟล์ object จากโปรแกรมพวก 3D Design ออกมาได้เลยครับ วิธีการนี้สารถแก้ได้โดย OpenGL based ทั้งหลายได้เลย แนะนำให้ใช้ GLM, GLU เข้ามช่วย จะง่ายขึ้่นมาก


หัวข้อ: Re: จะทำรูปสามเลี่ยมให้มีมิติได้อย่างไรครับ
เริ่มหัวข้อโดย: ac_toto ที่ พฤษภาคม 15, 2012, 05:55:45 pm
ผมใช้ฟังก์ชันของ CGAL ในการคำนวณต่างๆ จากที่ดูๆมาคิดว่าทาง CGAL ไม่มีฟังก์ชันสำหรับแสดงผลออกมาให้เราเห็น
แต่ว่า CGAL จะให้ Output มาอยู่ในรูปแบบของไฟล์แทน โดยไฟล์ที่ได้นั้นมีนามสกุล .OFF
ผมจึงลองไปแกะดูว่าข้างในมันบอกอะไรเราบ้าง แล้วเอามาเขียนโปรแกรมแสดงผลเอง
ส่วนตัวผมไม่เคยเขียนโปรแกรมเป็นกราฟิกมาก่อน เห็นว่า OpenGL มีคนใช้อยู่เยอะ ก็เลยคิดว่าน่าจะเป็นตัวเลือกที่ ok ที่สุด

อยากถามว่า ถ้าผมต้องการจะแสดงผลอย่างที่เคยได้เขียนไป มี Tool หรือ Library อะไรที่น่าจะเหมาะสมบ้างครับ


หัวข้อ: Re: จะทำรูปสามเลี่ยมให้มีมิติได้อย่างไรครับ
เริ่มหัวข้อโดย: ac_toto ที่ พฤษภาคม 15, 2012, 05:57:02 pm
ลืมไป... GLM, GLU คืออะไรเหรอครับ ไม่เข้าใจ ?


หัวข้อ: Re: จะทำรูปสามเลี่ยมให้มีมิติได้อย่างไรครับ
เริ่มหัวข้อโดย: ShadowMan ที่ พฤษภาคม 15, 2012, 06:04:12 pm
อ้างถึง
อยากถามว่า ถ้าผมต้องการจะแสดงผลอย่างที่เคยได้เขียนไป มี Tool หรือ Library อะไรที่น่าจะเหมาะสมบ้างครับ
ผมเองก็ไม่ได้คลุกคลีอยู่กับ Image Reconstruction จึงไม่ทราบเช่นกันว่ามี Tool หรือ Library อยู่หรือไม่ แต่โดยส่วนตัวคิดว่ามี เพราะสิ่งนี้เกิดขึ้นมานานมากแล้ว น่าจะมีคนพัฒนามาปล่อยแล้วครับ

GLM, GLU จะช่วยให้เรานำ Object file มา render เป็น 3D Model ได้ง่ายขึ้นครับ

ทั้งสองประเด็นลอง google ดูครับ


หัวข้อ: Re: จะทำรูปสามเลี่ยมให้มีมิติได้อย่างไรครับ
เริ่มหัวข้อโดย: ac_toto ที่ กรกฎาคม 22, 2012, 02:07:04 am
ขอบคุณมากครับสำหรับคำแนะนำต่างๆ หลังจากที่ผมพยายามสร้าง surface จาก point set ที่ได้มาจาก laseranfinder
โดยใช้ library ที่ชื่อ CGAL ผมก็พบปัญหาว่า การที่ใช้ library ของคนอื่นนั้นทำให้งานออกมาไวก็จริง
แต่ผมไม่สามารถเข้าใจและปรับเปลี่ยนค่า parameter ให้เป็นไปได้ตามต้องการ เพราะหลายสิ่งหลายอย่างมันสำเร็จอยู่ใน function ของเขาแล้ว

ตอนนี้ผมเลยเปลี่ยนเป็นเขียนขึ้นมาเองทั้งหมด โดยทำตาม paper ตามลิงค์ด้านล่าง
https://dl.dropbox.com/u/36273063/Surface%20Reconstruction%20from%20Unorganized%20Points%20%28Hugues%20Hoppe%29%20from%20Homepage.pdf (https://dl.dropbox.com/u/36273063/Surface%20Reconstruction%20from%20Unorganized%20Points%20%28Hugues%20Hoppe%29%20from%20Homepage.pdf)
https://dl.dropbox.com/u/36273063/Surface%20reconstruction%20from%20unorganized%20points%20%28Presentation%29%20%28Hugues%20Hoppe%29.pdf (https://dl.dropbox.com/u/36273063/Surface%20reconstruction%20from%20unorganized%20points%20%28Presentation%29%20%28Hugues%20Hoppe%29.pdf)

ในลิงค์แรกครับ ตรงหน้าที่ 2 หัวข้อที่ 1.1 Terminology ในย่อหน้าที่ 2
เขาสมมุติว่า X คือ เซตของ point ทั้งหมดที่ได้มาจากการ scan วัตถุใดๆ(M)
แล้วก็บอกอีกว่า X ที่ได้มานั้นจะมี noise รวมอยู่ด้วย เขียนเป็นสมการได้ว่า x(i) = y(i) + e(i)
โดย y(i) คือจุดจริงๆของวัตถุ และ e(i) คือ ค่า error
แล้วต่อจากนั้นผมก็ไม่ค่อยเข้าใจว่า เขาใช้หลักการหรือสมการอะไรมาคิดหาค่า e(i) ทั้งหมดเหรอครับ


หัวข้อ: Re: จะทำรูปสามเลี่ยมให้มีมิติได้อย่างไรครับ
เริ่มหัวข้อโดย: ShadowMan ที่ กรกฎาคม 22, 2012, 07:44:57 am
งานนี้ถ้าไม่พึงไลบรารี่ ก็คงลำบากสักหน่อยนะครับ
แต่ในเมื่อมั่นใจว่าไลบรารี่นั้นมันไม่ตอบโจทย์จริงๆ ก็คงต้องว่ากันไปตามความเหมาะสม

ลองเปิดไฟล์ และอ่านส่วนที่คุณบอกดูผ่านๆ แล้ว เขาไม่ได้บอกการคำนวณ และไม่มีสมการให้ดู ผมก็ไม่สามารถคาดเดาได้ (เพราะผมไม่ได้อยู่ในวงการนี้)
ทำ Thesis คุณจะเจอกับอะไรแบบนี้เป็นเรื่องปรกติวิสัย เพราะจะให้เขามาแจกแจงทั้งหมดให้ก็ใช่ที่ เพราะเนื้อที่มีจำกัด
นั่นคือเหคุผลว่าทำไม นักศึกษา โท เอก จึงต้องอ่าน paper กับนับหลายร้อย และต้องลงมือพิสูจน์ทฤษฎีต่างๆ ในเชิงปฏิบัติ มากมาย
เพื่อให้ได้มาซึ่งแนวความคิดโดยรวมของ วงการงานวิจัยที่เขาเหล่านั้นกำลังทำอยู่

จากนี้ไป คงต้องตั้งหน้าตังตาไล่ล่าหา paper ที่เกี่ยวข้องมาอ่านให้มากที่สุดเท่าที่จะทำได้ครับ
จากประสบการณ์ส่วนตัว หากต้องการทราบทฤษฎีในระดับที่มาที่ไป ให้อ่านจาก paper เก่าๆ
เพราะ paper ใหม่ๆ เขาจะไม่ค่อยกล่าวถึงอะไรที่เป็นพื้นฐาน หรือแนวคิดที่ได้กล่าวมาแล้วใน paper ก่อนหน้า
ในรูปแบบแจกแจงรายละเอียด เพราะเหมาเอาว่าเป็นอะไรที่รู้ๆ กันอยู่แล้ว
paprer อ้างอิง [?] จะเป็นตัวนำทางได้ในระดับหนึ่ง ว่าจะต้องอ่านอะไร