صفحه 1 از 10 123 ... آخرآخر
نمایش نتایج 1 تا 40 از 376

نام تاپیک: آموزش OpenGL

Hybrid View

پست قبلی پست قبلی   پست بعدی پست بعدی
  1. #1
    کاربر دائمی آواتار amin1softco
    تاریخ عضویت
    شهریور 1386
    محل زندگی
    پای آن سرو بلند
    پست
    1,832

    آموزش OpenGL

    با سلام خدمت همه ی دوستان گل خودم
    من از امروز قصد دارم در ایام عید کتاب گرافیک کامپیوتری را که این ترم امتحان دارم را هر بخشش رو خلاصه کنم و بنویسم اینجا تا دوستان اول استفاده کنند بعد اگه کج فهمی درش وجود داره یا فوت کوزه گری داره برای ما باز گو کنند و یک ایجاد انگیزه ایی بشه برای من تا کتاب رو کامل مطالعه کنم به هر حال فردا اولین خلاصه را قرار می دم البته اگه تشویقم کنید
    آخرین ویرایش به وسیله amin1softco : جمعه 21 اسفند 1388 در 20:32 عصر

  2. #2

    نقل قول: آموزش open-gl

    4- کتابخانه های OpenGL را به پروژه لینک کنید:
    مسیر زیر را دنبال کنید:
    Project → Properties (Alt+F7) → Linker → Input
    در قسمت Additional Dependencies
    این رشته را وارد کنید : “opengl32.lib glu32.lib” و ok.
    نکته برای هر دو حالت Debug و Release این تغییرات را اعمال کنید.
    داخل ویژوال استادیو میشه از کد زیر به جای این مرحله استفاده کرد:

    #pragma comment(lib,"opengl32.lib")
    #pragma comment(lib,"glut32.lib")
    برای کامپایلر GNUC (GCC باید به شکل زیر عمل کرد (تحت ویندوز):

    gcc -c main.c
    gcc -o main.exe main.o glut.lib glu.lib opengl.lib

  3. #3
    کاربر دائمی آواتار amin1softco
    تاریخ عضویت
    شهریور 1386
    محل زندگی
    پای آن سرو بلند
    پست
    1,832

    نقل قول: آموزش OpenGL

    خلاصه فصل اول کتاب ((مروری بر گرافیک رایانه ایی))
    نکات :
    برای تولید یک تصویر واقع گرایانه از صحنه ایی طبیعی یک برنامه ی گرافیکی باید اثرات بازتابش و شکست نور واقعی را از اشیای طبیعی شبیه سازی کند . بنابر این گرایش فعلی در گرافیک کامپیوتری در آمیختن تقریبهای بهبود یافته ی اصول فیزیک با الگوریتمهای گرافیک رایانه ای است که برای شبیه سازی تعاملات پیچیده بین اشیاء و محیط نوری بکار می رود.
    البته بیشتر افراد با این مبحث آشنایی دارند و من زیاد توضیح نمی دهم
    **مروری بر گرافیک رایانه ایی**
    الف: نمودار ها :

    یکی از کاربرد گرافیگ کامپیوتری در رسم نمودار ها است . که می توانند در n بعد ترسیم شوند.



    ب : طراحی به کمک کامپیوتر:

    طراحی به کمک کامپیوتر CAD و ترسیم و طراحی به کمک کامپیوتر CADD نامیده می شود. و در طراحی انیمیشن , شبکه های مخابراتی , ترسیمات الکترونیکی ,نقشه های ساختمانی , وسایل نقلیه , هواپیما ها , کشتیها , سفینه ها ی فایی , رایانه ها , نساجی , محصولات خانگی و... بطور وسیع مورد استفاده قرار می گیرد.



    ج: محیط های واقعیت مجازی :
    یکی از مفاهیم آن کنترل از راه دور است برای مثال یک کابین خلبان با تمام جزئیات ایجاد می شود و خلبان بدون اینکه سوار بر هواپیمای واقعی باشد آن را کنترل می کند. یا در یک مکان که احتمال خطر زیاد است مثل معادن یک لودر شبیه سازی شده بوسیله کارفرما از خارج آن کنترل می شود.

    د : بصری سازی :
    همیشه تصاویر شهودی راحت تر از داده های عددی درک می شوند برای مثال یک ماتریس عددی از مشخصات سطح زمین قابل درک نیست اما وقتی این داده ها به تصویر کشیده می شوند خیلی راحت تر درک می شوند. این فرایند تبدیل داده ی عددی به تصویر را بصری سازی می نامند.
    ه : آموزش و کار آموزی :

    منظور همان شبیه سازی وسایل سنگین است برای مثال برای آموزش خلبانی یک کابین خلبان ایجاد می شود با همه امکانات و کامپیوتر محیط پرواز را به صورت واقعی شبیه سازی می کند. بدون اینکه هواپیمایی وجود داشته باشد.

    و : هنر رایانه ای :

    یعنی محیط بوم و قلمو بوسیله ابزار های دیجیتالی شبیه سازی شود و نقاش بتواند همان اثرات واقعی را با حرکت دادن قلمو بر روی صفحه مانیتور یا تبلت پیاده سازی کند.
    ز : سرگرمی :

    به دو بخش تقسیم می شود یکی قسمت ساخت فیلم و دیگری قسمت ساخت بازی است در قسمت ساخت فیلم به چندین صورت مورد استفاده قرار می گیرد:
    1-استفاده از شخصیت های گرافیکی در کنار شخصیت های واقعی
    2- ویرایش شخصیت های واقعی وایجاد افکت ها سینمایی
    3- ساخت تمام فیلم به صورت گرافیکی
    قسمت ساخت بازی یعنی ایجاد محیطی که با کاربر تعامل دارد .


    ح : پردازش تصویر :
    تغییر یا تفسیر تصاویر موجود مثل عکس ها و اسکنها تلویزیونی را پردازش تصویر می گویند.
    تفاوت بین پردازش تصویر و گرافیک رایانه ایی این است که در پردازش تصویر روش هایی برای بهبود کیفیت , تحلیل و شناسایی الگو های بینایی برای کاربرد های روبوتیک به کار می رود در حالی که در گرافیک رایانه ایی یک تصویر خلق می شود.

    ت : فاصلهای گرافیکی کاربر
    منظور همان Graphic user interface می باشد که یک مثال معروف آن ویندوز و داس است در داس این محیط گرافیکی نبود ولی در ویندوز این محیط گرافیکی شد
    ک : خلاصه :
    این بخش کوچکی از استفاده از گرافیک کامپیوتری بود.

  4. #4
    کاربر دائمی آواتار amin1softco
    تاریخ عضویت
    شهریور 1386
    محل زندگی
    پای آن سرو بلند
    پست
    1,832

    نقل قول: آموزش open-gl

    خلاصه ی فصل دوم ((مروری بر سیستم های گرافیکی))

    1-دستگاه های نمایش پویش ویدئویی :

    دستگاه خروجی مبنا در بیشتر سیستم ها مانیتور یا همان صفحه نمایش است که به چند نوع تقسیم بندی می شود:
    الف- لامپ های خلأ (CRT) تک رنگ :
    لامپ های خلأ بر اساس خاصیت مهم عنصر فسفر کار می کنند.

    وقتی به یک اتم فسفر بار الکترونی القاء شود و آرایش الکترونی این اتم در حالت برانگیخته باشد این اتم با ساطع کردن نوری ناپایدار در محدوده دید مرئی انسان به آرایش الکترونی پایدار می رسد. ولی هرچه تعداد الکترون های القاء شده بیشتر باشد درخشندگی نور الکترون ها بیشتر است و بلعکس اثر نور منتشر شده در حد 10 - 60 میکروثانیه است و به سرعت از بین می رود.
    در لامپ های خلا از این خاصیت استفاده می کنند و با یک تفنگ الکترونی که دارای سیستم آند متمرکز کننده , آند شتاب دهنده , شبکه کنترل , سیم پیچ گرمایی و کاتد است اشعه ی الکترونی را به سمت صفحه آغشته به فسفر هدایت می کند در بین راه این اشعه باید یا از پیچه های منحرف کننده عبور کند یا ازصفحات منحرف کننده الکترواستاتیکی و در نهایت برخورد با اتم فسفر و ساطع شدن فوتون .


    تصویر نمونه با منحرف کننده الکترو استاتیکی
    برای اینکه تصویر پایدار بماند دو راه وجود دارد :
    اول توزیع بار داخل CRT
    دوم رسم مجدد تصویر که بیشتر از این روش استفاده می شود.
    بیشترین تعداد نقاطی که می توان بدون همپوشانی روی مانیتور نمایش داد را
    تفکیک پذیری گویند.
    resolution = the number of points/cm that can be plotted horizontally or vertically (1-direction).

    تفکیک پذیری در CRT به نوع فسفر , شدت نمایش , سیستمهای منحرف کننده و متمرکز کننده بستگی دارد.
    سیستم هایی که در آنها تفکیک پذیری (وضوح) بیشتر از 1280 * 1024 باشد را
    سیستم هایی با تعریف بالا می نامیم.

    نمایش های پویش راستری (Raster)
    راستر : خطوط مورب تحت زاويه مخصوص بصورت هاشور ترام
    Raster : rectangular area of scan lines onto which a beam of electrons is directed to create a visual image (in television screens and computer monitors)


    اساس کار این پویش شبیه تلویزیون های CRT است و در این پویش اشعه ی الکترونی صفحه ی نمایش را سطر به سطر , با شروع از بالا ترین سطر جارو می کند هر سطر را یک خط پویش
    می نامیم.
    فریم به کل ناحیه صفحه مانیتور اطلاق می شود.
    فریم بافر ناحیه ایی از حافظه است که تمام مشخصات مورد نیاز برای رسم یک تصویر کامل روی مانیتور در آن قرار می گیرد.
    پیکسل به هر نقطه نوری که بتواند بوسیله اشعه ی الکترونی روشن شود پیکسل یا پل نامیدهخ می شود.
    نسبت ظاهری برابر با تعداد ستون های پیکسلی بر تعداد خط های پویش قابل نمایش توسط سیستم تعریف می شود. نمونه 4:3 یا 16:9
    دامنه ی رنگها یا سطوح خاکستری به الف ) نوع فسفر به کار رفته در CRT ب) به تعداد بیت های قابل دسترسی برای هر پیکسل در فریم بافر بستگی دارد.
    در سیستم سیاه و سفید یک بیت برای نماش هر پیکسل لازم است ولی امروزه برای هر پیکسل رنگی 32 بیت یا 24 بیت در نظر گرفته می شود.
    عمق ناحیه بافر یا صفحه بیت ها به تعداد بیت ها به ازای هر پیکسل اطلاق می شود.
    نقش بیتی :فریم بافر با یک بیت بر پیکسل و دودویی اطلاق می شود
    نقش پیکسلی : یک فرم بافر با بیش از یک پیکسل دارای الگوی رنگ چند گانه
    را گوییم
    درهم ریسی : برای اینکه سرعت نمایش یک تصویر را افزایش دهیم تصویر را در دو گذر نمایش می دهیم در گذر اول اشعه ی الکترونی خط پویش را از بالا به پایین و یک در میان جاروب می کند سپس اشعه ی الکترونی بعد از بازگشت عمودی , خط های پویش با قیمانده را جارو می کند. و باعث یک دید کلی از تصویر در زمانی معادل با نصف حالت معمو می شود.

    نمایش پویش تصادفی
    در این حالت اشعه ی الکترونی فقط به قسمت هایی هدایت می شود که باید تصویر رسم شود و تصویر به پاره خط هایی مجزا تقسیم بندی می شود و به این علت به آنها پویش برداری نیز می گویند. نرخ رفرش به تعداد خط ها بستگی دارد که باید ترسیم شوند تصویر به صورت مجموعه ایی از دستورات ترسیم خط در قسمتی به نام فهرست نمایش فایل یا فایل بردار ذخیره می شود.
    نرخ رفرش بالا باعث سوخته شدن فسفر ها می شود و با عث ایجاد وقفه در نمایش تصویر می گردد.
    نکته این سیستم برای حالت تک رنگ است یعنی یا بیت ها روشن هستند یا خاموش و قسمتی از پیکسل ها روشن می شوند. و بقیه بدون تغییر می مانند.

    صفحه نمایش های رنگی
    تصاویر رنگی با استفاده از ترکیب فسفر هایی که نورهای متفاوتی منتشر می کنند ایجاد می شوند
    روش نفوذ اشعه : در این روش از دو لایه فسفر با رن های قرمز وسبز استفاده می شد که اشعه ایی با الکترون های کند به لایه قرمز خارجی برخورد می کرد و سپس برعکس الکترون ها به صورت سریع به لایه سبز داخلی نفوذ و آن را تحریک می کردند رنگ صفحه نمای را در این حالت می توان بوسیله ی ولتاژ شتاب دهنده کنترل کرد .
    چون روش پر هزینه و بی کیفیتی بود کنار گذاشته شد.

    روش ماسک سایه ایی:
    در این روش هر پیکسل از سه فسفر با رنگ های (قرمز - سبز - آبی ) تشکیل شده است که بوسیله ی سه تفنگ مجزا به سمت صفحه شتاب داده می شوند و هر سه در قسمت ماسک سایه به شکل مثلثی در می آیند و این اشعه ها به گونه ایی هستند که فقط فسفر مربوط به خود را می توانند روشن کنند . این روش در بیشتر تلویزیون ها رنگی و مانیتور ها استفاده می شود.

    1- قسمت سه تفنگ الکترونی برای فسفر های قرمز و سبز و آبی
    2- شعاع الکترونی
    3- سیم پیچ متمرکز کننده
    4. سیم پیچ منحرف کننده
    5. اتصال آند
    6. لایه ماسک سایه برای تفکیک شعاع های نوری قرمز و سبز و آبی
    7. صفحه نمایش با لایه های فسفر قرمز و سبز و آبی
    8. تصویر بسته از صفحه نمایش که رنگ ها به صورت مجزا قابل رویت هستند.

    تغییرات رنگ را می توان با تغییر تراز شدت الکترونی هر سه تفنگ بدست آورد که با 24 بیت 256 تراز شدت مجزا برای هر تفنگ داریم . که به آن سیستم تمام رنگی می گویند.
    که انتخاب حدود 17 میلیون رنگ را برای هر پیکسل فراهم می کند.

    صفحات نمایش تخت

    اصطلاح صفحه نمایش تخت به مجموعه ایی از دستگاه های ویدئویی اطلاق می شود که در مقایسه با یک CRT وزن , حجم و مصرف انرژی کمتری دارند. که به دوگروه نمایش های پخشی و نا پخشی تقسیم بندی می شوند.
    پخشگر ها دستگاه هایی هستند که انرژی الکتریکی را به نور تبدیل می کنند. مثال : صفحات پلاسما , الکترو لومینانس , فیلم نازک , دیود های پخش گر نور , CRT های تخت
    نا پخشگر ها دستگاه هایی هستند که نور خورشید یا منابع دیگر را با استفاده از اثرات نوری به الگوهای گرافیکی تبدیل می کنند. مثل : صفحه نمایش کریستال مایع LCD

    صفحات پلاسما : که نمایشهای تخلیه گاز نیز نامیده می شوند معمولا با پر کردن فضای بین دو ورق شیشه ایی با مخلوطی از گازها که گاز نئون نیز معمولا یکی از آنهاست ساخته می شود یک سری نوار های رسانای عمودی در یکی از ورق های شیشه ایی و یک سری نوارهای افقی در ورق دیگر قرار داده می شود.


    ولتاژ احتراق اعمال شده بر یک جفت از رسانا های افقی و عمودی باعث می شود که گاز واقع در محاقی دو رسانا به پلاسمای تابانی از الکترون ها و یون ها تبدیل شود و جدایی بین پیکسل ها بوسیله ی میدان الکتریکی رسانا ها امکان پذیر است.
    ساخت صفحات نمایش الکترو لومینانس فیلم نازک مشابه صفحات پلاسما است با این تفاوت که فضای بین ورق های شیشه ای به جای گاز از یک فسفر مثل سولفید روی آغشته به منگنز پر می شود. زمانی که ولتاژ نسبتا بالایی به یکی از زوج الکترود ها ی متقاطع اعمال شود فسفر واقع در ناحیه تلاقی الکترود ها رسانا می شود و سپس انرژی الکتریکی بوسیله اتم های منگنز جذب می شود و متعاقب آن نقطه ایی نورانی آزاد می شود. این صفحات نسبت به پلاسما به برق بیشتر نیاز دارند و رنگ خوبی نیز تولید نمی کنند.

    دیود پخش نور LED: در آن ماتریسی از دیود های آرایش یافته برای تشکیل مواضع پیکسل ها ی صفحه ی نمایش به کار می رود .

    نمایش های کریستال مایع :
    در این سیستم که از نوع غیر پخشی است یک تصویر با عبور دادن نور قطبی شده از منبع نور محیط یا از منبع نور داخلی از میان مواد کریشتال مایع تشکیل می دهداین مواد می توانند به گونه ایی ردیف بندی شوند که باعث عبور نور یا مانع عبور آن شوند.
    هر چند کریستال مایع به آرایش کریستالی از ملکول ها دلالت دارد ولی مثل مایعی روان است صفحات نمایش تخت معمولا از ترکیب کریستال مایع نخ کشی شده استفاده می کنند این کریستال ها گرایش به نگهداری محوری بلند از ملکولهای میله مانند هم ردیف دارند.

    انواع مختلفی از این مواد در طبیعت وجود دارند اما آن دسته از آنها که با ولتاژ تغییر می کنند درLCD ها به کار می روند. در این LCD ها مولکولهای کریستال می چرخند و تغییر زاویه می دهند . بر اثراین خصلت بر اثر وصل کردن ولتاژ به کریستال جهت دو قطبی های کریستال هم جهت با میدان الکتریکی ناشی از ولتاژ می شوند . بر طبق این حالت اگر دو تکه شیشه پلاروید یا قطبشگر را روی هم قرار دهیم میتوانیم با تغییر جهت مولکولهای کریستال بکار رفته در بین آنها تصاویری سیاه و سفید(بی رنگ) تشکیل داد. اما در مورد صفحات پلاروید ، اگر دو تکه شیشه پلاروید را روی هم قرار دهیم و یکی را 90 درجه بچرخانیم می بینیم که صفحه تیره می شود (نوری از بین این دو صفحه عبور نمی کند) ، خوب همانطور که خواندیم اگر دو صفحه پلاروید را بر روی هم قرار دهیم (و در حالتی قرار دهی که نور از بینشان عبور کند) واز مقداری کریستال در بین آنها استفاده کنیم با تغییر ولتاژاعملی به کریستال جهت مولکولها تغییر می کند و نوری که از شیشه پلاروید اول عبور می کند 90 درجه تغییر جهت می دهد و به صفحه دوم برخورد می کند با توجه به خاصیت توضیح داده شده نور از صفحه دوم عبور نمی کند و تصویری تیره بوجود می آید.

    در LCD ها نوری بوجود نمی آید بلکه نور موجود در محیط تغییر داده می شود. به همین خاطر است که LCD ها را در تاریکی نمی توان استفاده کرد. به خاطر این خصلت که خود مولد نور نیستند مصرف کمتری نسبت به لامپها و دیودها دارند.

    دو ورقه ی شیشه ای ماده ی کریستال مایع را ساندویچ وار احاطه کرده اند هر کدام از این ورقه های شیشه ایی قطبی کننده ی نوری واقه در وضعیت 90 درجه نسبت به همدیگر را شامل اند.سطر هایی از رسانا های شفاف به صورت افقی در یک ورق شیشه ای و ستونهایی از رسانا ها ی عمودی در ورق شیشه ایی دیگر قرار گرفته اند محل تلاقی دو رسانا پیکسلی را تعریف ی کند . معمولا ملکولها به حالت روشن نشان داده می شوند ,

    نور قطبی شده ذر زمان عبور از میان ماده پیچ خورده و از میان قطبی کننده مقابل عبور خواهد کرد به این ترتیب نور بطرف ناظر تابیده شده و پیکسل روشن می شود.
    برای خاموش کردن یک پیکسل ولتاژی به محل تلاقی دو رسانا اعمال می شود تا ملکول ها هم ردیف شده و نور دیگر پیچ نخورد این نوع دستگاه سفحه تخت ماتریس منفعل LCD نامیده می شود.
    روش دیگر برای ساخت LCD ها قرار دادن ترانزیستور در مکان هر پیکسل با استفاده از فناوری ترانزیستور فیلم نازک است.این صفحات نمای ماتریس فعال نامیده می شود.


    دستگاه های دید سه بعدی
    این فناوری به کمک بازتاب تصویر مانیتور معمولی از یک آینه نوسان پذیر و قابل تنظیم ایجاد می شود. نوسان آینه باعث تغییر فاصله ی کانونی آن می شوداین نوسانات با نمایش جسم بر روی مانیتور به گونه ایی هماهنگ می شود که هر نقطه از سطح جسم از طریق آینه به نقطه ایی در فضا منعکس می شود که متناظر با نقطه دید مزبور از موقعیت دید مشخص شده است.

    سیستمهای واقعیت مجاز ی و برجسته نما
    روش دیگر برای نمایش اجسام سه بعدی نمایش دید های بر جسته نما از جسم است این روش تصویر سه بعدی واقعی تولید نمی کند اما با ارائه ی دیدی متفاوت به هر چشم بیننده جلوه ای سه بعدی تولید می کند که در آن به نظر می رسد صحنه ها دارای عمق اند.
    یکی از روش های تولید تصویر بر جسته نما در سیستم راستر نمایش هر دید در دور های رفرش متوالی است.صفحه مانیتور توسط عینک های خاص نگریسته می شود.عدسی های عینک به گونه ای ساخته ده اند که مشابه یک شاتر به صورت هماهنگ سریع و یک در میان یکی از دید ها را بلوکه می کنند.
    روش دیگر خلق واقعیت مجازی استفاده از پروژکتور ها برای تولید صحنه در آرایه ایی از دیوار هاست که در آن ناظر با استفاده از شیشه های بر جسته نما و دستکشهای داده ایی با یک نمایش مجازی تعلمل بر قرار می کند.
    اتمام قسمت 1

    2- دستگاه های پویش راستری
    در سیسم های راستری از چند واحد پردازشگر استفاده می شود .

    قسمت کنترلگر ویدئویی کار های متنوعی انجام می دهد از جمله تعیین وضعیت اشعه ی الکترونی (موقعیت پیکسل ها و شدت آنها) سازگار کردن صفحه نمایش با RAM سیستم اعمال افکت بر روی گروهی از پیکسل ها (مثلا مانیتور رنگی تصویر را به حالت سیاه و سفید نمایش دهد یا قسمتی از صفحه را بزرگ یا کوچک میکند) و امکان ارتباط با دوربین فیلم برداری و غیره را فراهم می کند.

    پردازشگر نمایش پویش راستری : هدف آن آزاد سازی CPU کامپیوتر از انجام کار های گرافیکی است.
    تبدیل پویش : رقمی کردن تصویر داده شده در برنامه ای کاربردی به مجموعه ایی از مقادیر شدت برای پیکسلها جهت ذخیره سازی در فرم بافر است.

    این مباحث چون زیاد اهمیتی نداره توضیح نمی دم.
    4- دستگاه های دید و ایستگاه های کاری گرافیکی
    5- دستگاه های ورودی
    6- دستگاه های نسخه چاپی
    7- شبکه های گرافیکی
    8- گرافیک در اینترنت

    اتمام حذفیات

    9- نرم افزار های گرافیکی
    کلا نرم افزار های گرافیکی را به صورت زیر طبقه بندی می کنیم :
    الف ) بسته های تک منظوره : احتیاج به برنامه نویسی ندارند و کاربر با منو ها و ... کار می کند. مثل فوتوشاپ و غیره
    ب ) بسته های برنامه نویسی عمومی : احتیاج به برنامه نویسی با توابع این بسته وجود دارد. مثل GL, OpenGL , VRML , java 2D , java 3D

    نمایش سیستم مختصات
    برای تولید یک تصویر توسط یک بسته برنامه نویسی نخست باید توصیفات هندسی اشیای مورد نمایش را ارائه دهیم این توصیفات , مکانها و شکلها ی اشیاء را مشخص می کنند برای مثال یک جعبه را میتوان با گوشه های رئوس آن مشخص کرد و یک کره را می توان با موقعیت شعاع و مرکز آن تعریف کرد به جز چند مورد استثنایی بسته های گرافیکی عمومی مستلزم این هستند که توصیفات مزبور در یک سیستم متخصات دکارتی استاندارد و راستگرد تعیین شوند اگر مقادیر مختصات برای یک تصویر در سیستم مختصات دیگر (کروی هزلولی و غیره) داده شدهخ باشند باید آنها را قبل از دادن به بسته ی گرافیکی به سیستم مختصات دکارتی تبدیل کرد یک بسته گرافیکی خاص منظوره که برای کاربرد های ویژه ایی طراحی شده باشد می تواند استفاده از سیستم مختصات دیگری را که برای این کاربرد ها مناسب ترند فراهم سازد.
    معمولا در فرآیند تولید و نمایش یک صحنه از چند سیستم مختصات دکارتی مختلف استفاده می شود نخست شکل های اشیای انفرادی مثل درختان یا مبلمان داخل صحنه را می توانیم در سیستم مختصات جداگانه ای برای هر شی تعریف کنیم این سیستم مختصات را سیستم مختصات مدل یا گاهی سیستم مختصات محلی می نامند.
    بعد از اینکه شکل های اشیای انفرادی مشخص شدند یک صحنه را می توان با قرار دادن اشیای در مکان های مناسب در یک سیستم مختصات صحنه به نام سیستم مختصات جهانی ساخت (مدل سازی کرد) .
    مواضع سیستم مختصات جهانی نخست به مختصات دیدی که متناظر است با دیدی که میخواهیم از موقعیت یا جهت دیدی یک دوربین فرضی از صحنه داشته بایم تبدیل می شوند سپس سیستم سپس مواضع مختصات جسم به یک پروجکشن دو بعدی از صحنه متناظر با آنچه بر روی دستگاه خروجی خواهیم دید تبدیل می شوند بعد صحنه در سیستم مختصات نرمالیزه که در آن مقدار هر مختصه , بسته به سیستم , در دامنه -1 تا 1 یا 0 تا 1 قرار دارد ذخیره می شود مختصات نرمالیزه را مختصات دستگاه نرمالیزه نیز می گویند . زیرا استفاده از این نمایش یک بسته ی گرافیکی را از دامنه ی مختصه برای هر دستگاه خروجی تعیین شده مستقل می سازد همچنین لازم است تا سطوح مرئی را مشخص کرده و قسمت های بیرونی تصویررا نسبت به مرز های دیدی که می خواهیم بر روی دستگاه نمایش نشان دهیم حذف می کنیم سر انجام تصویر برای نمایش داده شدن به رفرش بافر یک دستگاه راستر تبدیل پویش می شود سیستم مختصات برای دستگاه نمایش معمولا مختصات دستگاه یا در حالت یک صفحه نمایش ویدئویی , مختصات صفحه نمایش نامیده می شود اغلب مختصات نرمالیزه و مختصات صفحه نمایش هر دو در سیستم مختصات چپ گرد تعیین می شوند به گونه ای که افزایش فواصل مثبت از صفحه ی xy را می توان مشابه دور تر شدن از موقعیت دید تعبیر کرد.

    نمایش تبدیل مختصات ها
    انواع توابع گرافیکی :
    مبنای خروجی گرافیکی : خروجی هایی مانند حروف , اشکال هندسی مثل نقطه خط پاره خط قطعه منحنیها سطوح پر شده با رنگ (چند ضلعی ها) و شکل های تعریف شده توسط آرایه ایی از نقاط رنگ را شامل می شود.
    ویژگی ها : خواص خروجی های مبنا را مشخص می کند.
    تبدیلات هندسی : اندازه , موقعیت , وجهت جسم ر در یک صحنه را مشخص می کند.
    تبدیلات مدل سازی : برای ساخت صحنه ایی که تک تک اجسام آن در سیستم مختصات محلی خود توصیف شده باشند.
    تبدیلات دید : برای انتخاب یک دید از صحنه کاربرد دارند.
    توابع ورودی : کنترل و پردازش جریان داده ورودی از دستگاه های ورودی را بر عهده دارند.
    توابع عملیات کنترل : به توابعی اطلاق می شود که وظایف آماده سازی و مقدار اولیه داده به پارامتر ها را بر عهده دارند.

    استاندارد های نرم افزاری

    وقتی یک بسته گرافیکی ایجاد می شود مهمترین هدف حمل بری است. یعنی بتوان برنامه نوشته شده را با هر نوع سخت افزار و سیستم عاملی اجرا کرد.
    بر همین اساس در سال 1984 اولین بسته استاندارد شده GKS بوسیله ISOو ANSI منتشر شد. و در ابتدا یک بسته گرافیکی دو بعدی بود که به محیط سه بعدی نیز گسترش یافت. در همین زمان یک بسه گرافیکی با نام GL که در شرکتهای SGI (silicon graphoc inc) 0 طراحی شده بود محبوبیت خاصی پیدا کرد و به صورت بالفعل به یک استاندارد تبدیل شد.
    در اوایل سال 1990 , OpenGL به عنوان نسخه ایی مستقل از سخت افزار GL معرفی شد و در حال حاضر این بسته بوسیله OpenGL Architecture Review Board که کنسرسیومی شاخص از بسیاری از سازمانها و کمپانی های گرافیکی است نگهداری و به روز می شود.

    بسته های گرافیکی دیگر
    بسته های گرافیکی مختلفی وجود دارند که برای اهداف مختلفی طراحی شده اند برای اطلاعات بیشتر به این لینک مراجعه کنید مثال : open invertor که یک سری روتینها شی گرای برای توصیف صحنه را با استفاده از OpenGL در دسترس قرار می دهد. java2D , java3D, VMRL نموه های دیگر بسته های گرافیکی هستند.




    آخرین ویرایش به وسیله amin1softco : دوشنبه 24 اسفند 1388 در 14:39 عصر

  5. #5

    نقل قول: آموزش OpenGL

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

    2. توضیح در مورد مفاهیم گرافیک میتونه مفید باشه اما نه برای یه API گرافیکی. چون شما تنها آموزش OpenGL رو مد نظر گرفتن بهتره کار رو با آموزش توابع و مفاهیم مربوطه ادامه بدین. مفاهیم اولیه گرافیک مثل نحوه عملکرد و ... تنها میتونه به درد درسهایی مثل گرافیک یک بخوره.

  6. #6
    کاربر دائمی آواتار amin1softco
    تاریخ عضویت
    شهریور 1386
    محل زندگی
    پای آن سرو بلند
    پست
    1,832

    نقل قول: آموزش OpenGL

    دوست من ,
    من در پست اول هدفم رو ذکر کردم و این مباحثی که الان قرار می دم دقیقا با کتاب دارم پیش می رم و از فردا یا پس فردا وارد قسمت کد نویسی OpenGL می شیم در ضمن من گرافیک رایانه ایی جلد اول را دارم بحث می کنم .

    برای اینکه این پست هم بی فایده نباشه آموزش کامپایل بوسیله g++ در لینوکس ابونتو را اینجا قرار می دم :
    در ابتدا مطمئن شوید که کامپایلر gcc نصب است و سپس وارد ترمینال شده بوسیله دستور زیر g++ را دانلود و نصب کنید :

    sudo apt-get install g++


    سپس پکیج های لازم را دانلود و نصب کنید با کد زیر :

    sudo apt-get install freeglut3 freeglut3-dev libglew1.5 libglew1.5-dev libglu1-mesa libglu1-mesa-dev libgl1-mesa-glx libgl1-mesa-dev mesa-common-dev


    همین. حالا می تونید پروژه خودتون رو بنویسید و کامپایل کنید فقط به جای هدر glut از freeglut استفاده کنید.
    #include <GL/freeglut.h>

    برای کامپایل برنامه در ترمینال از کد زیر استفاده کنید :

    g++ -lglut -lGL -lGLU -lGLEW -o hello.o helloworld.cpp

    فایل hello.o باید در مسیر جاری موجود باشه.برای اجرای برنامه از دستور زیر استفاده کنید:
    ./hello.o

    استفاده کنید تا برنامه اجرا بشه.
    یک برنامه نمونه :


    #include <GL/freeglut.h>

    void displayCall() {
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glEnable(GL_DEPTH_TEST);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(-2.0, 2.0, -2.0, 2.0, -2.0, 500.0);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    gluLookAt(2, 2, 2, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
    glScalef(.005,.005,.005);
    glRotatef(20, 0, 1, 0);
    glRotatef(30, 0, 0, 1);
    glRotatef(5, 1, 0, 0);
    glTranslatef(-300, 0, 0);

    glColor3f(1,1,1);
    glutStrokeCharacter(GLUT_STROKE_ROMAN, 'H');
    glutStrokeCharacter(GLUT_STROKE_ROMAN, 'e');
    glutStrokeCharacter(GLUT_STROKE_ROMAN, 'l');
    glutStrokeCharacter(GLUT_STROKE_ROMAN, 'l');
    glutStrokeCharacter(GLUT_STROKE_ROMAN, 'o');

    glutStrokeCharacter(GLUT_STROKE_ROMAN, 'W');
    glutStrokeCharacter(GLUT_STROKE_ROMAN, 'o');
    glutStrokeCharacter(GLUT_STROKE_ROMAN, 'r');
    glutStrokeCharacter(GLUT_STROKE_ROMAN, 'l');
    glutStrokeCharacter(GLUT_STROKE_ROMAN, 'd');
    glutStrokeCharacter(GLUT_STROKE_ROMAN, '!');

    glutSwapBuffers();
    } /* end func displayCall */

    /* Set up everything, and start the GLUT main loop. */
    int main(int argc, char *argv[]) {
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
    glutInitWindowSize(500, 500);
    glutInitWindowPosition(300, 200);
    glutCreateWindow("Hello World!");
    glutDisplayFunc(displayCall);
    glutMainLoop();
    return 0;
    } /* end func main */


    خروجی :

    +
    آخرین ویرایش به وسیله amin1softco : پنج شنبه 25 اسفند 1390 در 15:32 عصر

  7. #7
    کاربر دائمی آواتار amin1softco
    تاریخ عضویت
    شهریور 1386
    محل زندگی
    پای آن سرو بلند
    پست
    1,832

    نقل قول: آموزش OpenGL

    چگونه برنامه های OpenGL را با dev اجرا کنیم:
    چون به طور پیش فرض در این برنامه هدر glut وجود نداره ما باید پکیجش رو نصب کنیم برای این کار مراحل زیر را دنبال کنید:
    1- آپدیت پکیج ها
    Tools → Check for update / pakage..
    2- در قسمت انتخاب سرور گزینه devpacks.org Community Devpacks را انتخاب کرده روی کلید check for update مرحله 3 در تصویر کلیک کنید
    4- در (Groups)گروه ها OpenGL را انتخاب کنید
    5- در لیست فقط glut ver 3.7.6+ 104 kb را نتخاب کنید.
    6- روی کلید download selected کلیک کنید
    بعد مراحل نصب پکیج را دنبال کنید تا نصب پکیج کامل شود.

    حالا برای ایجاد یک پروژه OpenGL مراحل زیر را دنبال کنید :
    File → New → Project... → Multimedia → glut
    یک اسم برای پروژه خودتون انتخاب کنید.
    حالا dev آماده شده می تونید برنامه زیر که رسم دو خط هست را اجرا کنید.

    //lines.cpp
    //---------
    //Draw lines with OpenGL + GLUT
    //Compiler DevC++‎‎ 4.9.9.2 + GLUT3.7 (Win32)
    #include <windows.h>
    #include <GL/glut.h>
    void init(void)
    {
    glClearColor(1.0,1.0,1.0,0.0); //display window set to white
    glMatrixMode(GL_PROJECTION); //projection parameters
    gluOrtho2D(0.0,200.0,0.0,150.0); //sets up WC extent
    }
    void lineSegments(void)
    {
    glClear(GL_COLOR_BUFFER_BIT); //clears display window
    glColor3f(0.0, 0.0, 1.0); //line colour set to blue
    glBegin(GL_LINES);
    glVertex2i(180,15); glVertex2i(10,145); //line seg1
    glVertex2i(145,10); glVertex2i(15,180); //line seg2
    glEnd();
    glFlush(); //process all OGL functions immediately
    }
    int main(int argc, char** argv)
    {
    glutInit(&argc, argv); //initialise GLUT
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); //sets display mode
    glutInitWindowPosition(50, 100); //top left display window pos
    glutInitWindowSize(400, 300); //display win width and height in pixel coords
    glutCreateWindow("Example01 - lines"); //now create display win
    init(); //run initilization procs
    glutDisplayFunc(lineSegments); //call drawing func
    glutMainLoop(); //display all and wait
    return 0;
    }


  8. #8
    کاربر دائمی آواتار amin1softco
    تاریخ عضویت
    شهریور 1386
    محل زندگی
    پای آن سرو بلند
    پست
    1,832

    نقل قول: آموزش OpenGL

    مقدمه ایی بر OpenGL

    نحو OpenGL
    1- توابع اصلی با gl شروع می شوند و نام هر تابع با حرف بزرگ انگلیسی شروع می شود برای مثال : glBegin, glEnd, glClear, glCopyPixels, glPolygonMode

    2- ثابت های OpenGL با یک GL بزرگ و یک خط فاصله _ می آیند برای مثال:
    GL_2D, GL_RGB, GL_POLYGON,GL_AMBIENT_AND_DIFFUSE

    3- چون OpenGL یک سیستم مستقل از ماشین طراحی شده است نوع داده ایی منحصر به فرد خود را دارد و این نوع های داده با یک GL بزرگ شروع می شوند برای مثال:
    GLbyte, GLshort, GLint, GLfloat, GLdouble, GLboolean

    4-
    Pointers to arrays may be passed as some function arguments


    کتابخانه های مرتبط
    برا ایجاد یک نمایش گرافیکی توسط OpenGL باید ابتدا یک پنجره نمایش ایجاد کنیم و چون نمی توان این پنجره را بوسیله توابع پایه OpenGl ایجاد کرد باید از کتابخانه های فرعی کمک بگیریم که در هر سیستم عامل متفاوتند اما می توان از OpenGL Utility Toolkit یا همان GLUT برای نمایش پنجره در هر سیستم عاملی استفاده کرد.

    فایلهای شاخص
    در سیستم عامل ویندوز سر فایل glut.h شامل سر فایل های زیر می شود :

    #include <windows.h>
    #include <GL/gl.h>
    #include <GL/glu.h>

    پس اگر ما این سر فایل را به پروژه خود الحاق کنیم دیگر احتیاجی به سر فایل های بالا نداریم ولی شاید به سر فایل های C++‎‎‎‎‎ که رایج هستند نیاز داشته باشیم برای مثال:

    #include <cmath>
    #include <cstdlib>
    #include <cstdio>


    حالا ما دوراه برای ایجاد یک پنجره داریم یا اینکه بدون سر فایل glut این کار را انجام دهیم یا بوسیله ی آن وقتی ما بدون سر فایل glut این کار را انجام دهیم باید مراحل ساخت یک پنجره را در حالت win32 دنبال کنیم مثال اول همین انجمن اما وقتی این وظیفه را به عهده glut بگذاریم می توانیم مراحل ساخت پنجره را به صورت زیر دنبال کنیم باید پروژه در حالت کنسول ایجاد شود:
    glutInit(&argc, argv); //initialise GLUT برای مقدار دهی اولیه و آماده سازی
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); //sets display mode تعیین حالت نمایش بافر و حالت رنگ
    glutInitWindowPosition(50, 100); //top left display window pos تعیین موقعیت پنجره از گوشه بالا سمت چپ
    glutInitWindowSize(400, 300); //display win width and height in pixel coords مشخص کردن عرض و ارتفاء پنجره
    glutCreateWindow("Example01 - lines"); //now create display win تیتر پنجره

    glutDisplayFunc(lineSegments); //call drawing func فراخوانی تابع نمایش
    glutMainLoop(); //display all and wait حلقه برای دریافت پارامتر های ورودی و...



    سر فایل glu شامل روتین ها و توابعی برای تشکیل ماتریس های پروجکشن و دید , توصیف اشیای پیچیده با تقریب های خطی , نمایش منحنی ها و رویه ها ی درجه 2 و بی اسپلاینها توسط تقریب خطی پردازش عملیات رندر سازی رویه می باشد.
    برای مشاهده لیست تمام توابع gl و glu به این لینک مراجعه کنید:
    http://msdn.microsoft.com/en-us/library/dd374211(VS.85).aspx

    توضیح یک برنامه کامل رسم دوخط

    //lines.cpp
    //---------
    //Draw lines with OpenGL + GLUT
    #include <GL/glut.h> // تعریف سر فایل های مورد نیاز
    void init(void) //تابع تعیین تنظیمات
    {
    glClearColor(1.0,1.0,1.0,0.0); //display window set to white تعریف بک گراند با رنگ سفید
    glMatrixMode(GL_PROJECTION); //projection parameters تعیین ماترس صحنه
    gluOrtho2D(0.0,200.0,0.0,150.0); //sets up WC extent ست کردن با مختصات دوبعدی
    }
    void lineSegments(void) // تابع نمایش دو خط
    {
    glClear(GL_COLOR_BUFFER_BIT); //clears display window پاک کردن صفحه نمایش
    glColor3f(0.0, 0.0, 1.0); //line colour set to blue تعیین رنگ خطوط
    glBegin(GL_LINES); //شروع نقاشی با نوع خط
    glVertex2i(180,15); glVertex2i(10,145); //line seg1 رسم خط اول بین این دو نقطه
    glVertex2i(145,10); glVertex2i(15,180); //line seg2 رسم خط دوم بین این دو نقطه
    glEnd(); // پایان قسمت طراحی
    glFlush(); //process all OGL functions immediately رفرش بی درنگ صحنه
    }
    int main(int argc, char** argv)
    {
    glutInit(&argc, argv); //initialise GLUT
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); //sets display mode
    glutInitWindowPosition(50, 100); //top left display window pos
    glutInitWindowSize(400, 300); //display win width and height in pixel coords
    glutCreateWindow("Example01 - lines"); //now create display win
    init(); //run initilization procs
    glutDisplayFunc(lineSegments); //call drawing func
    glutMainLoop(); //display all and wait
    return 0;
    }

    در توابع بالا glVertex2i نشانگر مقدار دهی نقاط با نوع داده GLint می باشد و اگر یک v به آخر آن اضافه شود مقدار دهی از طریق آرایه امکان پذیر می شودمثال:
    glVertex3f دارای سه متغیر از نوع اعشاری است
    glVertex3d دارای سه متغیر از نوع حقیقی مضاعف است و...
    آخرین ویرایش به وسیله amin1softco : سه شنبه 25 اسفند 1388 در 16:34 عصر

  9. #9
    کاربر دائمی آواتار amin1softco
    تاریخ عضویت
    شهریور 1386
    محل زندگی
    پای آن سرو بلند
    پست
    1,832

    نقل قول: آموزش OpenGL

    فصل سوم
    این فصل بیشتر در مورد الگوریتم های ترسیم در سیستم راستر مثل DDA و برزنهام و نقطه میانی است ولی چیزی که بدرد بخوره این هاست .
    GL_POINTS رسم نقطه در صفحه
    GL_LINES رسم خطوط بین نقاط
    GL_LINE_STRIP رسم خطوطه بین نقاط مختلف از نقطه اول شروع می کنه به هم وصلشون می کنه تا نقطه آخر
    GL_LINE_LOOP مثل حالت قبله فقطه نقطه آخری رو به اولی رسم می کنه
    و همه اینها ثابت های OpenGL هستند و در موقعیت زیر به جای GL_LINES ظاهر می شوند:

    glBegin(GL_LINES);

    glVertex2i(180,15); glVertex2i(10,145);

    glVertex2i(145,10); glVertex2i(15,180);

    glEnd();


    لیست کامل:


    glBegin and glEnd delimit the vertices that define a primitive or a group of like primitives. glBegin accepts a single argument that specifies in which of ten ways the vertices are interpreted. Taking n as an integer count starting at one, and N as the total number of vertices specified, the interpretations are as follows:
    GL_POINTS
    Treats each vertex as a single point. Vertex n defines point n. N points are drawn.
    GL_LINES
    Treats each pair of vertices as an independent line segment. Vertices 2n−1 and 2n define line n. N/2 lines are drawn.
    GL_LINE_STRIP
    Draws a connected group of line segments from the first vertex to the last. Vertices n and n+1 define line n. N−1 lines are drawn.
    GL_LINE_LOOP
    Draws a connected group of line segments from the first vertex to the last, then back to the first. Vertices n and n+1 define line n. The last line, however, is defined by vertices N and 1. N lines are drawn.
    GL_TRIANGLES
    Treats each triplet of vertices as an independent triangle. Vertices 3n−2, 3n−1, and 3n define triangle n. N/3 triangles are drawn.
    GL_TRIANGLE_STRIP
    Draws a connected group of triangles. One triangle is defined for each vertex presented after the first two vertices. For odd n, vertices n, n+1, and n+2 define triangle n. For even n, vertices n+1, n, and n+2 define triangle n. N−2 triangles are drawn.
    GL_TRIANGLE_FAN
    Draws a connected group of triangles. One triangle is defined for each vertex presented after the first two vertices. Vertices 1, n+1, and n+2 define triangle n. N−2 triangles are drawn.
    GL_QUADS
    Treats each group of four vertices as an independent quadrilateral. Vertices 4n−3, 4n−2, 4n−1, and 4n define quadrilateral n. N/4 quadrilaterals are drawn.
    GL_QUAD_STRIP
    Draws a connected group of quadrilaterals. One quadrilateral is defined for each pair of vertices presented after the first pair. Vertices 2n−1, 2n, 2n+2, and 2n+1 define quadrilateral n. N/2−1 quadrilaterals are drawn. Note that the order in which vertices are used to construct a quadrilateral from strip data is different from that used with independent data.
    GL_POLYGON
    Draws a single, convex polygon. Vertices 1 through N define this polygon.
    Only a subset of GL commands can be used between glBegin and glEnd. The commands are glVertex, glColor, glIndex, glNormal, glTexCoord, glEvalCoord, glEvalPoint, glArrayElement, glMaterial, and glEdgeFlag. Also, it is acceptable to use glCallList or glCallLists to execute display lists that include only the preceding commands. If any other GL command is executed between glBegin and glEnd, the error flag is set and the command is ignored.
    Regardless of the value chosen for mode, there is no limit to the number of vertices that can be defined between glBegin and glEnd. Lines, triangles, quadrilaterals, and polygons that are incompletely specified are not drawn. Incomplete specification results when either too few vertices are provided to specify even a single primitive or when an incorrect multiple of vertices is specified. The incomplete primitive is ignored; the rest are drawn.
    The minimum specification of vertices for each primitive is as follows: 1 for a point, 2 for a line, 3 for a triangle, 4 for a quadrilateral, and 3 for a polygon. Modes that require a certain multiple of vertices are GL_LINES (2), GL_TRIANGLES (3), GL_QUADS (4), and GL_QUAD_STRIP (2).

    آخرین ویرایش به وسیله amin1softco : شنبه 07 فروردین 1389 در 16:37 عصر

  10. #10
    کاربر دائمی آواتار amin1softco
    تاریخ عضویت
    شهریور 1386
    محل زندگی
    پای آن سرو بلند
    پست
    1,832

    نقل قول: آموزش OpenGL

    رسم یک دایره به روش های مختلف :
    می دونید که دایره در توابع هسته OpenGL موجود نیست برای رسم یک دایره ما می تونیم به چند روش یک دایره را رسم کنیم من دو روش رو برسی می کنم :
    اول بدون استفاده از glu و روش نقطه میانی که در کتاب های گرافیک توضیحش هست :
    می تونیم یک دایره را اینجور رسم کنیم

    #include <GL/glut.h>

    class scrPt {
    public:
    GLint x, y;
    };

    void setPixel (GLint x, GLint y)
    {
    glBegin (GL_POINTS);
    glVertex2i (x, y);
    glEnd ( );
    }

    void circleMidpoint (scrPt circCtr, GLint radius)
    {
    scrPt circPt;

    GLint p = 1 - radius; // Initial value of midpoint parameter.

    circPt.x = 0; // Set coordinates for top point of circle.
    circPt.y = radius;

    void circlePlotPoints (scrPt, scrPt);

    /* Plot the initial point in each circle quadrant. */
    circlePlotPoints (circCtr, circPt);

    /* Calculate next points and plot in each octant. */
    while (circPt.x < circPt.y) {
    circPt.x++;
    if (p < 0)
    p += 2 * circPt.x + 1;
    else {
    circPt.y--;
    p += 2 * (circPt.x - circPt.y) + 1;
    }
    circlePlotPoints (circCtr, circPt);
    }
    }

    void circlePlotPoints (scrPt circCtr, scrPt circPt)
    {
    setPixel (circCtr.x + circPt.x, circCtr.y + circPt.y);
    setPixel (circCtr.x - circPt.x, circCtr.y + circPt.y);
    setPixel (circCtr.x + circPt.x, circCtr.y - circPt.y);
    setPixel (circCtr.x - circPt.x, circCtr.y - circPt.y);
    setPixel (circCtr.x + circPt.y, circCtr.y + circPt.x);
    setPixel (circCtr.x - circPt.y, circCtr.y + circPt.x);
    setPixel (circCtr.x + circPt.y, circCtr.y - circPt.x);
    setPixel (circCtr.x - circPt.y, circCtr.y - circPt.x);
    }



    روش ساده و خیلی راحت استفاده از تابع gluDisk و استفاده از glu است به این سبک:

    GLUquadricObj *circle = gluNewQuadric ();
    gluQuadricDrawStyle (circle, GLU_FILL);
    gluDisk (circle,0,1,30,1);
    gluDeleteQuadric(circle);

    البته من قصدم تابع دومی بود چون خیلی راحت میشه ازش استفاده کرد...

  11. #11

    نقل قول: آموزش OpenGL

    نقل قول نوشته شده توسط amin1softco مشاهده تاپیک
    فصل سوم
    این فصل بیشتر در مورد الگوریتم های ترسیم در سیستم راستر مثل DDA و برزنهام و نقطه میانی است ولی چیزی که بدرد بخوره این هاست .
    GL_POINTS رسم نقطه در صفحه
    GL_LINES رسم خطوط بین نقاط
    GL_LINE_STRIP رسم خطوطه بین نقاط مختلف از نقطه اول شروع می کنه به هم وصلشون می کنه تا نقطه آخر
    GL_LINE_LOOP مثل حالت قبله فقطه نقطه آخری رو به اولی رسم می کنه
    و همه اینها ثابت های OpenGL هستند و در موقعیت زیر به جای GL_LINES ظاهر می شوند:

    glBegin(GL_LINES);

    glVertex2i(180,15); glVertex2i(10,145);

    glVertex2i(145,10); glVertex2i(15,180);

    glEnd();


    لیست کامل:



    glBegin and glEnd delimit the vertices that define a primitive or a group of like primitives. glBegin accepts a single argument that specifies in which of ten ways the vertices are interpreted. Taking n as an integer count starting at one, and N as the total number of vertices specified, the interpretations are as follows:


    GL_POINTS


    Treats each vertex as a single point. Vertex n defines point n. N points are drawn.


    GL_LINES


    Treats each pair of vertices as an independent line segment. Vertices 2n−1 and 2n define line n. N/2 lines are drawn.


    GL_LINE_STRIP


    Draws a connected group of line segments from the first vertex to the last. Vertices n and n+1 define line n. N−1 lines are drawn.


    GL_LINE_LOOP


    Draws a connected group of line segments from the first vertex to the last, then back to the first. Vertices n and n+1 define line n. The last line, however, is defined by vertices N and 1. N lines are drawn.


    GL_TRIANGLES


    Treats each triplet of vertices as an independent triangle. Vertices 3n−2, 3n−1, and 3n define triangle n. N/3 triangles are drawn.


    GL_TRIANGLE_STRIP


    Draws a connected group of triangles. One triangle is defined for each vertex presented after the first two vertices. For odd n, vertices n, n+1, and n+2 define triangle n. For even n, vertices n+1, n, and n+2 define triangle n. N−2 triangles are drawn.


    GL_TRIANGLE_FAN


    Draws a connected group of triangles. One triangle is defined for each vertex presented after the first two vertices. Vertices 1, n+1, and n+2 define triangle n. N−2 triangles are drawn.


    GL_QUADS


    Treats each group of four vertices as an independent quadrilateral. Vertices 4n−3, 4n−2, 4n−1, and 4n define quadrilateral n. N/4 quadrilaterals are drawn.


    GL_QUAD_STRIP


    Draws a connected group of quadrilaterals. One quadrilateral is defined for each pair of vertices presented after the first pair. Vertices 2n−1, 2n, 2n+2, and 2n+1 define quadrilateral n. N/2−1 quadrilaterals are drawn. Note that the order in which vertices are used to construct a quadrilateral from strip data is different from that used with independent data.


    GL_POLYGON


    Draws a single, convex polygon. Vertices 1 through N define this polygon.


    Only a subset of GL commands can be used between glBegin and glEnd. The commands are glVertex, glColor, glIndex, glNormal, glTexCoord, glEvalCoord, glEvalPoint, glArrayElement, glMaterial, and glEdgeFlag. Also, it is acceptable to use glCallList or glCallLists to execute display lists that include only the preceding commands. If any other GL command is executed between glBegin and glEnd, the error flag is set and the command is ignored.


    Regardless of the value chosen for mode, there is no limit to the number of vertices that can be defined between glBegin and glEnd. Lines, triangles, quadrilaterals, and polygons that are incompletely specified are not drawn. Incomplete specification results when either too few vertices are provided to specify even a single primitive or when an incorrect multiple of vertices is specified. The incomplete primitive is ignored; the rest are drawn.


    The minimum specification of vertices for each primitive is as follows: 1 for a point, 2 for a line, 3 for a triangle, 4 for a quadrilateral, and 3 for a polygon. Modes that require a certain multiple of vertices are GL_LINES (2), GL_TRIANGLES (3), GL_QUADS (4), and GL_QUAD_STRIP (2).



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

  12. #12

    نقل قول: آموزش OpenGL

    با سلام و خسته نباشید
    ممنون از مطالب مفیدتون .
    من یه مشکل اساسی با برنامه dev C++‎‎‎‎ دارم اونم اینکه موقع اجرا کردن برنامه رسم دو خط به #include <GL/glut.h> گیر میده هر کاری گفتین کردم ولی باز درست نشد
    لطفا کمک کنید فوری فوری

  13. #13
    کاربر دائمی
    تاریخ عضویت
    بهمن 1390
    محل زندگی
    تهران
    پست
    437

    نقل قول: آموزش OpenGL

    نقل قول نوشته شده توسط raaamin مشاهده تاپیک
    با سلام و خسته نباشید
    ممنون از مطالب مفیدتون .
    من یه مشکل اساسی با برنامه dev C++‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎ ‎‎‎‎‎‎‎‎‎‎ دارم اونم اینکه موقع اجرا کردن برنامه رسم دو خط به #include <GL/glut.h> گیر میده هر کاری گفتین کردم ولی باز درست نشد
    لطفا کمک کنید فوری فوری
    با سلام

    با توجه به اینکه نویسنده هم به این مشکل برخورد کرده سعی در مرتفع کردن آن نموده و راه حل زیر را ارائه نموده:

    نویسنده سعی می کنه تا نصب "اپن جی ال" در "دو سی پلاس پلاس" (نویسنده از devcpp-4.9.9.2 استفاده کرده) را حل کند:

    ابتدا "اپن جی ال" را از لینک زیر دریافت کنید:
    glut-MingW-DEV-C++‎.zip


    سپس آن را از حالت فشرده خارج سازید:

    Figur 1.PNG


    آنگاه دو فایل های glut.h و glut32.def را در مسیر نصب "دو سی پلاس پلاس" در پوشه Include\GL کپی کنید:

    Figur 2.PNG

    حالا فایل های libglut.a و glut32.def را در مسیر نصب "دو سی پلاس پلاس" در پوشه Lib کپی کنید:

    Figur 3.PNG

    و آخرین فایل با نام glut32.dll را در مسیر نصب ویندوز در پوشه Windows\System32 کپی نمایید:


    Figur 4.PNG

    حالا کار نصب "اپن جی ال" به پایان رسیده است.
    ================================================== ================================================== ==========================

    اکنون یک برنامه برای تست اجرا می کنیم.

    ابتدا یک پروژه جدید با نام دلخواه ایجاد کنید:

    Figur 5.PNG

    سپس یک "سورس فایل" با نام دلخواه به پروژه اضافه کنید:

    Figur 6.PNG

    اکنون کد زیر را در "سورس فایل" کپی نمایید:


    #include <GL/glut.h>


    const int A = 500; /* length of a side of the monitor window */
    const float B = 500; /* length of a side of the clipping rectangle */
    const float C = 200; /* length of a side of the square the program draws */


    void myinit(void)
    {
    glClearColor(0.7, 0.7, 0.7, 0.0); /* gray background */

    glMatrixMode(GL_PROJECTION); /* In World coordinates: */
    glLoadIdentity(); /* position the "clipping rectangle" */
    gluOrtho2D( -B/2, B/2, -B/2, B/2);/* at -B/2, its right edge at +B/2, its bottom */
    glMatrixMode(GL_MODELVIEW); /* edge at -B/2 and its top edge at +B/2 */
    }


    void display( void )
    {

    glClear(GL_COLOR_BUFFER_BIT); /* clear the window */

    glMatrixMode(GL_MODELVIEW); /* The following coordinates are expressed */
    glLoadIdentity(); /* in terms of World coordinates */


    glBegin(GL_POLYGON) ; /* draw a filled polygon */
    glColor3f ( 1.0, 0.3, 0.2); /* draw in light red */
    glVertex2f( -C/2, -C/2 ); /* (x,y) */
    glVertex2f( C/2, -C/2 ); /* (x,y) */
    glVertex2f( C/2, C/2 ); /* (x,y) */
    glVertex2f( -C/2, C/2 ); /* (x,y) */
    glEnd();


    glFlush(); /* send all commands */
    }


    int main(int argc, char** argv)
    {
    glutInit(&argc,argv);
    glutInitWindowSize( A, A ); /* A x A pixel screen window */


    glutInitDisplayMode( GLUT_RGB | GLUT_SINGLE);
    glutCreateWindow("My Rectangle"); /* window title */
    glutDisplayFunc(display); /* tell OpenGL main loop what */
    myinit(); /* set attributes */


    glutMainLoop(); /* pass control to the main loop */

    return 0;
    }




    Figur 7.PNG

    سپس پروژه و سورس فایل را ذخیره نمایید.

    حالا باید فایل زیر را به قسمت پارامتر پروژه اضافه کنید:

    Figur 8.PNG

    ../lib/libopengl32.a
    ../lib/libglu32.a
    ../lib/libglut32.a



    و دیگر وقت اجرای پروژه می باشد.

    Figur 9.PNG

    اکنون کار به پایان رسیده است.
    ================================================== ================================================
    منابع:
    1. http://chortle.ccsu.edu/Bloodshed/howToGL.html
    2. http://www.3dbuzz.com/forum/threads/...compiler-error

    ================================================== ===========================================
    در صورت بروز مشکل پیام بگذارید.

    با تشکر
    آخرین ویرایش به وسیله behzadkhan : پنج شنبه 15 آبان 1393 در 16:18 عصر

  14. #14

    نقل قول: آموزش OpenGL

    فقط یه مشکل هنگام دانلود فایل ضمیمه می نویسه :
    درس مورد نظر وجود ندارد.
    علت :
    1-آدرس را اشتباه تایپ کرده اید.
    2-این صفحه توسط مدیر سایت حذف شده است.
    3- هنگام ایجاد گفتگوی جدید از عناوین نامناسب استفاده شده است.

  15. #15

    نقل قول: آموزش OpenGL

    برای فونت میتونی از کتابخونه FTGL هم استفاده کنی که همه زبونها رو ساپورت میکنه.

  16. #16
    کاربر دائمی آواتار amin1softco
    تاریخ عضویت
    شهریور 1386
    محل زندگی
    پای آن سرو بلند
    پست
    1,832

    نقل قول: آموزش OpenGL

    نقل قول نوشته شده توسط pswin.pooya مشاهده تاپیک
    برای فونت میتونی از کتابخونه FTGL هم استفاده کنی که همه زبونها رو ساپورت میکنه.
    خوب شما می تونی یک مثال اینجا بزاری که از کتابخانه FTGL استفاده کنه و یک متن فارسی را بنویسه.....

  17. #17

    نقل قول: آموزش OpenGL

    مثالهای FTGL همراه سورسش برای ویژوال استادیو و ... هستن. علاوه بر این شما می تونید از ویکی اون هم استفاده کنید:
    http://sourceforge.net/apps/mediawik...itle=Main_Page

    من تست نکردم ولی ممکنه که FTGL با OpenGL 3.x و OpenGL 4.x به خاطر نداشتن پایپ لاین fixed سازگار نباشه و هیچی نشون نده توی این حالت میتونید از شیدرهای زیر برای نمایش استفاده کنید:

    شیدر ورتکس:
    varying vec2 Texcoord;

    void main( void )
    {
    gl_Position = ftransform();
    Texcoord = gl_MultiTexCoord0.xy;

    }


    شیدر فرگمنت:
    uniform sampler2D baseMap;

    varying vec2 Texcoord;

    void main( void )
    {
    gl_FragColor = texture2D( baseMap, Texcoord );

    }


    البته این برای GLSL با هسته 110 هستش که استاندارد OpenGL 3.x حداقل 130 هستش. ولی بازهم به درستی کامپایل میشه فقط ممکنه که یه مقدار کارایی پایین تر داشته باشه. به هر حال FTGL هم سریعا با OpenGL 3.x+ سازگار میشه.

  18. #18
    کاربر دائمی آواتار amin1softco
    تاریخ عضویت
    شهریور 1386
    محل زندگی
    پای آن سرو بلند
    پست
    1,832

    نقل قول: آموزش OpenGL

    نقل قول نوشته شده توسط pswin.pooya مشاهده تاپیک
    مثالهای FTGL همراه سورسش برای ویژوال استادیو و ... هستن. علاوه بر این شما می تونید از ویکی اون هم استفاده کنید:
    http://sourceforge.net/apps/mediawik...itle=Main_Page

    من تست نکردم ولی ممکنه که FTGL با OpenGL 3.x و OpenGL 4.x به خاطر نداشتن پایپ لاین fixed سازگار نباشه و هیچی نشون نده توی این حالت میتونید از شیدرهای زیر برای نمایش استفاده کنید:

    شیدر ورتکس:
    varying vec2 Texcoord;

    void main( void )
    {
    gl_Position = ftransform();
    Texcoord = gl_MultiTexCoord0.xy;

    }
    شیدر فرگمنت:
    uniform sampler2D baseMap;

    varying vec2 Texcoord;

    void main( void )
    {
    gl_FragColor = texture2D( baseMap, Texcoord );

    }
    البته این برای GLSL با هسته 110 هستش که استاندارد OpenGL 3.x حداقل 130 هستش. ولی بازهم به درستی کامپایل میشه فقط ممکنه که یه مقدار کارایی پایین تر داشته باشه. به هر حال FTGL هم سریعا با OpenGL 3.x+ سازگار میشه.
    والا من هر کاری می کنم 500 اکتسرنال ارور به کتابخونه هاش می گیره شما اگه بتونی تحت ویژوال 2008یک نمونه درست کنی بزاری اینجا مشکل ما هم حل بشه
    http://www.opengl.org/resources/features/fontsurvey/
    آخرین ویرایش به وسیله amin1softco : شنبه 07 فروردین 1389 در 11:59 صبح

  19. #19

    نقل قول: آموزش OpenGL

    سلام
    خسته نباشید مطالب مفیدی قرار دادین بسیاز تشکر
    سوال: چگونه تو opengl وقتی شکلی رسم میکنیم با تغییر سایز صفحه این شکل ما هم تغییر سایز پیدا کنه به نسبت صفحه اصلی؟اگه میشه یه شبه کد بزارین

    سوال بعدی:اینکه ما وقتی رو این شکل کلیک میکنیم یه کاری انجام میشه ولی وقتی صفحه را تغییر سایز دادیمش این محدوده انتخاب موس عوض میشه و روش دیگه کلیک نمیششه بلکه جایی دیگه کلیک میکنم میشه یعنی من محدوده انتخابه موسو ثابت تعریف کردم چطور پویاش کنم؟

  20. #20

    نقل قول: آموزش OpenGL

    اول باید کتابخونش رو کامپایل کنی و بعد از اون مثالها رو.

  21. #21
    کاربر دائمی آواتار amin1softco
    تاریخ عضویت
    شهریور 1386
    محل زندگی
    پای آن سرو بلند
    پست
    1,832

    نقل قول: آموزش OpenGL

    ببین این کتابخونه هاش که کامپایل شده با چند تا برنامه که خودش برای تست گذاشته هر کدوم رو صلاح دونستی پروژه 2008 کن بزار ما هم استفاد ه کنیم
    فایل های ضمیمه فایل های ضمیمه

  22. #22

    نقل قول: آموزش OpenGL

    سلام منم چند تا کتاب گزاشتم خواستید استفاده کنید
    www.perspolisnews.info

  23. #23
    کاربر دائمی آواتار amin1softco
    تاریخ عضویت
    شهریور 1386
    محل زندگی
    پای آن سرو بلند
    پست
    1,832

    نقل قول: آموزش OpenGL

    نقل قول نوشته شده توسط mg_mahyar مشاهده تاپیک
    سلام منم چند تا کتاب گزاشتم خواستید استفاده کنید
    www.perspolisnews.info
    به نظر من برای شروع رد بوک خوبه می تونید خیلی ز این کتاب ها رو از آدرس زیر در یافت کنید:
    http://opengl.persiangig.com/page.html

    اینم لیست خفن :
    http://gigle.ws/programming%20opengl...on.462504.html

    اما کتاب به تنهایی فایده نداره حتما برنامه ها رو اجرا کنید

  24. #24

    نقل قول: آموزش OpenGL

    نقل قول نوشته شده توسط amin1softco مشاهده تاپیک
    به نظر من برای شروع رد بوک خوبه می تونید خیلی ز این کتاب ها رو از آدرس زیر در یافت کنید:
    http://opengl.persiangig.com/page.html

    اینم لیست خفن :
    http://gigle.ws/programming%20opengl...on.462504.html

    اما کتاب به تنهایی فایده نداره حتما برنامه ها رو اجرا کنید
    »ا ما فارسی هست

  25. #25
    کاربر تازه وارد آواتار zuck_619
    تاریخ عضویت
    فروردین 1387
    محل زندگی
    خونمون
    سن
    34
    پست
    31

    نقل قول: آموزش OpenGL

    چرا ناراحت میشی . سوال کردن که عیب نیست . سوال من اینه که اینجا scrPt مقداردهی نشده و چیزی رسم نمیکنه . مگه یک شی نیست ؟؟؟

  26. #26
    کاربر دائمی آواتار amin1softco
    تاریخ عضویت
    شهریور 1386
    محل زندگی
    پای آن سرو بلند
    پست
    1,832

    نقل قول: آموزش OpenGL

    نقل قول نوشته شده توسط zuck_619 مشاهده تاپیک
    چرا ناراحت میشی . سوال کردن که عیب نیست . سوال من اینه که اینجا scrPt مقداردهی نشده و چیزی رسم نمیکنه . مگه یک شی نیست ؟؟؟
    به خدا شرمنده شما ببخشید من اشتباه کردم
    اما خوب اون خط برای این اضافه شده چون ما تابع circlePlotPoints را بعد از تابعی که الان در حال اجراش هستیم فراخوانی می کنیم یعنی این خط به کامپایلر می گه که ما احتیاج به تعریف این تابع داریم در این نقطه شما می تونی این خط رو حذف کنی اینجوری:

    #include <GL/glut.h>

    class scrPt {
    public:
    GLint x, y;
    };

    void setPixel (GLint x, GLint y)
    {
    glBegin (GL_POINTS);
    glVertex2i (x, y);
    glEnd ( );
    }


    void circlePlotPoints (scrPt circCtr, scrPt circPt);
    {
    setPixel (circCtr.x + circPt.x, circCtr.y + circPt.y);
    setPixel (circCtr.x - circPt.x, circCtr.y + circPt.y);
    setPixel (circCtr.x + circPt.x, circCtr.y - circPt.y);
    setPixel (circCtr.x - circPt.x, circCtr.y - circPt.y);
    setPixel (circCtr.x + circPt.y, circCtr.y + circPt.x);
    setPixel (circCtr.x - circPt.y, circCtr.y + circPt.x);
    setPixel (circCtr.x + circPt.y, circCtr.y - circPt.x);
    setPixel (circCtr.x - circPt.y, circCtr.y - circPt.x);
    }


    void circleMidpoint (scrPt circCtr, GLint radius)
    {
    scrPt circPt;

    GLint p = 1 - radius; // Initial value of midpoint parameter.

    circPt.x = 0; // Set coordinates for top point of circle.
    circPt.y = radius;

    /* Plot the initial point in each circle quadrant. */
    circlePlotPoints (circCtr, circPt);

    /* Calculate next points and plot in each octant. */
    while (circPt.x < circPt.y) {
    circPt.x++;
    if (p < 0)
    p += 2 * circPt.x + 1;
    else {
    circPt.y--;
    p += 2 * (circPt.x - circPt.y) + 1;
    }
    circlePlotPoints (circCtr, circPt);
    }
    }


    یا اینجوری

    #include <GL/glut.h>

    class scrPt {
    public:
    GLint x, y;
    };

    void setPixel (GLint x, GLint y)
    {
    glBegin (GL_POINTS);
    glVertex2i (x, y);
    glEnd ( );
    }

    void circlePlotPoints (scrPt, scrPt);

    void circleMidpoint (scrPt circCtr, GLint radius)
    {
    scrPt circPt;

    GLint p = 1 - radius; // Initial value of midpoint parameter.

    circPt.x = 0; // Set coordinates for top point of circle.
    circPt.y = radius;

    /* Plot the initial point in each circle quadrant. */
    circlePlotPoints (circCtr, circPt);

    /* Calculate next points and plot in each octant. */
    while (circPt.x < circPt.y) {
    circPt.x++;
    if (p < 0)
    p += 2 * circPt.x + 1;
    else {
    circPt.y--;
    p += 2 * (circPt.x - circPt.y) + 1;
    }
    circlePlotPoints (circCtr, circPt);
    }
    }

    void circlePlotPoints (scrPt circCtr, scrPt circPt);
    {
    setPixel (circCtr.x + circPt.x, circCtr.y + circPt.y);
    setPixel (circCtr.x - circPt.x, circCtr.y + circPt.y);
    setPixel (circCtr.x + circPt.x, circCtr.y - circPt.y);
    setPixel (circCtr.x - circPt.x, circCtr.y - circPt.y);
    setPixel (circCtr.x + circPt.y, circCtr.y + circPt.x);
    setPixel (circCtr.x - circPt.y, circCtr.y + circPt.x);
    setPixel (circCtr.x + circPt.y, circCtr.y - circPt.x);
    setPixel (circCtr.x - circPt.y, circCtr.y - circPt.x);
    }


  27. #27

    نقل قول: آموزش OpenGL

    سلام
    متاسفانه نمی شد تاپیک جدید ایجاد کنم بنابراین سوالمو همین جا مطرح می کنم:
    من بررسی کردم و نحوه ی استفاده از تابع gluCylinder رو برای کاربرد دلخواهم متوجه شدم . حالا می خوام بدونم چطور می تونم محورهای مختصات رو با استفاده از این تابع رسم کنم. در واقع می خوام که هر کدوم از محور ها یک میله باشه و نه خط. البته طول مشخصی هم داشته باشه که خودم تعیین می کنم. همینطوری با توجه به فرمی که داره متاسفانه نه تنها چیزی برام رسم نمی کنه که حتی اشیاء دیگه ای رو هم که رسم کردم محو می کنه. من روی یک گرید می خوام اینو رسم کنم.

    ممنون می شم اگر جواب بدید.

  28. #28

    Post کمک در زمینه حرکت یک شی

    سلام به دوستان گلم من یک برنامه ای نوشتم ساده که بازی پینگ پنگ سگاست
    که به شهر زیر است:
    دو تا مستعطیل داره و یک خط وسط
    یک توپ به شکل مربع
    حال من یک جاش موندم میخوام این توپ طوری راه بره به صورت اتو ماتیک که هر موقع به هر یک از مسطعتیل ها اسابت کرد برگرده و کار دیگرم اینه که بتونم با فلشها کلید این راکت ها رو جاب جا کنم
    از دوستانو عزیز میخوام منو در جواب این مسئله کمک کنن در زیر نمونه کد برنامه و حالتی از عکس بازی رو گذاشتم ممنون از دوستان گلم:
    دوستان اگر میشه کد برنامه شو برام بزارین چرا که تا اینجاشم سخت در گیر بودم با تشکر



    #include <GL/glut.h>
    float i=0;
    void special( int key, int x, int y)
    {
    switch(key){
    case GLUT_KEY_UP:
    i+=10;
    break;
    case GLUT_KEY_DOWN:
    i-=10;
    break;
    case GLUT_KEY_HOME:
    exit(i);
    break;
    }
    }
    void Display()
    {
    glClear(GL_COLOR_BUFFER_BIT) ;
    glColor3f(1.0, 1.0, 0.0);
    glBegin(GL_LINES );
    // mostatiel Raghit
    glVertex2f(0.85, 0.50);
    glVertex2f(0.95, 0.50);
    glVertex2f(0.85, -0.50);
    glVertex2f(0.95,- 0.50);
    glVertex2f(0.85, 0.50);
    glVertex2f(0.85,- 0.50);
    glVertex2f(0.95, -0.50);
    glVertex2f(0.95, 0.50);
    //Mostatil left
    glVertex2f(-0.85, 0.50);
    glVertex2f(-0.95, 0.50);
    glVertex2f(-0.85, -0.50);
    glVertex2f(-0.95,- 0.50);
    glVertex2f(-0.85, 0.50);
    glVertex2f(-0.85,- 0.50);
    glVertex2f(-0.95, 0.50);
    glVertex2f(-0.95,- 0.50);
    //Linse Vasat
    glVertex2f(0.00, 1);
    glVertex2f(0.00, -1.0);
    // morabae vasat
    glEnd();
    glPushMatrix();
    glEnable (GL_POLYGON);
    glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    glRotatef(i,0,0,0.0);
    //glPointSize(20.0);
    glColor3f(1.0, 0.0,.0);
    glBegin(GL_POLYGON);
    glColor3f(0,1,0.50);
    glVertex2f(-0.80, 0.30);
    glVertex2f(-0.85, 0.30);
    glVertex2f(-0.85, 0.20);
    glVertex2f(-0.80, 0.20);

    glEnd();
    glPopMatrix();
    glutSwapBuffers();
    }
    #define WIDTH 1500
    #define HEIGHT 1500
    int main(int argc, char **argv)
    {
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
    glutInitWindowPosition(50,00);
    glutInitWindowSize(WIDTH, HEIGHT) ;
    glutCreateWindow("Circle key");
    glClearColor(0.0,0.0,0.0,0.0);
    glutDisplayFunc(Display);
    glutIdleFunc(Display);
    glutSpecialFunc(special);
    glutMainLoop();
    return 0;
    }



    عکس از محیط بازی

  29. #29

    نقل قول: آموزش OpenGL

    به راحتی میتونید کتابهای معتبر OpenGL رو از آدرس زیر داونلود کنید:
    http://opengl.persiangig.com/

  30. #30
    کاربر دائمی آواتار amin1softco
    تاریخ عضویت
    شهریور 1386
    محل زندگی
    پای آن سرو بلند
    پست
    1,832

    نقل قول: آموزش OpenGL

    کاشکی یکمی دقت می کردی و پست می دادی یا حداقل پست قبلی رو مطالعه می کردی

  31. #31
    کاربر تازه وارد آواتار zuck_619
    تاریخ عضویت
    فروردین 1387
    محل زندگی
    خونمون
    سن
    34
    پست
    31

    نقل قول: آموزش OpenGL

    سلام به همه . عیدتون مبارک ... من میخوام یک برنامه بنویسم که یک دایره کوچک رو روی محیط دایره بزرگ حرکت بده . اگه میشه کمک کنید ...
    عکس های ضمیمه عکس های ضمیمه

  32. #32
    کاربر دائمی آواتار amin1softco
    تاریخ عضویت
    شهریور 1386
    محل زندگی
    پای آن سرو بلند
    پست
    1,832

    نقل قول: آموزش OpenGL

    دوست من شما برای رسم نقطه روی دایره از این کد استفاده کن

    void circle (GLint x, GLint y)
    {
    glEnable (GL_POINT_SMOOTH);
    glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    glPointSize (120);
    glBegin (GL_POINTS);glVertex2i (x, y);glEnd ( );
    glDisable (GL_POINT_SMOOTH);
    }
    برای اینکه مسیر رو برای نقطه مشخص کنی از فرمول قطبی دایره استفاده کند


    x=r*(cos(t))
    y=r*(sin(t))

    و برای رسم خود دایره هم چندین روش موجوده که یکیش اینه که وقتی کره را در حالت دوبعدی به صورت سیمی رسم کنی میشه دایره.....

  33. #33
    کاربر دائمی آواتار amin1softco
    تاریخ عضویت
    شهریور 1386
    محل زندگی
    پای آن سرو بلند
    پست
    1,832

    نقل قول: آموزش OpenGL

    منم سرگرم شدم نوشتمش البته با دایره بوسیله نقطه میانی این صورتی دورش می چرخه:




    #include <math.h>
    #include <GL/glut.h>
    float i=0;
    class scrPt {
    public:
    GLint x, y;
    };

    void setPixel (GLint x, GLint y)
    {glPointSize (1);
    glBegin (GL_POINTS);
    glVertex2i (x, y);
    glEnd ( );
    }

    void circleMidpoint (scrPt circCtr, GLint radius)
    {
    scrPt circPt;

    GLint p = 1 - radius; // Initial value of midpoint parameter.

    circPt.x = 0; // Set coordinates for top point of circle.
    circPt.y = radius;

    void circlePlotPoints (scrPt, scrPt);

    /* Plot the initial point in each circle quadrant. */
    circlePlotPoints (circCtr, circPt);

    /* Calculate next points and plot in each octant. */
    while (circPt.x < circPt.y) {
    circPt.x++;
    if (p < 0)
    p += 2 * circPt.x + 1;
    else {
    circPt.y--;
    p += 2 * (circPt.x - circPt.y) + 1;
    }
    circlePlotPoints (circCtr, circPt);
    }
    }

    void circlePlotPoints (scrPt circCtr, scrPt circPt)
    {
    setPixel (circCtr.x + circPt.x, circCtr.y + circPt.y);
    setPixel (circCtr.x - circPt.x, circCtr.y + circPt.y);
    setPixel (circCtr.x + circPt.x, circCtr.y - circPt.y);
    setPixel (circCtr.x - circPt.x, circCtr.y - circPt.y);
    setPixel (circCtr.x + circPt.y, circCtr.y + circPt.x);
    setPixel (circCtr.x - circPt.y, circCtr.y + circPt.x);
    setPixel (circCtr.x + circPt.y, circCtr.y - circPt.x);
    setPixel (circCtr.x - circPt.y, circCtr.y - circPt.x);
    }

    void circle (GLint x, GLint y)
    {glColor3f(1.0, 0.0, 1.0);
    glEnable (GL_POINT_SMOOTH);
    glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    glPointSize (120);
    glBegin (GL_POINTS);glVertex2i (x, y);glEnd ( );
    glDisable (GL_POINT_SMOOTH);
    }


    void init(void){
    glClearColor(1.0,1.0,1.0,0.0);
    glMatrixMode(GL_PROJECTION); //projection parameters
    gluOrtho2D(0.0,200.0,0.0,150.0); //sets up WC extent
    }
    void dis(void)
    {
    glClear(GL_COLOR_BUFFER_BIT); //clears display window
    glColor3f(0.0, 1.0, 1.0);

    scrPt xy;
    i+=0.1;
    xy.x=100;
    xy.y=75;
    circleMidpoint (xy, 35);
    circle((35*cos((M_PI/180)*(i)))+100,(35*sin((M_PI/180)*(i)))+75);
    if(i>360) i=0;
    glFlush();
    glutSwapBuffers();
    }

    int main(int argc, char** argv)
    {
    glutInit(&argc, argv); //initialise GLUT
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); //sets display mode
    glutInitWindowPosition(50, 100); //top left display window pos
    glutInitWindowSize(400, 300); //display win width and height in pixel coords
    glutCreateWindow("Example01 - Circle"); //now create display win
    glClearColor(1.0,1.0,1.0,0.0); //display window set to white
    glMatrixMode(GL_PROJECTION); //projection parameters
    gluOrtho2D(0.0,200.0,0.0,150.0); //sets up WC extent
    glutDisplayFunc(dis); //call drawing func
    glutIdleFunc(dis);
    glutMainLoop(); //display all and wait
    return 0;
    }



    فایل های ضمیمه فایل های ضمیمه

  34. #34
    کاربر دائمی
    تاریخ عضویت
    فروردین 1387
    محل زندگی
    شمال
    پست
    115

    نقل قول: آموزش OpenGL

    آقا دمتون گرم.
    خیلی با حال بود.
    میشه یه توضیح هم بدین.
    خوبی ذاکر؟

  35. #35
    کاربر تازه وارد آواتار zuck_619
    تاریخ عضویت
    فروردین 1387
    محل زندگی
    خونمون
    سن
    34
    پست
    31

    نقل قول: آموزش OpenGL

    خیلی ممنون ...

  36. #36
    کاربر دائمی آواتار amin1softco
    تاریخ عضویت
    شهریور 1386
    محل زندگی
    پای آن سرو بلند
    پست
    1,832

    نقل قول: آموزش OpenGL

    ببین چون رسم دایره سخته ما یک پیکسل بزرگ را به عنوان دایره که حرکت می کنه در نظر کرفتیم و ازاونجا که پیکسل بزرگ به صورت چهار گوشه ما با دستورات صاف کردن (نرم کردن) گوشه ها تبدیلش کردیم به یک دایره این دو خط

    glEnable (GL_POINT_SMOOTH);
    glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

    بعد بوسیله glutIdleFunc(dis);این تابع به glut دستور میدیم که تابع dis رو در اولین زمان ممکن بعدی اجرا کنه و حالت انیمیشن به خاطر این تابعه و خط i+=0.1; که مقدار i را در هر بار فرا خوانی افزایش میده ...
    اگه بازم گنگ بگید تا سطر به سطر توضیح بدم

  37. #37
    کاربر تازه وارد آواتار zuck_619
    تاریخ عضویت
    فروردین 1387
    محل زندگی
    خونمون
    سن
    34
    پست
    31

    نقل قول: آموزش OpenGL

    روش نقطه میانی رو یکم توضیح بده

  38. #38
    کاربر دائمی آواتار amin1softco
    تاریخ عضویت
    شهریور 1386
    محل زندگی
    پای آن سرو بلند
    پست
    1,832

    نقل قول: آموزش OpenGL

    ببین چون صفحه مانیتور از یک سری پیکسل تشکیل شده برای تشخیص اینکه کدام پیکسل ها ترسیم شوند از الگوریتم ها مختلفی استفاده می شه یکی از اونها نقطه میانی هست که در این الگوریتم ما تنها یکی از اوکتانت های دایره را ترسیم می کنیم و با استفاده که از خاصیت قرینه بودن دایره در حین رسم در یک پیکسل با دستورات آخری در اکتانت ها دیگه هم رسمش می کنیم.


    void circlePlotPoints (scrPt circCtr, scrPt circPt);
    {
    setPixel (circCtr.x + circPt.x, circCtr.y + circPt.y);
    setPixel (circCtr.x - circPt.x, circCtr.y + circPt.y);
    setPixel (circCtr.x + circPt.x, circCtr.y - circPt.y);
    setPixel (circCtr.x - circPt.x, circCtr.y - circPt.y);
    setPixel (circCtr.x + circPt.y, circCtr.y + circPt.x);
    setPixel (circCtr.x - circPt.y, circCtr.y + circPt.x);
    setPixel (circCtr.x + circPt.y, circCtr.y - circPt.x);
    setPixel (circCtr.x - circPt.y, circCtr.y - circPt.x);
    }
    حالا وقتی ما یک پیکسل را رسم می کنیم برای اینکه پیکسل بعدی رو انتخاب کنیم معمولا دو انتخاب بیشتر نداریم که (x+1,y) یا (1-x+1,y) هست حالا برای تعیین اینکه کدوم پیکسل انتخاب بشه از فرمول نقطه میانی استفاده می کنیم که شعاع دایره را از فرمول اصلیش کم می کنیم معادله حاصل علامتش تعیین می کنه که پیکسل بعدی باید کجا رسم بشه الگوریتم کاملش اینه:

    نکته 5/4~1

  39. #39
    کاربر تازه وارد آواتار zuck_619
    تاریخ عضویت
    فروردین 1387
    محل زندگی
    خونمون
    سن
    34
    پست
    31

    نقل قول: آموزش OpenGL

    خیلی ممنون از توضیحات . فقط میخواستم بدونم :
    1 . نقش circleMidpoint چیه ؟
    2. اگه بخوا دایره در جهت عقربه ساعت بچرخه کجارو باید عوض کرد ؟
    آخرین ویرایش به وسیله zuck_619 : دوشنبه 09 فروردین 1389 در 18:58 عصر

  40. #40
    کاربر دائمی آواتار amin1softco
    تاریخ عضویت
    شهریور 1386
    محل زندگی
    پای آن سرو بلند
    پست
    1,832

    نقل قول: آموزش OpenGL

    یک دایره رو در مختصات x ,y صفحه با شعاع مشخص شده بوسیله نقاط رسم می کنه همین الگوریتم نقطه میانی را پیاده سازی می کنه ... قبلا گفتم برای رسم یک دایره روش های خیلی زیادی OpenGL موجوده یک روش دیگه که میشه سوال رو باهاش حل کرد این جوریه

    glPushMatrix();
    glTranslated ( 100 , 75 , 0 ) ;
    glColor3f(0.0, 1.0, 1.0);
    glutWireSphere ( 50.0 , 100 , 100 ) ;
    glPopMatrix();
    برای معکوس شدن حرکت نقطه باید i را از 360 شروع کنیم و هر مرحله کمترش کنیم اون شرطه رو هم باید عوض کرد یک راه دیگه هم این کده که کاملا با اون یکی متفاوته:


    #include <windows.h>
    #include <GL/glut.h>
    float i=0;
    void Display()
    {
    glClear(GL_COLOR_BUFFER_BIT);
    glColor3f(1.0, 0.0, 1.0);

    GLUquadricObj *circle = gluNewQuadric ();
    gluQuadricDrawStyle (circle, GLU_SILHOUETTE);
    gluDisk (circle,0,0.8,50,1);
    gluDeleteQuadric(circle);

    glPushMatrix();
    glEnable (GL_POINT_SMOOTH);
    glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    i+=0.04;
    glRotatef(i,0,0,0.1);
    glPointSize(10.0);
    glColor3f(0.0, 1.0, 1.0);
    glBegin(GL_POINTS);
    glVertex2f(0.25, 0.75);
    glEnd();
    glPopMatrix();
    glutSwapBuffers();
    }

    int main(int argc, char **argv)
    {
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
    glutInitWindowPosition(500,500);
    glutInitWindowSize(300,300);
    glutCreateWindow("Circle - 01");
    glClearColor(1.0,1.0,1.0,0.0);
    glutDisplayFunc(Display);
    glutIdleFunc(Display);
    glutMainLoop();
    return 0;
    }

    آخرین ویرایش به وسیله amin1softco : سه شنبه 10 فروردین 1389 در 02:38 صبح

صفحه 1 از 10 123 ... آخرآخر

برچسب های این تاپیک

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •