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

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

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

    آموزش OpenGL

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

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

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

    چگونه یک پروژه OpenGL با vC++‎‎‎‎‎‎2008 ایجاد کنیم حالت win32

    1- محتویات فایل ضمیمه شده که حاوی دو پوشه lib و include است را در مسیر نصب ویژال کپی کنید این مسیر به طور پیش فرض اینجاست است:
    X:\Program Files\Microsoft Visual Studio 9.0\VC
    نکته : هر اخطاری داد yes کنید.

    2- Microsoft Visual Studio 2008 را اجرا کنید و یک پروژه جدید ایجاد کنید:
    file→ Project (Ctrl+Shift+N).
    Win32 Project را انتخاب و یک نام دلخواه وارد و سپس ok کنید.
    روی next کلیک کنید و چک باکس Empty Project را تیک بزنیدو Finish ;kdn.



    3- یک فایل سورس به پروژه اضافه کنید:
    Project → Add New Item (Ctrl+Shift+A
    نوع (.cpp) را انتخاب کنید و یک نام دلخواه روی آن بگزارید و ok کنید.

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



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


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

    HWND hWnd;
    HDC hDC;
    HGLRC hRC;

    // Set up pixel format for graphics initialization
    void SetupPixelFormat()
    {
    PIXELFORMATDESCRIPTOR pfd, *ppfd;
    int pixelformat;

    ppfd = &pfd;

    ppfd->nSize = sizeof(PIXELFORMATDESCRIPTOR);
    ppfd->nVersion = 1;
    ppfd->dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
    ppfd->dwLayerMask = PFD_MAIN_PLANE;
    ppfd->iPixelType = PFD_TYPE_COLORINDEX;
    ppfd->cColorBits = 16;
    ppfd->cDepthBits = 16;
    ppfd->cAccumBits = 0;
    ppfd->cStencilBits = 0;

    pixelformat = ChoosePixelFormat(hDC, ppfd);
    SetPixelFormat(hDC, pixelformat, ppfd);
    }

    // Initialize OpenGL graphics
    void InitGraphics()
    {
    hDC = GetDC(hWnd);

    SetupPixelFormat();

    hRC = wglCreateContext(hDC);
    wglMakeCurrent(hDC, hRC);

    glClearColor(0, 0, 0, 0.5);
    glClearDepth(1.0);
    glEnable(GL_DEPTH_TEST);
    }

    // Resize graphics to fit window
    void ResizeGraphics()
    {
    // Get new window size
    RECT rect;
    int width, height;
    GLfloat aspect;

    GetClientRect(hWnd, &rect);
    width = rect.right;
    height = rect.bottom;
    aspect = (GLfloat)width / height;

    // Adjust graphics to window size
    glViewport(0, 0, width, height);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(45.0, aspect, 1.0, 100.0);
    glMatrixMode(GL_MODELVIEW);
    }

    // Draw frame
    void DrawGraphics()
    {
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    // Set location in front of camera
    glLoadIdentity();
    glTranslated(0, 0, -10);

    // Draw a square
    glBegin(GL_QUADS);
    glColor3d(1, 0, 0);
    glVertex3d(-2, 2, 0);
    glVertex3d(2, 2, 0);
    glVertex3d(2, -2, 0);
    glVertex3d(-2, -2, 0);
    glEnd();

    // Show the new scene
    SwapBuffers(hDC);
    }

    // Handle window events and messages
    LONG WINAPI MainWndProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
    {
    switch (uMsg)
    {
    case WM_SIZE:
    ResizeGraphics();
    break;

    case WM_CLOSE:
    DestroyWindow(hWnd);
    break;

    case WM_DESTROY:
    PostQuitMessage(0);
    break;

    // Default event handler
    default:
    return DefWindowProc (hWnd, uMsg, wParam, lParam);
    break;
    }

    return 1;
    }

    int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
    {

    const LPCWSTR appname = TEXT("OpenGL Sample");

    WNDCLASS wndclass;
    MSG msg;

    // Define the window class
    wndclass.style = 0;
    wndclass.lpfnWndProc = (WNDPROC)MainWndProc;
    wndclass.cbClsExtra = 0;
    wndclass.cbWndExtra = 0;
    wndclass.hInstance = hInstance;
    wndclass.hIcon = LoadIcon(hInstance, appname);
    wndclass.hCursor = LoadCursor(NULL,IDC_ARROW);
    wndclass.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
    wndclass.lpszMenuName = appname;
    wndclass.lpszClassName = appname;

    // Register the window class
    if (!RegisterClass(&wndclass)) return FALSE;

    // Create the window
    hWnd = CreateWindow(
    appname,
    appname,
    WS_OVERLAPPEDWINDOW | WS_CLIPSIBLINGS | WS_CLIPCHILDREN,
    CW_USEDEFAULT,
    CW_USEDEFAULT,
    800,
    600,
    NULL,
    NULL,
    hInstance,
    NULL);

    if (!hWnd) return FALSE;

    // Initialize OpenGL
    InitGraphics();

    // Display the window
    ShowWindow(hWnd, nCmdShow);
    UpdateWindow(hWnd);

    // Event loop
    while (1)
    {
    if (PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE) == TRUE)
    {
    if (!GetMessage(&msg, NULL, 0, 0)) return TRUE;

    TranslateMessage(&msg);
    DispatchMessage(&msg);
    }
    DrawGraphics();
    }

    wglDeleteContext(hRC);
    ReleaseDC(hWnd, hDC);
    }

    این کد برای تست بود نه آموزش و کاری به کتاب نداشت.
    منبع
    یک نکته خیلی مهم درسته در این مثال از کتابخانه glut برای ساخت پنجره استفاده نشده ولی این کتاب خانه در فایل های ضمیمه dlls needed موجوده و برای استفاده از اون باید اونو یا در پوشه اجراییه پروژه (Debug or Release)یا در پوشه سیستم ویندوز به آدرس زیر کپی نمایید.
    copy glut32.dll to X:\Windows\system
    یا
    copy glut32.dll to X:\Windows\system32
    در سیستم عامل های 64 بیتی باید در پوشه syswow64 کپی بشه
    copy glut32.dll to X:\Windows\SysWOW64

    مراحل ایجاد یک پروژه glut به
    روایت تصویر
    آموزش کامل مفهومی به صورت فیلم 10 دقیقه ایی 7مگ از اینجا دانلود کنید.

    فایل های ضمیمه فایل های ضمیمه
    آخرین ویرایش به وسیله amin1softco : سه شنبه 16 خرداد 1391 در 09:50 صبح دلیل: فیلم اجرای glut

  3. #3

    نقل قول: آموزش 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

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

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

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

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



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

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



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

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

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

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

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

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


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

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

  5. #5
    کاربر دائمی آواتار 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 عصر

  6. #6

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

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

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

  7. #7
    کاربر دائمی آواتار 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 عصر

  8. #8
    کاربر دائمی آواتار 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;
    }


  9. #9
    کاربر دائمی آواتار 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 عصر

  10. #10
    کاربر دائمی آواتار 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 عصر

  11. #11
    کاربر دائمی آواتار 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);

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

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

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

    چگونه با OpenGL بنویسیم
    شما در هر مقطعی که باشید و قصد استفاده از هر بسته گرافیکی را داشته باشین یکی از نیازهای شما نمایش یک متن هست حتی وقتی بازی طراحی می کنید یا می خواهید یک توضیحی به کار اضافه کنید باید بتونید که با یک نوشته با کاربر ایجاد ارتباط کنید خوب برای نمایش یک نوشته در هسته gl تابع بدرد بخوری وجود نداره ولی در glut دو تابع برای این کار تعبیه شده که می تونید از اونها استفاده کنید یکی glutBitmapCharacter و دیگری glutStrokeCharacter که در این دو تابع فونت بدری بخوری وجو نداره فارسی هم که اصلا نمیشه نوشت اما خوب دوتا مثال اینجا قرار می دم از نحوه ستفاده این دو تابع (در بعضی نسخه ها Character آخرتابع به String تبدیل میشه ) :
    مثال 1

    #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 output(GLfloat x, GLfloat y, char *text){
    char *p;

    glPushMatrix();
    glTranslatef(x, y, 0);
    for (p = text; *p; p++)
    glutStrokeCharacter(GLUT_STROKE_ROMAN, *p);/* 2 ta font bishtar nadare
    GLUT_STROKE_ROMAN
    A proportionally spaced Roman Simplex font for ASCII characters 32 through 127. The maximum top character in the font is 119.05 units; the bottom descends 33.33 units.
    GLUT_STROKE_MONO_ROMAN
    A mono-spaced spaced Roman Simplex font (same characters as GLUT_STROKE_ROMAN) for ASCII characters 32 through 127. The maximum top character in the font is 119.05 units; the bottom descends 33.33 units. Each character is 104.76 units wide. */
    glPopMatrix();
    }
    void txt(void){
    glClear (GL_COLOR_BUFFER_BIT);
    glColor3f(0.0, 0.0, 1.0); //line colour set to blue
    output(0, 20, "hi");
    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("Write text example 1"); //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(txt); //call drawing func
    glutMainLoop(); //display all and wait
    return 0;
    }


    مثال 2

    #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 output(int x, int y, char *string)
    {
    int len, i;
    glRasterPos2f(x, y);
    len = (int) strlen(string);
    for (i = 0; i < len; i++)
    {
    glutBitmapCharacter(GLUT_BITMAP_HELVETICA_18, string[i]);/* chand halat dare be sharh zir
    Without using any display lists, glutBitmapCharacter renders the character in the named bitmap font. The available fonts are:

    GLUT_BITMAP_8_BY_13
    A fixed width font with every character fitting in an 8 by 13 pixel rectangle. The exact bitmaps to be used is defined by the standard X glyph bitmaps for the X font named:

    -misc-fixed-medium-r-normal--13-120-75-75-C-80-iso8859-1GLUT_BITMAP_9_BY_15
    A fixed width font with every character fitting in an 9 by 15 pixel rectangle. The exact bitmaps to be used is defined by the standard X glyph bitmaps for the X font named:

    -misc-fixed-medium-r-normal--15-140-75-75-C-90-iso8859-1GLUT_BITMAP_TIMES_ROMAN_10
    A 10-point proportional spaced Times Roman font. The exact bitmaps to be used is defined by the standard X glyph bitmaps for the X font named:

    -adobe-times-medium-r-normal--10-100-75-75-p-54-iso8859-1GLUT_BITMAP_TIMES_ROMAN_24
    A 24-point proportional spaced Times Roman font. The exact bitmaps to be used is defined by the standard X glyph bitmaps for the X font named:

    -adobe-times-medium-r-normal--24-240-75-75-p-124-iso8859-1GLUT_BITMAP_HELVETICA_10
    A 10-point proportional spaced Helvetica font. The exact bitmaps to be used is defined by the standard X glyph bitmaps for the X font named:

    -adobe-helvetica-medium-r-normal--10-100-75-75-p-56-iso8859-1GLUT_BITMAP_HELVETICA_12
    A 12-point proportional spaced Helvetica font. The exact bitmaps to be used is defined by the standard X glyph bitmaps for the X font named:

    -adobe-helvetica-medium-r-normal--12-120-75-75-p-67-iso8859-1GLUT_BITMAP_HELVETICA_18
    A 18-point proportional spaced Helvetica font. The exact bitmaps to be used is defined by the standard X glyph bitmaps for the X font named:

    -adobe-helvetica-medium-r-normal--18-180-75-75-p-98-iso8859-1
    */
    }
    }
    void txt(void){
    glClear (GL_COLOR_BUFFER_BIT);
    glColor3f(0.0, 0.0, 1.0); //line colour set to blue
    output(0, 20, "hello world!");
    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("Write text example 2"); //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(txt); //call drawing func
    glutMainLoop(); //display all and wait
    return 0;
    }


    ولی باز چند محدودیت در استفاده از این تابع ها وجود داره اول که فقط چند فونت خاص رو پشتیبانی می کنه و این یک عیب خیلی بزرگه و مشکل بعدی قابلیت فارسی نویسی وجو نداره برای رفع این مشکل ها چند راه وجود داره اولیش اینه که از ویندوز کمک بگیریم یعنی نوشته رو بوسیله GDI+ تبدیل به یک عکس کنیم و در برنامه لود کنیم و راه دیگه اینه که از کتابخانه های مربوط به این کار استفاده کنیم.
    ولی دوستان عرب زبان ما یک کتابخانه طراحی کردند که من خودم تست کردم با visual C++‎‎‎2008 کار میده خیلی جالبه
    نمونش با فونت هما :

    چندتا برنامه هم مربوط به یک فردی به نام nehe که حتما ببینید جالبه
    اینا لینکاشه ضمیمه هم همین برنامه عربیست :



    فایل های ضمیمه فایل های ضمیمه
    آخرین ویرایش به وسیله amin1softco : چهارشنبه 04 فروردین 1389 در 13:22 عصر

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

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

    چگونه یک مدل را بوسیله OpenGL نمایش بدیم

    مسلما ما باید از یک نرم افزار سه بعدی برای گسترش توانایی هامون در OpenGL استفاده کنیم برای مثال ما می تونیم برای طراحی چهره یک انسان از کره و شکل های ابتدایی استفاده کنیم حالا ترکیب و اصلاح و ویرایش اینها در خود OpenGL یک کار خیلی دشوار و سختی هست برای اینکار ما باید با یکی از نرم افزار های سه بعدی مثل belender max maya کارکتر خودمون رو طراحی کنیم و بوسیله OpenGL نمایشش بدیم حالا برای اینکار کابخانه های مبدل obj به OpenGL وجود داره که یکی از بهترین هاش در لینک زیر توضیح داده شده
    شما فقط کاری که باید بکنید اینه که در مکس export->.obj را دنبال کنید و فایلتون را بوسیله کتابخانه این مثال لود کنید.
    حتما این مثال را ببینید کنید:
    http://www.3dcodingtutorial.com/Working-with-3D-models/Importing-the-model-in-C++‎‎‎.html

    اینو بگم که راه های زیادی برای انجام چنین کاری وجود داره بهتره لینک زیر رو چک کنید و توضیحات سایت رسمی OpenGL را مشاهده کنید:
    http://www.opengl.org/resources/faq/...cellaneous.htm
    اولیش پلی ترانسه هر وقت دانلود کردم نتیجشو می گم......

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

    اینم لینک دانلود دمو
    http://www.okino.com/download/demos/..._full_demo.exe

    اینم برای پلاگینش
    http://www.okino.com/download/demos/...aller_demo.exe

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

    آخرین ویرایش به وسیله amin1softco : سه شنبه 03 فروردین 1389 در 10:37 صبح دلیل: نتیجه

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

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

    تشخیص برخورد

    برای اینکار در هسته OpenGL تابعی در نظر گرفته نشده اما کتابخانه هایی وجود دارند که بوسیله اونها می تونی اینکار رو انجام بدی ولی در کل راه و روش های زیادی برای اینکار وجود داره یکی از راه ها اینه که با استفاده از فرمول فاصله نقطه از یک صفحه و بررسی تمام نقاط مرزی تشخیص بدیم که دو تا جسم به همدیگه برخورد کردند یا نه که مسلما کار عاقلانه ایی نیست چون باید برای همه نقاط این تابع تست بشه ولی خوب یک راهه
    من خودم هنوز درست متوجه قضیه نشدم ولی برای مشاهده الگوریتم هایی که برای اینکار وجود داره به لینک زیر مراجعه کنید :
    http://www.gamespp.com/algorithms/collisiondetection/
    و حالا یک مثال ساده با OpenGL و قتی یک نقطه از محیط یک کره خارج میشه رنگش تغییر می کنه:

    #include <GL/gl.h>
    #include <GL/glut.h>
    #include <math.h>

    GLfloat d;

    GLfloat p1x;
    GLfloat p1y;
    GLfloat p1z;

    const int p1radius = 1;
    const int p2radius = 0;

    GLfloat p2x;
    GLfloat p2y;
    GLfloat p2z;

    void collision (void) {
    d = sqrt(((p1x - p2x) * (p1x - p2x)) + ((p1y - p2y) * (p1y - p2y)) + ((p1z - p2z) * (p1z - p2z)));
    }

    void pointz (void) {
    glPushMatrix();
    if (d <= p2radius + p1radius)
    {
    glColor3f(1, 0, 0);
    }
    else
    {
    glColor3f(0, 0, 1);
    }
    glBegin(GL_POINTS);
    glVertex3f(p1x, p1y, p1z);
    glEnd();
    glPopMatrix();

    glPushMatrix();
    glColor3f(0, 1, 0);
    glBegin(GL_POINTS);
    glVertex3f(p2x, p2y, p2z);
    glEnd();
    glPopMatrix();
    }

    void display (void) {
    glClearColor (0.0,0.0,0.0,1.0);
    glClear (GL_COLOR_BUFFER_BIT);
    glLoadIdentity();
    gluLookAt (0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
    glPointSize(5);
    collision();
    pointz();
    glutSwapBuffers();
    }

    void reshape (int w, int h) {
    glViewport (0, 0, (GLsizei)w, (GLsizei)h);
    glMatrixMode (GL_PROJECTION);
    glLoadIdentity ();
    gluPerspective (60, (GLfloat)w / (GLfloat)h, 1.0, 100.0);
    glMatrixMode (GL_MODELVIEW);
    }


    void keyboard (unsigned char key, int x, int y) {
    if (key=='q') {
    p1z = p1z - 0.1;
    }

    if (key=='z') {
    p1z = p1z + 0.1;
    }

    if (key=='w') {
    p1y = p1y + 0.1;
    }

    if (key=='s') {
    p1y = p1y - 0.1;
    }

    if (key=='a') {
    p1x = p1x - 0.1;
    }

    if (key=='d') {
    p1x = p1x + 0.1;
    }

    if (key=='i') {
    p2y = p2y + 0.1;
    }

    if (key=='k') {
    p2y = p2y - 0.1;
    }

    if (key=='j') {
    p2x = p2x - 0.1;
    }

    if (key=='l') {
    p2x = p2x + 0.1;
    }

    if (key==27) { //27 is the ascii code for the ESC key
    exit (0); //end the program
    }
    }

    int main (int argc, char **argv) {
    glutInit (&argc, argv);
    glutInitDisplayMode (GLUT_DOUBLE); //set up the double buffering
    glutInitWindowSize (500, 500);
    glutInitWindowPosition (100, 100);
    glutCreateWindow ("A basic OpenGL Window");
    glutDisplayFunc (display);
    glutIdleFunc (display);
    glutReshapeFunc (reshape);
    glutKeyboardFunc (keyboard);//the call for the keyboard function.
    glutMainLoop ();
    return 0;
    }

    منبع

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

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

    چگونه از glut در حالت win32 استفاده کنیم

    برای استفاده از glut در این حالت دو راه وجود داره اولین راه با تابع WinMain هستش که باید چندتا جایگزینی به صورت زیر انجام بدیم و بقیه کارها مثل حالت قبله

    int APIENTRY WinMain(HINSTANCE hInstance,
    HINSTANCE hPrevInstance,
    LPSTR argv,
    int argc)
    {
    glutInit(&argc, &argv); //initialise GLUT
    .
    .//your code
    .
    return 0;
    }

    یک مثال برای این حالت
    File → New → Project... → Visual C++‎‎‎ → Win32 → Win32 Project → یک اسم دلخواه بنویسید → Ok
    Next → تیک Empty project را بزنید → Finish

    az menu Project → add new item → .cpp → yek esm delkhah → add

    حالا کد زیر را وارد کنید:

    #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 APIENTRY WinMain(HINSTANCE hInstance,
    HINSTANCE hPrevInstance,
    LPSTR argv,
    int argc)
    {
    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;
    }


    روش دوم به این صورته که در کد اصلی هیچ تغییری ایجاد نمی کنیم فقط باید به کامپایلر بگیم از کجا شروع کنه با تابع
    مثال
    File → New → Project... → Visual C++‎‎‎ → Win32 → Win32 Project → یک اسم دلخواه بنویسید → Ok
    Next → تیک Empty project را بزنید → Finish

    az menu Project → add new item → .cpp → yek esm delkhah → add

    az menu Project → Properties... → Configuration Properties → Linker → Command Line → "/ENTRY:mainCRTStartup" → ok

    برای مثال کد زیر را تست کنید:

    #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;
    }


    حالا با خیال راحت بدون هیچ تغییری می تونید پروژه هاتون رو اجرا کنید فقط بدونید در این حالت برای نمایش اخطار باید از مسیج باکس استفاده کنید و از دستورات cout و printf نمی شه استفاده کرد.

    یا اینکه یک پروژه ایجاد کنید و به جای مرحله آخری این خط رو به اول پروژه اضافه کنید.

    #pragma comment( linker, "/entry:\"mainCRTStartup\"" )
    آخرین ویرایش به وسیله amin1softco : پنج شنبه 05 فروردین 1389 در 00:02 صبح

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

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

    ورودی صفحه کلید با glut
    برای اینکه ما بتوانیم ورودی های صفحه کلید را از کاربر دریافت کنیم باید از توابع glut استفاده کنیم
    توابع مربوط به کار عبارتند از glutKeyboardFunc و glutSpecialFunc که اولی برای کلید های عمومی کاربرد داره و دومی برای کلید های خاص برای مثال یک برنامه که با فشار دادن کلید escape از برنامه خارج می شه

    void keyboard(unsigned char key, int x, int y)
    {
    if( key == 27)
    exit(0);
    }

    در تابع keyboard اولین آرگومان مربوط به کد اسکی کلید فشرده شده و دو آرگومان بعدی مربوط به مختصات ماوس در هنگام فشردن کلید از گوشه سمت چپ و بالا می باشد چون کد اسکی کلید escape برابر 27 است به محض فشرده شدن escape شرط برقرار میشه و برنامه بسته می شه.
    توجه کنید که در هنگام فشرده شدن کلید های خاص مثل F1-F12 این تابع مقدار نول را بر می گردونه.
    برای دریافت کلید های خاص باید از تابع glutSpecialFunc استفاده کنیم لیست کلید های خاص از این قراره


    An implementation should do its best to provide ways to generate all the GLUT_KEY_* special keys. The available GLUT_KEY_* values are:
    GLUT_KEY_F1
    F1 function key.
    GLUT_KEY_F2
    F2 function key.
    GLUT_KEY_F3
    F3 function key.
    GLUT_KEY_F4
    F4 function key.
    GLUT_KEY_F5
    F5 function key.
    GLUT_KEY_F6
    F6 function key.
    GLUT_KEY_F7
    F7 function key.
    GLUT_KEY_F8
    F8 function key.
    GLUT_KEY_F9
    F9 function key.
    GLUT_KEY_F10
    F10 function key.
    GLUT_KEY_F11
    F11 function key.
    GLUT_KEY_F12
    F12 function key.
    GLUT_KEY_LEFT
    Left directional key.
    GLUT_KEY_UP
    Up directional key.
    GLUT_KEY_RIGHT
    Right directional key.
    GLUT_KEY_DOWN
    Down directional key.
    GLUT_KEY_PAGE_UP
    Page up directional key.
    GLUT_KEY_PAGE_DOWN
    Page down directional key.
    GLUT_KEY_HOME
    Home directional key.
    GLUT_KEY_END
    End directional key.
    GLUT_KEY_INSERT
    Inset directional key.
    Note that the escape, backspace, and delete keys are generated as an ASCII character.



    یک مثال ساده از تعریف تابع فراخوانی:

    void special( int key, int x, int y)
    {
    switch(key){
    case GLUT_KEY_F1:
    r=1.0; g=0.0; b=0.0;
    break;
    case GLUT_KEY_F2:
    r=0.0; g=1.0; b=0.0;
    break;
    case GLUT_KEY_F3:
    r=0.0; g=1.0; b=1.0;
    break;
    }
    }
    این برنامه با کلید های F1-F2-F3 رنگ مثل عوض می شه و با escape از بنامه خارج.

    #include <GL/glut.h>
    #include <stdlib.h>
    GLint angle=0.0;
    GLfloat r=1.0,g=0.8,b=0.7;

    void idle(void){
    if(angle < 360)
    angle += 0.5;
    else
    angle = 0;
    glutPostRedisplay();
    };
    void winInit(void){
    glClearColor(1.0,1.0,1.0,0.0);
    glShadeModel(GL_SMOOTH);
    };
    void display(){
    glClear(GL_COLOR_BUFFER_BIT);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glPushMatrix();
    glRotatef(angle,0.0,0.0,1.0);
    glColor3f(r, g, b);
    glBegin(GL_POLYGON);
    glVertex2f(-0.5, -0.5);
    glVertex2f(0.5, -0.5);
    glVertex2f(0.0, 0.5);
    glEnd();
    glPopMatrix();
    glutSwapBuffers();
    }

    void keyboard(unsigned char key, int x, int y)
    {
    if( key == 27)
    exit(0);
    }

    void special( int key, int x, int y)
    {
    switch(key){
    case GLUT_KEY_F1:
    r=1.0; g=0.0; b=0.0;
    break;
    case GLUT_KEY_F2:
    r=0.0; g=1.0; b=0.0;
    break;
    case GLUT_KEY_F3:
    r=0.0; g=1.0; b=1.0;
    break;
    }
    }

    int main(int argc, char **argv){
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
    glutInitWindowPosition(100,100);
    glutInitWindowSize(400,400);
    glutCreateWindow("example general key");
    winInit();
    glutDisplayFunc(display);
    glutIdleFunc(idle);
    glutKeyboardFunc(keyboard);
    glutSpecialFunc(special);
    glutMainLoop();
    return 0;
    }



    ادامه دارد...
    آخرین ویرایش به وسیله amin1softco : جمعه 06 فروردین 1389 در 14:21 عصر

  17. #17

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

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

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

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

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

  19. #19

    نقل قول: آموزش 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+ سازگار میشه.

  20. #20
    کاربر دائمی آواتار 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 صبح

  21. #21

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

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

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

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

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

  23. #23

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

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

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

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

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

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

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

  25. #25

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

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

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

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

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

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

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

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

  28. #28
    کاربر دائمی آواتار 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))

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

  29. #29
    کاربر دائمی آواتار 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;
    }



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

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

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

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

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

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

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

  32. #32
    کاربر دائمی آواتار 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 را در هر بار فرا خوانی افزایش میده ...
    اگه بازم گنگ بگید تا سطر به سطر توضیح بدم

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

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

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

  34. #34
    کاربر دائمی آواتار 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

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

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

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

  36. #36
    کاربر دائمی آواتار 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 صبح

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

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

    مرسی ، ولی این راهها که میگید باسه یه تازه کار سخته فهمیدنش . بازم ممنون . بهتر اولیو بفهمم بعد برم سراغ دومی ...
    کارایی void circlePlotPoints (scrPt, scrPt); تو چیه ؟
    آخرین ویرایش به وسیله zuck_619 : سه شنبه 10 فروردین 1389 در 11:13 صبح

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

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

    والا من نمی دونم چطوری بگم
    دایره به مکان هندسی نقاطی از صفحه اطلاق می شود که از یک نقطه واحد در صفحه به یک فاصله باشند خوب حالا ما می خواهیم چه کار کنیم ما اصلا کاری به دایره ندارم می خواهیم یک پیکسل رو روی محیط این دایره حرکت بدیم پس باید هر مرحله مختصات این پیکسل رو بر اساس مختصات دایره تعیین کنیم
    چون فرمول یک دایره در حالت قطبی اینه
    x=r*cos(t)
    y=r*sin(t)
    ما اول باید t را طوری افزایش بدیم که حرکت پشت سر هم باشه و چون t بر حسب pi هست ما باید تبدیلش کنیم به گرادیان وقتی ما اینکار رو انجام بدیم با افزایش i می تونیم نقطه به نقطه روی دایره پیش بریم پس اولین کاری که می کنیم اینه که یک i تعریف می کنیم که بین 0 تا 360 حرکت کنه و هر بار که تابع اصلی فرا خوانی می شه افزایش پیدا کنه حالا این x و y رو به اون پیکسلی که می خواهیم بچرخه منتقل می کنیم و چون هر مرحله i افزایش پیدا می کنه این پیکسل ما دور دایره ایی با شعاع r می چرخه همین.

    من تو پست قبلی گفتم کارایه تابع void circlePlotPoints (scrPt, scrPt);
    این تابع یک پیکسل رو برای اینکه کار سریع تر بشه در 8 اکتانت ترسیم می کنه با استفاده از خاصیت تقارن 8 گانه دایره

  39. #39

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

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

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

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

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

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

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

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

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

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

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