تبليغاتX
OpenGL & Computer graphics - مقالات آموزش OpenGL قسمت دهم

مقالات آموزش OpenGL قسمت دهم. این مقاله توسط دوست عزیزم آقای محمد عباسی ترجمه و تایپ شده است. ضمن تشکر از این دوست عزیز این مقاله را به همه دوستان و علاقمندان تقدیم میکنم.

 

كشيدن خطوط در فضاي سه بعدي :

 

در درسهاي قبل با تابع GL_POINTS آشنا شديم و ديديم كه ميتونيم از اون براي كشيدن  نقطه اي در فضا استفاده كنيم.در اين درس چگونگي رسم يك خط با استفاده از دو راس ( vertex) رو در فضاي سه بعدي ياد ميگيريم. اين كار رو با استفاده از تابع GL_LINES انجام ميديم. تكه كد زير خطي را بين دو نقطه (0 , 0 , 0 ) و (50 و 50 و 50 ) براي ما رسم ميكند.

 

                                                           

 

دقت كنيد كه براي رسم هر خط بايد دو نقطه تعريف شود.

نكته : اگر تعداد نقاط تعريف شده فرد باشند تابع  GL_LINES نقطه آخر را به حساب نمي آورد.

 

در نمونه پايين تكه كدي پيچيده تر را ميبينيد و در آخر نتيجه حاصل از كد را :

 

           

 

             

 

خطوط نواري و خطوط حلقه اي :

 

در پايين ما دو تكه كد را كه در آنها از تابع GL_LINE_STRIP استفاده شده مي آوريم. در تكه كدي كه از GL_LINE_STRIP استفاده شده  خطوط به صورت ادامه دار از ورتكس اول به ورتكس هاي بعدي رسم ميشوند. اما در GL_LINE_LOOP خطوط به همان ترتيب GL_LINE_STRIP رسم ميشوند با اين تفاوت كه در آخر ورتكس انتهايي با يك خط به اولين ورتكس متصل ميشود.

GL_LINE_LOOP راه خوبي براي رسم منحني هاي بسته است.

 

                                          

 

                                            

 

همان تكه كد اين بار با   GL_LINE_LOOP:

 

 

                                             

                                      

 

نزديك كردن خطوط منحني به خطوط صاف :

 

قبلا نمونه كدي را با نام The Points داشتيم.  براي ياد آوري عكس مربوط به آن را دوباره تكرار ميكنم.

                                       

خوب در اون نمونه كد شما ديديد كه چطور ميشه نقاط را در يك شكل فنري مانند كنار هم مرتب كرد. شما ميتونستيد نقاط را به هم نزديك تر هم بكنيد. اين كار رو با كوچك كردن سايز افزايش زاويه ميشد انجام داد. با نزديك تر كردن نقاط شما شكلي نرم تر خواهيد داشت. اما با  كوچك كردن سايز افزايش زاويه سرعت كار پايين مياد و اين مورد تو پروژه هاي بزرگ مشكل ساز ميشه . راه بهتر براي نزديك كردن نقاط و داشتن شكلي نرم تر استفاده از GL_LINE_STRIP هستش.

با استفاده از GL_LINE_STRIP شما بدون اينكه لازم باشه تمام اون نقاط مياني رو تعريف كنيد شكلي نرم تر خواهيد داشت. كار تعريف اون نقاط رو خود تابع انجام ميده. در پايين نمونه كدي رو كه شكل بالا رو درست ميكنه آورديم اما اين بار به جاي GL_POINTS از GL_LINE_STRIP استفاده كرديم. نتيجه كار رو كه شكلي نرم تر هستش در پايين ميبينيد. اين تكنيك در جاهاي زيادي كاربرد داره.

                                                                       

تعيين پهناي خطوط :

 

قبلا در مورد اينكه چطور ميشه سايز نقاط رو دستكاري كرد صحبت كرديم. در اينجا تابعي رو معرفي ميكنيم تا با استفاده از اون پهناي خطوط رسم شده رو تعيين كنيد.تابع مورد استفاده glLineWidth هستش.

تابع glLineWidth تنها يك مقدار ميپذيره. اين مقدار كه بر حسب پيكسل بايد داده بشه پهناي خطوط رسم شده رو تعيين ميكنه. دقيقا به مانند تابع  point size در اين تابع هم شما محدود به مقادير مجاز براي پهناي خطوط هستيد. تكه كد زير محدوده پهنا و گام هاي مجاز رو براي پنهاي خطوط تعريف ميكنه

 در تكه كد بالا آرايه ي sizes دو مقدار رو شامل ميشه که كوچك ترين و بزرگترين سايز ممكن براي glLineWidth است. در ضمن متغير step گام هاي مجاز رو در بين اين محدوده براي پهناي خطوط تعيين ميكنه. ويرايش مايكروسافت از OpenGL محدوده پهنا بين 0.5 تا 10 و گام هاي 0.125 رو پشتيباني ميكنه. در پايين تكه كد پيچيده تري رو براي نمونه از اين تابع آورديم.

در اين كد كار كشيدن خطوط از y=-90 شروع ميشه و پس از كشيدن هر خط ابتدا 20 واحد در روي محور y به بالا و بعد 1 واحد به پهناي خطوط اضافه ميشه و خط بعدي كشيده ميشه.

 

                            

 

                                              

 

به كد ها دقت كنيد. اين بار به جاي استفاده از glVertex3f از glVertex2f استفاده كرده ايم. چرا چون ما داريم خطوطمون رو توي صفحه xy ميكشيم پس نيازي به z نداريم.

 

ترسيم خطوط با استفاده از نقاط يا الگوها :

علاوه بر تنظيم پهناي خطوط شما ميتونيد يك خط رو با استفاده از نقاط يا الگو ها بسازيد که به اين كار  stippling میگویند. ابتدا ما اين خصيصه را فعال ميكنيم.

 

                                                                                  

سپس تابع  glLineStipple كار برپايي الگوي مورد استفاده براي كشيدن خطوط را انجام ميدهد.

 

                                

ياد آوري: هر خصيصه اي كه با استفاده از glEnable فعال بشه با استفاده از glDisable ميشه غير فعالش كرد.

پارامتر pattern  يك مقدار 16 بيتي ميباشد كه الگويي را براي كشيدن خطوط فراهم مي آورد. هر بيت تكه اي از خط رو مشخص ميكنه و اينكه on باشه يا off ( يعني كشيده بشه يا نه) بطور پيش فرض هر بيت مشخص كننده يك pixel هستش اما پارامتر factor  يك افزايش دهنده براي پهناي الگو رو فراهم مياره.  براي مثال وقتي factor رو روي 5 بگذاريم هر بيت مشخص كننده 5 پيكسل ميشه و اينكه اين 5 پيكسل خاموش باشن يا روشن. يعني كشيده بشن يا نه. در پايين نمونه اي از اين الگوها رو ميبينيد.

 

                              

چرا اين الگوها برعكس عمل ميكنن؟ نكته تو بالا بردن سرعته. OpenGL اينجوري سريعتر عمل ميكنه.

يك بار ديگه تكه كدي كه براي كشيدن خطوط به كار برديم رو تكرار ميكنيم اما اين بار از تابعGL_LINE_STIPPLEبراي تعيين الگوي كشيدن خطوط استفاده ميكنيم. 

 

                    

 

                                     

 

در پايان اين درس يك نمونه حرفه اي تر از استفاده از كد هايي كه تا اين جلسه آموزش داديم رو در يك عكس مشاهده ميكنيد.

 

            

 

نسخه PDF این مقاله را میتوانید از این آدرس دریافت نمایید.

                                                                        http://www.rogepost.com/dn/e7jt/OpenGL.rar    

 

منبع : کتاب OpenGL SuperBible 3rd Edition

مترجم : محمد عباسی ( سلطان )

کلیه حقوق این مقاله به وبلاگ www.OpenGL.Blogfa.com و مترجمین آن تعلق دارد. لعنت به کسانی که بدون نام بردن از منبع ترجمه کننده آن را در وبلاگ یا سایت خود قرار میدهند. بدیهی است که دوستان میتوانند با نام منبع و مترجم مطالب را در وبلاگ یا سایت خود منتشر نمایند.

 

 

+ نوشته شده توسط ( ساسان و محمد ) در شنبه هجدهم شهریور 1385 و ساعت |
Image and video hosting by TinyPic