# مباحث متفرقه برنامه نویسی > طراحی و ساخت بازی‌های کامپیوتری > آموزش: آموزش OpenGL

## amin1softco

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

----------


## amin1softco

چگونه یک پروژه 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مگ از اینجا دانلود کنید.

----------


## pswin.pooya

> 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

----------


## amin1softco

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

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

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

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


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

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

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

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

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

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


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

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

----------


## amin1softco

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

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  نموه های دیگر بسته های گرافیکی هستند.

----------


## pswin.pooya

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

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

----------


## amin1softco

دوست من ,
من در پست اول هدفم رو ذکر کردم و این مباحثی که الان قرار می دم دقیقا با کتاب دارم پیش می رم و از فردا یا پس فردا وارد قسمت کد نویسی 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

*چگونه برنامه های 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;
}

----------


## amin1softco

مقدمه ایی بر 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

فصل سوم
این فصل بیشتر در مورد الگوریتم های ترسیم در سیستم راستر مثل 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

رسم یک دایره به روش های مختلف :
می دونید که دایره در توابع هسته 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);

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

----------


## amin1softco

چگونه با 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 که حتما ببینید جالبه 
اینا لینکاشه ضمیمه هم همین برنامه عربیست :

Lesson 13 - Bitmap FontsLesson 14 - Outline FontsLesson 15 - Texture-Mapped Outline Fonts

----------


## amin1softco

چگونه یک مدل را بوسیله 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

تشخیص برخورد

برای اینکار در هسته 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;
}

منبع

----------


## amin1softco

چگونه از 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

ورودی صفحه کلید با 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;
}



ادامه دارد...

----------


## pswin.pooya

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

----------


## amin1softco

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


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

----------


## 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+ سازگار میشه.

----------


## amin1softco

> مثالهای FTGL همراه سورسش برای ویژوال استادیو و ... هستن. علاوه بر این شما می تونید از ویکی اون هم استفاده کنید:
> http://sourceforge.net/apps/mediawik...itle=Main_Page
> 
> من تست نکردم ولی ممکنه که FTGL با OpenGL 3.x و OpenGL 4.x به خاطر نداشتن پایپ لاین fixed سازگار نباشه و هیچی نشون نده توی این حالت میتونید از شیدرهای زیر برای نمایش استفاده کنید:
> 
> شیدر ورتکس:
> varying vec2 Texcoord;
> 
> void main( void )
> ...


والا من هر کاری می کنم 500 اکتسرنال ارور به کتابخونه هاش می گیره شما اگه بتونی تحت ویژوال 2008یک نمونه درست کنی بزاری اینجا مشکل ما هم حل بشه
http://www.opengl.org/resources/features/fontsurvey/

----------


## pswin.pooya

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

----------


## amin1softco

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

----------


## mg_mahyar

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

----------


## amin1softco

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


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

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

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

----------


## pswin.pooya

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

----------


## amin1softco

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

----------


## zuck_619

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

----------


## amin1softco

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

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))

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

----------


## amin1softco

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




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

----------


## moh.mon

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

----------


## zuck_619

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

----------


## amin1softco

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

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

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

----------


## zuck_619

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

----------


## amin1softco

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


   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

----------


## zuck_619

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

----------


## amin1softco

یک دایره رو در مختصات 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;
}

----------


## zuck_619

مرسی ، ولی این راهها که میگید باسه یه تازه کار سخته فهمیدنش . بازم ممنون . بهتر اولیو بفهمم بعد برم سراغ دومی ... 
کارایی   void circlePlotPoints  (scrPt, scrPt);    تو چیه ؟

----------


## amin1softco

والا من نمی دونم چطوری بگم
دایره به مکان هندسی نقاطی از صفحه اطلاق می شود که از یک نقطه واحد در صفحه به یک فاصله باشند خوب حالا ما می خواهیم چه کار کنیم ما اصلا کاری به دایره ندارم می خواهیم یک پیکسل رو روی محیط این دایره حرکت بدیم پس باید هر مرحله مختصات این پیکسل رو بر اساس مختصات دایره تعیین کنیم 
چون فرمول یک دایره در حالت قطبی اینه
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 گانه دایره

----------


## mg_mahyar

> به نظر من برای شروع رد بوک خوبه می تونید خیلی ز این کتاب ها رو از آدرس زیر در یافت کنید:
> http://opengl.persiangig.com/page.html 
> 
> اینم لیست خفن :
> http://gigle.ws/programming%20opengl...on.462504.html
> 
> اما کتاب به تنهایی فایده نداره حتما برنامه ها رو اجرا کنید


»ا ما فارسی هست

----------


## zuck_619

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

----------


## amin1softco

> چرا ناراحت میشی . سوال کردن که عیب نیست . سوال من اینه که اینجا 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);
   }

----------


## zuck_619

دشمنت شرمنده . شما بزرگ مایی ، رو چشه ما جا داری ... 
مشکل حل شد . ممنون

----------


## moh.mon

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

----------


## mandbigS

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

----------


## amin1softco

سورس اولی یا سورس دومی؟!!!!!!!

----------


## zuck_619

دوست من خودتو درگیر نکن . من براشون توضیح میدم . شما به کارایه خودت برس . کجاش مشکل دارین دوستان ؟ تک تک بپرسین !!!

----------


## mandbigS

مشکل اول من اینجاس که اصلا رو ویژوالم اجرا نمیشه ... توی سورس اول ارور میده که یه کتابخونه یادت رفته ... 
متن ارور :
fatal error C1010: unexpected end of file while looking for precompiled header. Did you forget to add '#include "stdafx.h"' to your source?

----------


## mandbigS

خب مشکل قبلیم اینطوری حل شد : ( میذارم تا دوستانم استفاده کنن )

In the Solution Explorer pane of the project, right-click the project name, and then click Properties.

In the left pane, click the C/C++‎ folder. 

Click the Precompiled Headers node. 

In the right pane, click Create/Use Precompiled Header, and then click Not Using Precompiled Headers.

----------


## mandbigS

خب دوستان حالا یه مشکل دیگه :

error C2065: 'M_PI' : undeclared identifier
از کجاست ؟ البته من با include math  امتحان کردم نشد با include cmath نوشتم که شامل math  هم میشه ... بازم ارور بالارو داد ... حتی از define _USE_MATH_DEFINES  هم استفاده کردم نشد ...

----------


## amin1softco

من برای کامپایل شدنش تو صفحات اولیه توضیح دادم که glut رو شما باید تو فولدر سیستم ویندوزتون کپی کنید تا اجرا بشه و هدر ها و سر فایل ها رو اضافه کند من دیگه سپردم به زوک اینم توضیح سورس اول

#include <math.h>       //سر فایل برای توابع سینوس و کسینون
#include <GL/glut.h>    // برای مدیریت پنجره ورودی ها و خروجی ها که سر فایل های هسته اپن جی ال نیز در آن تعریف شده است
float i=0;              // متغیری کلی برای ایجاد حالت انیمیشن
class scrPt {           //یک کلاس ساده که متخصات را نگهداری می کند
   public:             // متغیر ها از نوع پابلیک هستند و همه اجازه دستررسی به آنها را دارند
      GLint x, y;      // اکس و وای از نوع متغیر ها اصلی اپن جی ال تعریف شده اند
};

void setPixel (GLint x, GLint y)  // برای تعیین و رس یک پیکسل از این تابع استفاده می کنیم
{glPointSize (1);                 // اندازه پیکسل را برابر 1 قرار می دهیم
   glBegin (GL_POINTS);           //هر ورتکس یک پیکسل را روشن می کند 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);     // رسم نقطه اولیه در تمام 8 اکتانت دایره

   /* Calculate next points and plot in each octant. این قسمت برای محاسبه نقاط بعدی دایره در کل 8 اکتانت می باشد*/ 
   while (circPt.x < circPt.y) { 
      circPt.x++; // ایکس در هر مرحله باید افزایش پیدا کند 
      if (p < 0) // طبق الگوریتم برای پی های مثبت و منفی دو فرمول داریم که با این شرط پیاده سازی می شوند
         p += 2 * circPt.x + 1;  // تعیین علامت پی وقتی پی قبلی منفی است
      else {
         circPt.y--; //دو حالت دارد در بعضی مراحل بسته به علامت پی اگر مثبت باشد باید کاهش پیدا کند وگرنه تغییری نمی کند y 
         p += 2 * (circPt.x - circPt.y) + 1; // تعیین علامت پی وقتی پی قبلی مثبت  است
      }
      circlePlotPoints (circCtr, circPt); // بعد از تعیین ایکس و وای پیکسل در 8 اکتانت دیگر ترسیم می شود
   }
}

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;   // افزایش i برای حرکت دایره کوچک
xy.x=100; // تعیین مختصات ایکس دایره اصلی
xy.y=75;  // تعیین مختصات وای دایره اصلی 
circleMidpoint (xy, 35); // رسم دایره اصلی در نقطه مختصات با شعاع 35
circle((35*cos((M_PI/180)*(i)))+100,(35*sin((M_PI/180)*(i)))+75);//این تابع کار اصلی به حرکت در آوردن دایره کوچک را انجم می دهد و در هر مر حله مختصات دایره کوچک را روی محیط دایره ایی با شعاع 35 در مختصات 100 و 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;
}

----------


## zuck_619

کلاغ عزیز . این همون عدد پی که باید اول برنامه تعریفش کنی . بعد  include ها
#define M_PI 3.141592653589

----------


## zuck_619

آقا خیلی ممنمون . خدایی حال میدی .

----------


## mandbigS

حاجی خیلی ممنون ولی من مشکلم حل نشد ... به M-Pi گیر میده ... ولی بازم دمت گرم

----------


## mandbigS

یه خورده تو فرومای C++‎ گشتم حل شد ... وافعا ممنون ...  :تشویق:

----------


## amin1softco

اینم توضیح تابع دوم

#include <GL/glut.h> // برای مدیریت پنجره ورودی ها و خروجی ها که سر فایل های هسته اپن جی ال نیز در آن تعریف شده است
float i=0;              // متغیری کلی برای ایجاد حالت انیمیشن
void Display()          // تابع اصلی نمایش
 {
 glClear(GL_COLOR_BUFFER_BIT);  //clears display window پاک کردن پنجره نمایش در هر بار فراخوانی تابع اصلی نمایش
    glColor3f(1.0, 0.0, 1.0);   // تعیین رنگ پیکسل

GLUquadricObj *circle = gluNewQuadric (); // ایجاد یک پوینتر برای شی از معادله درجه 2
gluQuadricDrawStyle (circle, GLU_SILHOUETTE); //تعیین استیل تابع درجه دو از نوع خطی باعث رسم تابع در جه 2 به صورت مجموعه ایی از خطهای اطراف آن می شود 
gluDisk (circle,0,0.8,50,1);                 // این تابع برای رسم دایره با استیل تعریف شده 50 تکه ایی به شعاع 0.8 می شود
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);                              // چرخش دادن پیکسل به اندازه 0.1 آی
   glPointSize(10.0);                                  // تعیین اندازه پیکسل
   glColor3f(0.0, 1.0, 1.0);                             
  glBegin(GL_POINTS);                              //هر ورتکس یک پیکسل را روشن می کند 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;
}

----------


## zuck_619

دستت درد نکنه . کلاغ مشکلت چی بود ؟

----------


## moh.mon

سلام دوستان.
اول  از امین آقا به خاطر فروم پر باری که را انداخته تشکر می کنم.
و همچنین از دوستان دیگه که این همه علاقه از خودشون نشون میدن.
میخواستم چند تا تمرین گرافیک برامون قرار بدین تا بیشتر با برنامه نویسی opengl آشنا شیم.
در ضمن از ذوک و کلاغ هم تشکر میکنم.

----------


## amin1softco

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

----------


## mandbigS

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

----------


## mandbigS

من اولیو نوشتم ... البته مطمئنا آماتور هستش ...  :لبخند گشاده!: 


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

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

  glPushMatrix();                                
    glEnable (GL_POINT_SMOOTH);                
     glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 
     i+=0.1;                                             
     glRotatef(i,0,0,0.1);                             
     glPointSize(8.0);                                
     glColor3f(0.0, 0.0, 1.0);                             
     glBegin(GL_POINTS);                             
      glVertex2f(0.25, 0.75);                         
     glEnd();                                        
  glPopMatrix();                                     
  
  glPushMatrix();                               
    glEnable (GL_POINT_SMOOTH);                
     glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 
     j-=1;                                            
     glRotatef(j,0,0,0.1);                             
     glPointSize(10.0);                                 
     glColor3f(1.0, 0.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("mS Circle");
  glClearColor(1.0,1.0,1.0,0.0);
  glutDisplayFunc(Display);
  glutIdleFunc(Display);
  glutMainLoop();
  return 0;
}

----------


## moh.mon

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


اولی که کلاغ عزیز لطف کردن نوشتن. (البته زیاد هم سخت نبود  :چشمک: )
ولی اگه میشه یکم دومی رو بیشتر توضیح بدین.
چه طوری باید از کاربر داده بگیریم؟

----------


## mandbigS

آره دیگه من تقلب کردم سریع نوشتم ... دادا جون فکر می کنم باید مثل C#‎ از KeyEventArgs  استفاده کنیم ولی نمی دونم تو C++‎ چطوریه ...

----------


## amin1softco

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

----------


## mandbigS

داداشی یه سوال ... میشه بگی چطوری کدهاو با اون شکل تو پست های خودت میاری ؟ یاد مام بدی ممنون می شیم ... :گریه:

----------


## amin1softco

> داداشی یه سوال ... میشه بگی چطوری کدهاو با اون شکل تو پست های خودت میاری ؟ یاد مام بدی ممنون می شیم ...


برای کار با کیبرد این پست را ببینید
https://barnamenevis.org/showpo...7&postcount=16
برای نوشتن کد به این صورت کدتون رو بیت تگ ها 

[S0URCE="cpp"][/S0URCE]

قرار بدید

----------


## mandbigS

من خیلی تلاش کردم ولی جواب نداد ... داداشی میشه بگی چطوری باید ارتباط بین تابع keyboard و display رو برقرار کنیم ؟

----------


## amin1softco

> من خیلی تلاش کردم ولی جواب نداد ... داداشی میشه بگی چطوری باید ارتباط بین تابع keyboard و display رو برقرار کنیم ؟


ببین این یک برنامه است که دایره بوسیله کلید های up  و down روی محیط دایره حرکت می کنه......

#include <GL/glut.h>  
float i=0;
void special( int key, int x, int y)
{
switch(key){
case GLUT_KEY_UP:
i+=1;
break;
case GLUT_KEY_DOWN:
i-=1;
break;
}
}
void Display()          
 {
 glClear(GL_COLOR_BUFFER_BIT);  
    glColor3f(0.0, 0.0, 0.0);   

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

glPushMatrix();                                
  glEnable (GL_POINT_SMOOTH);                
   glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);                                   
   glRotatef(i,0,0,0.1);                             
   glPointSize(10.0);                               
   glColor3f(0.0, 0.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 key");
  glClearColor(1.0,1.0,1.0,0.0);
  glutDisplayFunc(Display);
  glutIdleFunc(Display);
  glutSpecialFunc(special);
  glutMainLoop();
  return 0;
}

----------


## mandbigS

#include <GL/glut.h> // برای مدیریت پنجره ورودی ها و خروجی ها که سر فایل های هسته اپن جی ال نیز در آن تعریف شده است
float i=0;
float j=0; // متغیری کلی برای ایجاد حالت انیمیشن

void special( int key, int x, int y)
{
switch(key){
case GLUT_KEY_UP:
i+=10;
j-=10;
break;
case GLUT_KEY_DOWN:
i+=0.1;
j-=0.1;
break;
}
}

void Display() // تابع اصلی نمایش
{
  glClear(GL_COLOR_BUFFER_BIT); //clears display window پاک کردن پنجره نمایش در هر بار فراخوانی تابع اصلی نمایش
  glColor3f(0.0, 0.0, 0.0); // تعیین رنگ پیکسل

  GLUquadricObj *circle = gluNewQuadric (); // ایجاد یک پوینتر برای شی از معادله درجه 2
  gluQuadricDrawStyle (circle, GLU_SILHOUETTE); //تعیین استیل تابع درجه دو از نوع خطی باعث رسم تابع در جه 2 به صورت مجموعه ایی از خطهای اطراف آن می شود 
  gluDisk (circle,0,0.8,5000,1); // این تابع برای رسم دایره با استیل تعریف شده 5000 تکه ایی به شعاع 0.8 می شود
  gluDeleteQuadric(circle); // حذف اشاره گر استیل

  glPushMatrix(); // برای اینکه روی یک قسمت خاص تغییری ایجاد کنیم از این تابع استفاده می کنیم
    glEnable (GL_POINT_SMOOTH);                
     glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // این دو خط برای نرم کردن گوشه های پیکسل هستند
     i+=0.5; // افزایش آی برای ایجاد حالت چرخش
     glRotatef(i,0,0,0.1); // چرخش دادن پیکسل به اندازه 0.1 آی
     glPointSize(8.0); // تعیین اندازه پیکسل
     glColor3f(0.0, 0.0, 1.0);                             
     glBegin(GL_POINTS); //هر ورتکس یک پیکسل را روشن می کند GL_POINTS با
      glVertex2f(0.25, 0.75); //تعیین مختصات نقطه به صورت ثابت
     glEnd(); // پایان ترسیم نقطه
  glPopMatrix(); // پایان قسمتی که تغییرات باید روی آن اعمال شود
  
  glPushMatrix(); // برای اینکه روی یک قسمت خاص تغییری ایجاد کنیم از این تابع استفاده می کنیم
    glEnable (GL_POINT_SMOOTH);                
     glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // این دو خط برای نرم کردن گوشه های پیکسل هستند
     j-=0.5; // کاهش جی برای ایجاد حالت چرخش
     glRotatef(j,0,0,0.1); // چرخش دادن پیکسل به اندازه 0.1 جی
     glPointSize(10.0); // تعیین اندازه پیکسل
     glColor3f(1.0, 0.0, 1.0);                             
     glBegin(GL_POINTS); //هر ورتکس یک پیکسل را روشن می کند 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("mS Circle");
  glClearColor(1.0,1.0,1.0,0.0);
  glutDisplayFunc(Display);
  glutIdleFunc(Display);
  glutSpecialFunc(special);
  glutMainLoop();
  return 0;
}


داداشی اینو نوشتم وقتی keyup میزنی زیاد میشه ولی وقتی keydown میزنی کم نمیشه ... به نظرتون مشکل از کجاست ؟

----------


## amin1softco

این راهش نیست عزیز
باید یک متغیر سوم تعریف کنی....
در ضمن در کدی که شما نوشتی همیشه به مقدار i اضافه میشه در هر دو حالت....

----------


## mandbigS

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


void special( int key, int x, int y)
{
switch(key)
{
case GLUT_KEY_UP:
i+=10;
j-=10;
break;
case GLUT_KEY_DOWN:
i-=1;
j+=1;
break;
}
}


در واقع به جای i+=0.1 بنوسیم i-=1 تا یه مقداری از i کم شه ... همین ... برای j هم همینطور ...

----------


## amin1softco

برای من که درست کار نمی کنه !!!!!!!!!!!!!!!!!!!!!؟

----------


## mandbigS

برا من کار کرد ... فایل اجرایی رو می ذارم ...

----------


## amin1softco

> برا من کار کرد ... فایل اجرایی رو می ذارم ...


خیلی باحالی پسر ... :تشویق: 
منظورم این بود که جواب سوال این نیست یعنی یک دایره ثابت وجود داره شما وقتی کلید up رو فشار می دی شروع به حرکت کنه و هرچقدر بیشتر کلید رو بگیری بیشتر سرعت می گیرهحالا باید کلید down رو وقتی فشار می دیم سرعتش رو کم کنه تا جایی که بایسته و دوباره بر عکس حرکت کنه؟

----------


## mandbigS

خب داداشی برای ان کار میشه به جای i+=1 از i+=i استفاده کرد که بتونیم به گلوله شتاب بدیم اما اینم نمیشه کنترل کرد ... خیلی سریع پیشرفت می کنه و بعد از چند ثانیه دیگه نمیشه دیدش ... پس من با i+=i/100 به گلوله هل شتاب دادم ... ببین داداشی منظورت اینه ... فایل اجرایی رو گذاشتم ...

----------


## amin1softco

ببین این راهش نیست تو پست قبلی گفتم یک متغیر دیگه کم داره....

----------


## mandbigS

ای خدا ... داداشی چیستان شدا ... میشه خودت رو کنی ببینیم چیه ... مرسی  :گریه:

----------


## amin1softco

ببین اینقدر سخت نیست که فکر می کنی

#include <GL/glut.h> // برای مدیریت پنجره ورودی ها و خروجی ها که سر فایل های هسته اپن جی ال نیز در آن تعریف شده است
GLfloat m=0.01,i=0.0;   // متغیری کلی برای ایجاد حالت انیمیشن
void special( int key, int x, int y)
{
switch(key)
{
case GLUT_KEY_UP:
m+=0.01;
break;
case GLUT_KEY_DOWN:
m-=0.01;
break;
}
}

void Display() // تابع اصلی نمایش
{
  glClear(GL_COLOR_BUFFER_BIT); //clears display window پاک کردن پنجره نمایش در هر بار فراخوانی تابع اصلی نمایش
  glColor3f(0.0, 0.0, 0.0); // تعیین رنگ پیکسل

  GLUquadricObj *circle = gluNewQuadric (); // ایجاد یک پوینتر برای شی از معادله درجه 2
  gluQuadricDrawStyle (circle, GLU_SILHOUETTE); //تعیین استیل تابع درجه دو از نوع خطی باعث رسم تابع در جه 2 به صورت مجموعه ایی از خطهای اطراف آن می شود 
  gluDisk (circle,0,0.8,5000,1); // این تابع برای رسم دایره با استیل تعریف شده 5000 تکه ایی به شعاع 0.8 می شود
  gluDeleteQuadric(circle); // حذف اشاره گر استیل

  glPushMatrix(); // برای اینکه روی یک قسمت خاص تغییری ایجاد کنیم از این تابع استفاده می کنیم
    glEnable (GL_POINT_SMOOTH);                
    glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // این دو خط برای نرم کردن گوشه های پیکسل هستند
    i+=m; // افزایش آی برای ایجاد حالت چرخش
    glRotatef(i,0,0,0.1); // چرخش دادن پیکسل به اندازه 0.1 آی
    glPointSize(8.0); // تعیین اندازه پیکسل
    glColor3f(0.0, 0.0, 1.0);                             
    glBegin(GL_POINTS); //هر ورتکس یک پیکسل را روشن می کند GL_POINTS با
     glVertex2f(0.25, 0.75); //تعیین مختصات نقطه به صورت ثابت
    glEnd(); // پایان ترسیم نقطه
  glPopMatrix(); // پایان قسمتی که تغییرات باید روی آن اعمال شود
  
  glPushMatrix(); // برای اینکه روی یک قسمت خاص تغییری ایجاد کنیم از این تابع استفاده می کنیم
    glEnable (GL_POINT_SMOOTH);                
    glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // این دو خط برای نرم کردن گوشه های پیکسل هستند

    glRotatef(-i,0,0,0.1); // چرخش دادن پیکسل به اندازه 0.1 جی
    glPointSize(10.0); // تعیین اندازه پیکسل
    glColor3f(1.0, 0.0, 1.0);                             
    glBegin(GL_POINTS); //هر ورتکس یک پیکسل را روشن می کند 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("mS Circle");
  glClearColor(1.0,1.0,1.0,0.0);
  glutDisplayFunc(Display);
  glutIdleFunc(Display);
  glutSpecialFunc(special);
  glutMainLoop();
  return 0;
}

----------


## mandbigS

آهان ... ایول ... کلیت کارو توضیح میدین ؟ منظور این متغیرا چطوری کار میکنن ؟ چطوری پر میشن ؟ چطوری به هم مربوط هستن ؟
در ضمن داداشی سومیم راهنمایی کن تا شب بنویسیم بره پی کارش ... راهنمایی تپلا ... من خیلی اونو علاقه دارم بنویسم ...  :متفکر:  :متفکر:  :متفکر:

----------


## amin1softco

خوب اینکه خیلی واضحه ما یک i  داریم که مقدارش برحسب m تغییر می کنه وقتی که ما با کلید ها مقدار  m را کم و زیاد کنیم چون مقدار i بوسیله m تعیین می شه پس در نتیجه سرعت چرخش کم و زیاد می شه ....

----------


## mandbigS

> در ضمن داداشی سومیم راهنمایی کن تا شب بنویسیم بره پی کارش ... راهنمایی تپلا ... من خیلی اونو علاقه دارم بنویسم ...


داداشی اینم یه راهنمایی بکن کارشو بسازیم ...

----------


## amin1softco

اینم مثل بقیه است فقط دوتا دایره و یک نقطه بیشتر باید روی کاربرد این دقت کنی glPushMatrix();

----------


## mandbigS

عزیز جان من از ظهر هزار تا چیز بلکه امتحان کردم و نشد ... سیزدهمونم با برنامه در شد  :لبخند گشاده!:  ... دادا رو کن ببینیم چجوریه ... نمی دونم چرا با C++‎ و OpenGL اصلا راحت نیستم ... C#‎ خیلی بهتره به نظرم ...

----------


## amin1softco

ببین شما با سی شارپ بنویس قبولت داریم............... :چشمک:  با وی بی هم نوشتی مسئله ایی نیست

----------


## mandbigS

خب با C#‎‎‎ هم بنویسم باز OpenGl داره دیگه ... ولی ای کاش یه سری پروژه آماده ساده بود تا آدم از روش یاد می گرفت ... چشم بسته که نمی شه نوشت داداشی ... اگه آدرسی چیزی تو نت داری که از اینا داره رو کن ... این آخرین تمرینم بزار که ما تو کفیم ... :کف کرده!:

----------


## amin1softco

راستش اینو خودم تا الان ننوشتم اما برای تمرین یک کتاب به نام رد بوک Red book  تمرینای خیلی خیلی ساده داره یک نگاه به تمریناش بنداز

----------


## pswin.pooya

اینم کد همون دو تا دایره با تنظیم سرعت :

#include <GL/glut.h>  


float g_fSpeed;
float g_fCur_Angle;

void special( int key, int x, int y)
{
    switch(key)
    {
    case GLUT_KEY_UP:
        g_fSpeed+=0.1f;
        break;
    case GLUT_KEY_DOWN:
        g_fSpeed-=0.1f;
        break;
    }
}

// 
void GL_Display(void)
 {
     g_fCur_Angle += g_fSpeed;
    // pak kardane safhe
    glClear(GL_COLOR_BUFFER_BIT);  
    glColor3f(0.0, 0.0, 0.0);   

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

    // daire aval
    glPushMatrix(); 
        glPointSize(5.0); 
        glRotatef(g_fCur_Angle,0,0,0.1);                             
        glColor3f(0.0, 0.0, 1.0);                             
        glBegin(GL_POINTS);                              
            glVertex2f(0.25, 0.75);                        
        glEnd();                                       
    glPopMatrix(); 

    // daire dovom

    glPushMatrix(); 
        glPointSize(10.0); 
        glRotatef(-g_fCur_Angle,0,0,0.1);                             
        glColor3f(1.0, 0.0, 1.0);                             
        glBegin(GL_POINTS);                              
            glVertex2f(0.25, 0.75);                        
        glEnd();                                       
    glPopMatrix(); 

    glutSwapBuffers();                                
 }

// initialize function
void GL_Init(void)
{
    // pak kardane safhe ba range sefid
    glClearColor(1.0,1.0,1.0,1.0);
    // tanzim sorat harkat be 1
    g_fSpeed = 1.0f;
    g_fCur_Angle = 0.0f;
    // narma kardane (daire kardan) nogat
    glEnable(GL_POINT_SMOOTH);

}

int main(int argc, char **argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);
    glutInitWindowPosition(500,500);
    glutInitWindowSize(400,400);
    glutCreateWindow("Circle");
    GL_Init(); // initializing OpenGL
    glutDisplayFunc(GL_Display);
    glutIdleFunc(GL_Display);
    glutSpecialFunc(special);
    glutMainLoop();
  return 0;
}



فکر کنم دنبال این بودین بازم اگر چیزی رو جا انداخته باشم بگین.

----------


## amin1softco

نمی دونم پویا جون تو چرا به ما که می رسی دقت نمی کنی اینو که جواب دادیم سوال سوم الان مسئله است ؟https://barnamenevis.org/showpo...7&postcount=77

الان مسئله اینه
3- برنامه ایی بنویسید که در آن یک دایره رو محیط دایره دیگر گردش کرده و این مجموعه نیز دور یک دایره بزرگ تر حرکت کنند.

----------


## mandbigS

> اینم کد همون دو تا دایره با تنظیم سرعت :
> 
> فکر کنم دنبال این بودین بازم اگر چیزی رو جا انداخته باشم بگین.


دمت جیز بابا ... دمت جیز ... اما مسئله اونیه که دوستمون گفتن ...  :گیج:

----------


## amin1softco

اینم جواب مسئله ی سوم 

 
#include <windows.h>
#include <GL/glut.h>
GLfloat i=0;
void Display()
 {
     glClear(GL_COLOR_BUFFER_BIT);

glPushMatrix();
    glColor3f(1.0, 0.5, 0.0);
    GLUquadricObj *circle = gluNewQuadric ();
    gluQuadricDrawStyle (circle, GLU_SILHOUETTE );
    gluDisk (circle,0,0.77,500,1);


     glRotatef(i,0,0,-i);
     glTranslatef(0.55,0.55,0);

    glPushMatrix();
     glColor3f(1.0, 0.0, 1.0);
     gluQuadricDrawStyle (circle, GLU_LINE );
     gluDisk (circle,0,0.15,10,1);
     gluDeleteQuadric(circle);
    glPopMatrix();

    glPushMatrix();
      glEnable (GL_POINT_SMOOTH);
       glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
       i-=0.04;
       glRotatef(i*2,0,0,0.1);
       glPointSize(5.0);
       glColor3f(0.0, 1.0, 1.0);
      glBegin(GL_POINTS);
       glVertex2f(0.11, 0.11);
      glEnd();
    glPopMatrix();
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;
}

----------


## pswin.pooya

سلام
شرمنده از اونجا که وقت ندارم. نمی تونم تاپیک ها طولانی رو بخونم و سعی میکنم تنها به مشکل رسیدگی کنم؟!!!! :چشمک: 

اما در مورد این مسال: همه اینها مثالهای ساده push/pop هستند. بهتون پیشنهاد میکنم که کلا بیخیال push و pop بشین و برین بجاش مستقیما روی ماتریسهای اینها کار کنین. عملا وقتی که بخواین یه پروژه بزرک رو شروع کنید و یا وقتی که بخوایید از OpenGL 3.0 به بعد استفاده کنید دیگه نمی تونید از این دستورها کمک بگیرین. حتی توی OpenGL 2.x هم زمانی که بخوایین از شیدرها استفاده بکنید این مساله تا حدودی مخصوصا برای شیدرها پیچیده صحت پیدا میکنه:

توی GLSL ویرایش ها 110 (1.10) و 120 ( نیازمند OpenGL 2.1 ، ویرایش 1.2) چند متغییر وجود دارن که می تونین به کمک اونها ماتریس ها مدل نما و ... رو بدست بیارین (مثلا متغییرهای توکار gl_ModelViewMatrix و gl_NormalMatrix) اما داخل ویرایش های بالاتر GLSL یعنی هسته 130 به بالا این متغییرها حذف شدن.

به طور کلی استفاده از push/pop ماتریسها از رده خارج شده و استفاده از اونها برای برنامه نویسی گرافیکی حرفه ای به طور کل (کاملا) مشکل ساز هستش.

----------


## amin1softco

برنامه ایی بنویسید که شکل ضمیمه را پیاده سازی کند؟

----------


## mandbigS

سلام ... من اینو نوشتم ولی نمی دونم چطوری باید دایره رو نصف کنم ...


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

void Display(void)
{
glClear(GL_COLOR_BUFFER_BIT) ;
glColor3f(1.0, 0.0, 0.0);

GLUquadricObj *circle = gluNewQuadric (); 
gluQuadricDrawStyle (circle, GLU_SILHOUETTE); 
gluDisk (circle,0,0.4,5000,1);                
gluDeleteQuadric(circle);        

glBegin(GL_LINES);
glVertex2f(0.90, 0.0);
glVertex2f(0.40, 0.0);
glVertex2f(-0.40, 0.0);
glVertex2f(-0.90, 0.0);
glEnd();
glutSwapBuffers() ;
}

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


راهنمایی کنید اینم حله ... فایلشم گذاشتم ...

----------


## amin1softco

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


GLUquadricObj *circle = gluNewQuadric (); 
gluQuadricDrawStyle (circle, GLU_SILHOUETTE); 
gluDisk (circle,0,0.4,5000,1);                
gluDeleteQuadric(circle);        


البته میشه روشو با یک مربع سفید پوشش داد تا نصفش معلوم باشه ولی یک راه دیگه البته چند راه داره

----------


## mandbigS

همینو اگه بخوایم با یک مربع سفید بپوشونیم چه باید بکنبم ؟

----------


## amin1softco

از تابع زیر می شه استفاده کرد 

glRectf  ( x1 , y1 , x2 , y2 ) ;

----------


## mandbigS

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

void Display(void)
{
glClear(GL_COLOR_BUFFER_BIT) ;
glColor3f(1.0, 0.0, 0.0);

GLUquadricObj *circle = gluNewQuadric (); 
gluQuadricDrawStyle (circle, GLU_SILHOUETTE); 
gluDisk (circle,0,0.4,5000,1);                
gluDeleteQuadric(circle);

glBegin(GL_LINES);
glVertex2f(0.90, 0.0);
glVertex2f(0.40, 0.0);
glVertex2f(-0.40, 0.0);
glVertex2f(-0.90, 0.0);
glEnd();

glColor3f(1.0, 1.0, 1.0);
glRectf  ( -0.4 , -0.5 , 0.4 , 0 ) ;

glutSwapBuffers() ;
}

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

----------


## amin1softco

آخرش کار خودت رو کردی ها من منظورم این بود


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

GLfloat pi=3.1415;
void Display()
 {
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0, 0.5, 0.0);

glBegin(GL_LINE_STRIP);
    glVertex2f( 0.9,0.0);
    for(GLfloat i=0.0;i<=180;i+=1.0)
       glVertex2f(0.5*cos((pi/180)*i),0.5*sin((pi/180)*i));
    glVertex2f(-0.9,0.0);
glEnd();
  glutSwapBuffers();
 }

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


سوال بعدی ساخت یک صفحه ی شطرنج ساده ؟

----------


## mandbigS

> آخرش کار خودت رو کردی ها من منظورم این بود ...


البته راههای مختلفی وجود داره ...  :بامزه:

----------


## mandbigS

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


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

void Display(void)
{
float i , j ;
int c=1 ;

for(i=0;i=10;i++)
{
for(j=0;j=10;j++)
{
  c+=1;
  if(c%2==1)
  {
	glClear(GL_COLOR_BUFFER_BIT) ;
    glColor3f(0.0, 0.0, 0.0);
  }
  else
  {
    glClear(GL_COLOR_BUFFER_BIT) ;
    glColor3f(1.0, 1.0, 1.0);
  }

glRectf  ( -i/10 , -j/10 , i/10 , j/10 ) ;
}
}

glutSwapBuffers() ;
}

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

----------


## amin1softco

اینم کامل اصلاح شد


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

void Display(void)
{
    glClear(GL_COLOR_BUFFER_BIT) ;
int c=1,i , j ;
glTranslatef(-0.8,-0.8,0);
for(j=0;j<8;j++){
for(i=0;i<8;i++)
{
  c+=1;
  if(c%2==1)
  {
    glColor3f(0.0, 0.0, 1.0);
  }
  else
  {
    glColor3f(1.0, 1.0, 0.0);
  }

glRectf  ((i*0.21 ), (j*0.21 ) , (i*0.21)+0.2 , (j*0.21 )+0.2 ) ;
}c+=1;}
glutSwapBuffers() ;
}

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



برنامه بعدی مهره اسب را طراحی کنید؟

----------


## mandbigS

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

void Display(void)
{
glClear(GL_COLOR_BUFFER_BIT) ;
int c=1,i,j ;
glTranslatef(-0.8,-0.8,0);
for(j=0;j<8;j++){
for(i=0;i<8;i++)
{
  c+=1;
  if(c%2==1)
  {
    glColor3f(0.0, 0.0, 0.0);
  }
  else
  {
    glColor3f(1.0, 1.0, 1.0);
  }

glRectf  (i*0.2,j*0.2,i*0.2+0.2,j*0.2+0.2) ;
}
c+=1;
}
glutSwapBuffers() ;
}

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



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

----------


## amin1softco

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

----------


## zuck_619

نمیکشه چرا ؟؟؟
#include <iostream>
#include <fstream>
#include <windows.h>
#include <GL/glut.h>
using namespace std ;

void display (void)
{
    glClear(GL_COLOR_BUFFER_BIT) ;
    glColor3f(1.0, 1.0, 0.0);
    GLint xj, yj, j;
    fstream inStream ;
    inStream.open("horse.txt", ios ::in);
    if(!inStream) {
            cout << "File would not open\n";
            return;
        }
    glBegin(GL_LINE_LOOP); 
    for (j=1 ; j<=16 ; j ++)
    {
        inStream >> xj >> yj ;
        cout << xj << " " << yj<<"\n" ;
        glVertex2i(xj,yj) ;
    }
    glEnd();
    glFlush();
    glutSwapBuffers() ;
}
int main(int argc, char **argv)
{
  glutInit(&argc, argv);
  glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
  glutInitWindowPosition(500,100);
  glutInitWindowSize(500,500);
  glutCreateWindow("horse");
  glClearColor(1.0,1.0,1.0,0.0);
  glLineWidth(5.0);
  glutDisplayFunc(display);
  glutMainLoop();
  return 0;
}
اینم نقطه هاش

----------


## amin1softco

یادت رفته ماتریس پروجکشن رو ست کنی به صورت نرمال بر حسب 1 هست

glMatrixMode(GL_PROJECTION); //projection parameters
gluOrtho2D(0.0,75.0,0.0,75.0); //sets up WC extent

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

----------


## mandbigS

یه سوال بعد دادن به اینه و یکی این که چطوری میشه توشو رنگ کرد ؟

----------


## amin1softco

برای اینکه داخلش رنگ بشه باید از

glBegin(GL_QUADS)
ya
glBegin(GL_POLYGON)

استفاده کنید برای بعد دادن خودتون روش فکر کنید و اون خط و نیم دایره رو هم در نظر بگیرید

----------


## pswin.pooya

میتونید به جای GL_LINES یا GL_LINE_LOOP از GL_POLYGON استفاده بکنید. 

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


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

GL_POINT: به جای هر ورتکس یه نقطه میزاره (مثل GL_POINTS در دستور glBegin عمل میکنه.)GL_LINE: ورتکس ها رو با خط بهم متصل می کنه (مثل GL_LINE_LOOP توی glBegin). اصطلاحا توی این حالت میگن شکل سیمی (wired) رسم شده.GL_FILL: فضای داخل چند ضلعی رو پر میکنه.

----------


## amin1softco

آقا الان اسب رو داریم صفحه شطرنج رو هم دارم حالا چطوری می تونیم الگوریتم معروف اسب شطرنج رو پیاده کنیم که 64 خونه رو طی کنه بدون خانه های تکراری؟!!؟

----------


## mandbigS

میگم اول یه کار دیگه بکنیم ... اسب رو سه بعدی بکشیم ... بعدش ... به نظرم بیشتر رو موارد گرافیکی تاکید کنیم تا الگوریتمی ... البته این نظر منه ... ولی اگه موافق نبودین ادامه می دیم ...

----------


## amin1softco

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

----------


## zuck_619

به نظر من یک طرح جدید باشه خیلی بهتره ... آدمو بیشتر جذب میکنه ، خلاقانه ترم هست

----------


## amin1softco

دوستان من این اسب شطرنج رو نوشتم ...
  
#include <windows.h>
#include <stdlib.h>
#include <ctime>
#include <GL/glut.h>
GLint i=0;
int nrandom(int max)
{     srand(time(NULL));
    return rand() % max;
}
 
#define NMOVES 8
#define BSIZE 8
    
int moves[8][2] = { {2, 1}, {2, -1}, {1, 2}, {1, -2}, {-1, 2}, {-1,-2}, {-2, 1}, {-2, -1} };
int board[BSIZE][BSIZE];
int mpositionx = nrandom(BSIZE);
int mpositiony = nrandom(BSIZE);
int mmove_number = 2;
int mmove[2];

///////////////////////

 

 
int in_range_and_empty(int posx, int posy)
{
    return (posx < BSIZE && posx >= 0 &&
            posy < BSIZE && posy >= 0 &&
            board[posx][posy] == 0);
}
 
int get_accessibility(int x, int y)
{
    int accessibility = 0;
    int i;
 
    for (i = 0; i < NMOVES; i++)
    {
        if (in_range_and_empty(x + moves[i][0], y + moves[i][1]))
            accessibility += 1;
    }
 
    return accessibility;
}
 
void get_next_moves(int* move)
{
    int positionx = move[0];
    int positiony = move[1];
    int accessibility = NMOVES;
    int i;
 
    for (i = 0; i < NMOVES; i++)
    {
        int newx = positionx + moves[i][0];
        int newy = positiony + moves[i][1];
        int newacc = get_accessibility(newx, newy);
        if (in_range_and_empty(newx, newy) && newacc < accessibility)
        {
            move[0] = newx;
            move[1] = newy;
            accessibility = newacc;
        }
    }
}
 
//////////////////////End of knight func

void Board(GLfloat x,GLfloat y){
    int c=1,i , j ;
for(j=0;j<8;j++){
for(i=0;i<8;i++)
{
  c+=1;
  if(c%2==1)
  {
    glColor3f(255*(1.00/255), 162*(1.00/255), 0*(1.00/255));
  }
  else
  {
    glColor3f(1.0, 1.0, 1.0);
  }

glRectf  (x+(i*21 ), y+(j*21 ) , x+(i*21)+20 , y+(j*21 )+20 ) ;
}c+=1;}
}

////////////////////End of Board

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_TIMES_ROMAN_24 , string[i]);
  }
}
////////////////////End of output

void horse(GLfloat x,GLfloat y){
    //glPushMatrix();
    glBegin(GL_LINE_LOOP);
    
glVertex2f(x+10, y+1 );
glVertex2f(x+20, y+15);
glVertex2f(x+10, y+15);
glVertex2f(x+15, y+50);
glVertex2f(x+30, y+70);
glVertex2f(x+33, y+70);
glVertex2f(x+33, y+67);
glVertex2f(x+40, y+60);
glVertex2f(x+50, y+50);
glVertex2f(x+40, y+40);
glVertex2f(x+37, y+40);
glVertex2f(x+35, y+45);
glVertex2f(x+30, y+50);
glVertex2f(x+50, y+10);
glVertex2f(x+40, y+10);
glVertex2f(x+50, y+1);
    glEnd();
    //glPopMatrix();
}

/////////////////////////End of horse

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)
{
    glPushMatrix();
glClear(GL_COLOR_BUFFER_BIT); //clears display window
Board(4.0,4.0);
glScalef(0.3,0.28,0);
for(int n=0;(n<8);n++)
for(int m=0;(m<8);m++){
    if(board[n][m]){
char a[5]="0";
_itoa_s(board[n][m],a,10);
glColor3f(50*(1.00/255), 118*(1.00/255), 152*(1.00/255));
output((n*70)+15,(m*75)+17,a);
//glColor3f(0.0, 0.5, 0.5); 
//horse((n*70)+15,(m*75)+15);
    }};
if(i<64){
        i++;
        mmove[0] = mpositionx;
        mmove[1] = mpositiony;
        get_next_moves(mmove);
        }
 
    mpositionx = mmove[0];
    mpositiony = mmove[1];
    board[mpositionx][mpositiony] = mmove_number;
        
glColor3f(0.0, 1.0, 1.0); 
horse((mpositionx*70)+15,(mpositiony*75)+15);
glColor3f(124*(1.00/255), 0*(1.00/255), 124*(1.00/255));
char a[5]="0";
_itoa_s(mmove_number,a,10);
output((mpositionx*70)+15,(mpositiony*75)+17,a);
if (i<63)mmove_number += 1;
Sleep(1000);

glFlush();
glPopMatrix();
glutSwapBuffers(); 
}

int main(int argc, char** argv)
{
for(int n=0;(n<8);n++)
for(int m=0;(m<8);m++)
  board[n][m]=0;
 mpositionx = nrandom(BSIZE);
 mpositiony = nrandom(BSIZE);
 board[mpositionx][mpositiony] = 1; // first move

glutInit(&argc, argv); //initialise GLUT
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); //sets display mode
glutInitWindowPosition(50, 100); //top left display window pos
glutInitWindowSize(500, 500); //display win width and height in pixel coords
glutCreateWindow("Knight 01"); //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,175.0,0.0,175.0); //sets up WC extent
glutDisplayFunc(dis); //call drawing func
glutIdleFunc(dis);
glutMainLoop(); //display all and wait
return 0;
}



برنامه بعدی یک ساعت دیواری که ساعت ویندوز را نمایش بده؟؟!؟! یا می تونیم یک چیزی شبیه انیمیشن ها انتظار اول وبلاگ ها که یک دایره است و یک سری خط ایجاد کنیم؟

----------


## zuck_619

یه توضیحی در مورد ایت زیریا بده لطفا :

stdlib
ctime
srand
rand

----------


## amin1softco

stdlib برای تبدیل عدد به رشته ازش استفاده شده
ctime برای time(NULL)
srand برای تعیین هسته تابع راندوم 
rand برای محاسبه اولین خانه تصادفی ازش استفاده شده

----------


## zuck_619

time(null) چه کارمیکنه ؟

sleep  چیه قضیه اش ؟

----------


## amin1softco

> time(null) چه کارمیکنه ؟
> 
> sleep  چیه قضیه اش ؟


time(null) برای اینه که برنامه با اجرا های متفاوت خانه های متفاوتی رو انتخاب کنه و کلا اینا زیاد مهم نیست فقط یک خانه اولیه تصادفی ایجاد می کنند برای شروع حرکت اسب

sleep برای اینه ایجاد حالت نمایشه چون ممکنه تابع dis خیلی زود به زود فراخوانی بشه این کنترل می کنه که در 7 دهم ثانیه تا اجرای بعدی صبر کنه.....

----------


## zuck_619

من تو نوشتن ساعت یه مشکل دارم :
چطوری میشه ساعت سیستم رو خوند و ازش استفاده کرد ؟
فکر کنم با getitmer یا gettimeofday  ولی نمیدونم چطوری میشه ازش استفاده کرد ؟

----------


## amin1softco

> من تو نوشتن ساعت یه مشکل دارم :
> چطوری میشه ساعت سیستم رو خوند و ازش استفاده کرد ؟
> فکر کنم با getitmer یا gettimeofday  ولی نمیدونم چطوری میشه ازش استفاده کرد ؟


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

    #include <time.h>
    #include <stdlib.h>
void main(){
struct tm *time_now;
time_t secs_now;
int s,m,h;
tzset();
    time(&secs_now);
    time_now = localtime(&secs_now);
     strftime(str, 3,"%H",time_now);
    h=atoi(str);
     strftime(str, 3,"%M",time_now);
    m=atoi(str);
     strftime(str, 3,"%S",time_now);
    s=atoi(str);

sprintf(key,"%d:%d:%d",h,m,s);
}

----------


## zuck_619

یکم توضیح در مورد این کد میدی ؟ struct و tzset

----------


## amin1softco

> یکم توضیح در مورد این کد میدی ؟ struct و tzset


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

#include <time.h>
#include <stdlib.h>
#include <stdio.h>
void main(){
struct tm *time_now;
time_t secs_now;
int s,m,h;
char str[2];
tzset(); //تبديل ساعت گرينويچ به ساعت محلي
time(&secs_now);
time_now = localtime(&secs_now);
     strftime(str, 3,"%H",time_now);
   h=atoi(str);
     strftime(str, 3,"%M",time_now);
   m=atoi(str);
     strftime(str, 3,"%S",time_now);
   s=atoi(str);
printf("%d:%d:%d",h,m,s);
}

----------


## zuck_619

چطوری میشه چند شکل خاص رو تو صفحه دوران داد ؟
در حالت عادی نقطه 0 و 0 مرکز تصویر . اما وقتی از  gluOrtho2D استفاده میشه جاش عوض میشه ! اینو توضیح بدین لطفا

----------


## amin1softco

> چطوری میشه چند شکل خاص رو تو صفحه دوران داد ؟


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



> در حالت عادی نقطه 0 و 0 مرکز تصویر . اما وقتی از  gluOrtho2D استفاده میشه جاش عوض میشه ! اینو توضیح بدین لطفا


خوب شما  وقتی می خواهید این تابع را تنظیم کنی جوری تنظیمش کن که مرکز صفحه باشه. یا با glTranslate مختصات رو جابه جا کن.

درثانی منم مثل خودتونم تازه کارم بهتره تو خود انجمن سوالاتون رو مطرح کنید تا دوستان ماهر تر جواب بدند.

----------


## zuck_619

آقا ما اینو نوشتیم . ولی اجرا نشد . کلی مشکل داشت . دوستان کمک کنن لطفا :
#include <time.h>
#include <stdlib.h>
#include <stdio.h>
#include<math.h>
#include<gl\glut.h>
#define PI 3.1415926535898
GLint circle_points = 360;
class time 
{
public:
    int hour; // ساعت 
    int min; //دقیقه
    int sec;//ثانیه
};
void gettime()
{
  struct tm *time_now;
  time_t secs_now;
  char str[2];
  tzset(); //تبديل ساعت گرينويچ به ساعت محلي
  time(&secs_now);
  time_now = localtime(&secs_now);
      strftime(str, 3,"%H",time_now);
    time.hour = atoi(str);
      strftime(str, 3,"%M",time_now);
    time.min = atoi(str);
      strftime(str, 3,"%S",time_now);
    time.sec = atoi(str);
  printf("%d:%d:%d",h,m,s);
}
void MyCircle2f(GLfloat centerx, GLfloat centery, GLfloat radius)
{
  GLint i;
  GLdouble theta;
  glLineWidth(5.0) ;
  glColor3f(1.8,1.0,0.1);
  glBegin(GL_LINE_LOOP);
  for (i = 0; i < circle_points; i++) 
  {
  theta = 2*PI*i/circle_points;
  glVertex2f(centerx+radius*cos(theta), centery+radius*sin(theta));
  }
  glEnd();
  }
void drawhour ()
{
   glPushMatrix();
    glBegin(GL_POLYGON);
    glLineWidth(5.0) ;
    glColor3f(1.8,0.0,0.1);
    glVertex2f( centerx,centery) ;
    glVertex2f( centerx,.9*radius) ;
    glEnd () ;
    glRotatef(time.hour*6,0,0,0.1);
   glPopMatrix();
    sleep (36000) ;
}
void drawmin ()
{
   glPushMatrix();
    glBegin(GL_POLYGON);
    glLineWidth(5.0) ;
    glColor3f(1.8,0.0,0.1);
    glVertex2f( centerx,centery) ;
    glVertex2f( centerx,.5*radius) ;
    glEnd () ;
    glRotatef(time.min*6,0,0,0.1);
   glPopMatrix();
    sleep (60000) ;
}
void drawsec ()
{
   glPushMatrix();
    glBegin(GL_POLYGON);
    glLineWidth(1.0) ;
    glColor3f(1.8,0.0,0.1);
    glVertex2f( centerx,centery) ;
    glVertex2f( centerx,.9*radius) ;
    glEnd () ;
    glRotatef(time.sec*6,0,0,0.1);
   glPopMatrix();
    sleep (1000) ;
}
void drawpoint ()
{

for (int i =0 ; i<=330 ; i+=30)
{
   glPushMatrix();
       glBegin(GL_POLYGON);
    glLineWidth(1.0) ;
    glColor3f(0.0,0.0,0.0);
    glVertex2f( centerx,centery) ;
    glVertex2f(0.25, 0.75);
    glEnd();
    glRotatef(-i,0,0,0.1);
   glPopMatrix();
}
}
void Display(void)
{
glClear(GL_COLOR_BUFFER_BIT);
gettime();
MyCircle2f(0.0,0.0, .75); 
drawhour ();
drawmin ();
drawsec () ;
glFlush();
glutSwapBuffers();
}
void init(void){
glClearColor(1.0,1.,1.0,1.0);
}
int main(int argc, char* argv[])
{
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize (500, 500);
glutCreateWindow("clock");
init();
glMatrixMode(GL_PROJECTION); 
glutDisplayFunc(Display); 
glutIdleFunc(Display);
glutMainLoop(); 
return 0;
}

----------


## pswin.pooya

> چطوری میشه چند شکل خاص رو تو صفحه دوران داد ؟


میتونی از push/pop تو در توی ماتریسها استفاده کنی.

روش بهتر ساختن دستی ماتریسها و لود کردن اونها داخل حافظه به کمک glLoadMatrix هستش. میتونی برای ساخت این ماتریسها بدون هیچ دردسری از کلاس matrix موتور kge استفاده کنی. من خودمم از کدهای kge برای اینکار استفاده می کنم که کوچول اونها رو نوشته.





> در حالت عادی نقطه 0 و 0 مرکز تصویر . اما وقتی از  gluOrtho2D استفاده میشه جاش عوض میشه ! اینو  توضیح بدین لطفا


دستور gluOrtho یه ماتریس دو بعدی (orthographic ) رو میسازه که با لود شدن اون (به کمک خود دستور) اثر پروجکشن از بین میره و انگار دارین دو بعدی کار میکنین (مثل شروع کار) که توی این حالت z تاثیر نداره مگر اینکه بیشتر از 1 و یا کمتر از -1 بدین که باعث شه شکل محو بشه. پارامترهای این دستور به ترتیب عبارتند از:


left: مختصات از سمت چپ صفحهright: مختصات از سمت راست صفحهbottom: مختصات از پایین صفحهtop: مختصات از بالای صفحه
به عنوان مثال دستور زیر باعث میشه که مختصات 0 و 0 به گوشه سمت چپ پایین صفحه انتقال پیدا بکنه:
gluOrtho2d(0, عرض, 0, ارتفاع);

یعنی اگر میخوای وسط صفحه باشه کافیه ارتفاع و عرض پنجره رو تقسیم به دو کنی و اونها رو داخل دستور وارد کنی. مثلا اگر طول و ارتفاع پنجره 400 باشه باید به شکل زیر عمل کرد:
glOrtho(200,200,200,200,1,-1); 

زمانی که داری دو بعدی کار میکنی بهتره با پیکسل ها کار کنی(از دستور glVertex{2,3,4}i استفاده کن).(اگر اندازها دقیقا برات مهم نیست، مثلا اگر نرم افزار CAD تولید نمی کنی) به عنوان مثال تکه کد زیر یه مستطیل که از گوشه چپ پایین 10 پیکسل فاصله داره رو رسم میکنه.:
    glBegin(GL_QUADS);
        glVertex2i(10,10);
        glVertex2i(300,10);
        glVertex2i(300,300);
        glVertex2i(10,300);
    glEnd();

توی کد بالا از دستور glOrtho به شکل زیر استفاده شده:
glOrtho(0,400,0,400,1,-1);

----------


## amin1softco

والا به نظر من خیلی کار رو سخت کردی ... اصلاح شده کدت این می شه :


#include <time.h>
#include <windows.h>
#include <stdlib.h>
#include <math.h>
#include <gl\glut.h>
#define PI 3.1415926535898
GLint h,m,s,circle_points = 360;
GLboolean min=0;

void gettime()
{
struct tm *time_now;
time_t secs_now;

char str[2];
tzset(); //ÊÈÏíá ÓÇÚÊ Ñíäæí Èå ÓÇÚÊ ãÍáí
time(&secs_now);
time_now = localtime(&secs_now);
strftime(str, 3,"%H",time_now);
h = atoi(str);
strftime(str, 3,"%M",time_now);
m = atoi(str);
strftime(str, 3,"%S",time_now);
s = atoi(str);
}

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_8_BY_13, string[i]);
  }
}

void MyCircle2f(GLfloat centerx, GLfloat centery, GLfloat radius)
{
GLint i;
GLdouble theta;
glLineWidth(5.0) ;
glColor3f(1.8,1.0,0.1);
glBegin(GL_LINE_LOOP);
for (i = 0; i < circle_points; i++)
{
theta = 2*PI*i/circle_points;
glVertex2f(centerx+radius*cos(theta), centery+radius*sin(theta));
}
glEnd();
}

void drawhms (GLfloat centerx, GLfloat centery,GLint hms,GLfloat r)
{

glPushMatrix();
glTranslatef( centerx, centery, 0.0f );
glRotatef(-(hms*r)+45,0,0,1.0);
glLineWidth(2.0) ;
if(min) r=10;
else if(r==6) r=8;
glBegin(GL_LINES);glVertex2i(0.0,0.0); glVertex2i(150.0/(r),150.0/(r)); glEnd();
glPopMatrix();
min=0;
}

GLint i=0;
GLfloat cx=100.0,cy=75.0;
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

gettime();
MyCircle2f(cx,cy,30);
glColor3f(0.0, 0.0, 1.0); //line colour set to blue
drawhms(cx,cy,h,30);
min=1;
drawhms(cx,cy,m,6);
drawhms(cx,cy,s,6);

glPushMatrix();
glTranslatef( cx-2, cy, 0.0f );
glRotatef(90,0,0,1);
for( i=360;i>0;i-=30){
        char a[5]="0";
itoa(i/30,a,10);
output(30*cos(-(PI/180*i)), 30*sin(-(PI/180*i)),a);
        }
glPopMatrix();

glFlush(); //process all OGL functions immediately
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("Clock"); //now create display win
init(); //run initilization procs
glutDisplayFunc(lineSegments); //call drawing func
glutIdleFunc(lineSegments);
glutMainLoop(); //display all and wait
return 0;
}

----------


## amin1softco

اینم برای دوستان علاقمند به OpenGL :
یک سری مثال از کار با این بسته گرافیکی از سایت رسمی OpenGL 
http://www.opengl.org/resources/code.../examples.html

____________
دوستانی که دنبال یک رفرنس برای کار با توابع Opengl هستند از کتاب blueBook استفاده کنند.

----------


## zuck_619

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

----------


## amin1softco

والا قضیه این ماتریس ها هم واسه خودش کلاسی داره ولی در کل یک سرچی بزنی خیلی کتاب خفن پیدا می کنی به نظر من همیشه استفاده از کد های آماه بهتره ....

----------


## sanaz88

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


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

----------


## sanaz88

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

----------


## pswin.pooya

میتونید به کتاب قرمز و یا super bible مراجعه کنید:

http://opengl.persiangig.com/page.html

----------


## amin1softco

> امكانش هست تابعهاي بيشتري ازopengl كه بصورت gl_ هستند دراختيارمون قرار بدين


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

----------


## aminsharifloo

با سلام 
من می خوام گیم snake رو با opengl بنویسم میشه کمکم کنید

----------


## sajjadgameactor

چرا تاپیک خوابیده بی صبرانه منتظر ادامه هستیم

----------


## alip30c

لطفا ادامه بدین
خیلی مفید بود

----------


## pswin.pooya

> از دوستان کسی نیست که جوابم رو بده ؟


این رسما درخواست پروژه آخر ترم هستش! که مخالف قوانین سایت هست.

----------


## mchatavi

> این رسما درخواست پروژه آخر ترم هستش! که مخالف قوانین سایت هست.


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

----------


## armintirand

فکر نکنم کسی کمکت کنه چون open gl یکی از مباحثی هست که کسانی که چیزی بلدند با سختی خیلی زیاد تونستن اونو یاد بگیرن وبه خود اونا هم کسی کمک نکرده البته اگه اشتباه نکنم این مطلب تو مقدمه یک مقاله که از سایت gamedev دان کرده بودم بیان شده بود.البته قصد توهین به کسی نداشتم ولی منظورم اینه که خودت باید سرهم کنی. برای یادگیری هم اگه تو ویندوز میخوای از اون استفاده کنی بهتره قبل از یادگیری opengl  کمی API های ویندوز رو یاد بگیری. برای لینوکس هم به نظرم باید دوستان با سوادتر از من بگن.

----------


## tavakolian

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

----------


## pswin.pooya

> آقایون
> حاضرم برای حلش پول هم بدم
> جواب این سوال برام خیلی مهم شده
> بلد نیستم اما واسه رو کم کنیه که مهم شده برام
> لطفأ کمکم کنید


مشکلت کجای برنامه هستش؟ توی رسم دایره و یا چرخوندن اون؟

----------


## mchatavi

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

----------


## pswin.pooya

جابجا کردن اشکال رو توی فضا با تبدلات اتجام میدن. تبدیلات از سi عمل انتقال، چرخش و مقیاس تشکیل شده:

*انتقال*: یک جسم رو از یک نقطه به نقطه دیگه میبره. توی OpenGL بر انتقال دادن اشیاء از glTranslatef استفاه میکنن مثلا کد زیر 10 واحد شکل رو روی محورهای y جا به جا میکنه.
glTranslatef(0,10,0);*چرخش*: چند نمونه چرخش وجود داره اما اونی که توی fixed-function،  اپن جی ال هستش چرخش به دور یک محور هستش و کارش اینه که شکل سه بعدی شما رو دور محوری که مشخص کردن می چرخونه. اینکار داخل OpenGL به صورت glRotatef انجام میگیره و داخل دایرکت ایکس با دستور D3DXMatrixRotationAxis. (الته همه اونها از این نوع یعنی چرخش به دور محور دلخواه مشتق میشن) مثلا داخل OpenGL برای اینکه به اندازه 90 درجه شکل رو به دور محورهای x بچرخونی باید از دستور زیر استفاده کنی:

glRotatef(PI/2,1.0f,0,0);*مقیاس*: برای بزرک و کوچیک کردن اشکال به کار میره و از دستور glScalef برای اینکار استفاده میشه.ا ین دستور سه پارامتر میگیره که برای مقیاس توی هر کدوم از محورها هستش. مثلا اگر به پارامتر اول 2 بدی شکل رو روی محورهای x دو برابر میکنه (مولفه x ورتکسها رو دو برابر میکنه) و یا اگر بهش 0.5 اونها رو نصف میکنه. مثلا کد زیر شکل رو دو برابر میکنه. 
glScalef(2.0,2.0,2.0);تمامی سه دستور بالا روی یک ماتریس اثر میذارن که ModelView نامیده میشه. بحث ماتریسها خیلی پیچیده هستش و صحبت کردن در مورد اونها داخل یک فروم خارج از حوصله هم فروم و هم اعضای اون مثل من هست. فصل چهارم کتاب Beginning OpenGL Game Programming درباره ماتریسها صحبت میکنه. همینطور اگر داخل این فروم یه سرچ بزنی می تونی مواردی رو پیدا کنی.

خب حالا برای حرکت توپ باید یه بردار سرعت درست کنی و هر لحظه مکان توپ رو با اون جمع کنی و اگر مکان توپ از گوشه های صفحه (-1و1) بیرون رفتش معکوس اون بردار رو بدست بیاری. درست کردن بردار سرعت یا جابجایی و محاسبه بیرون رفتن اون و ... مربوط به برنامه نویسی OpenGL  نیستش. اما رسم توپ توی نقطه مربوط به برنامه نویسی GL میشه اجازه بده فرض کنیم که px,py و pz موقعیت توپ (دایره) من رو داخل صفحه مشخص میکنه. پس کد من داخل OpenGL باید یه صورت زیر باشه:

void Display()
{
glLoadIdentity();
glTranslatef(px,py,pz);
// rasme daire
و ...

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

void main()
{
glPushMatrix();
glLoadIdentity();
glTranslatef(px,py,pz);
// rasme daire
glPopMatrix();

و بقیه کد

}

----------


## mchatavi

آقای pswin.pooya با تشکر از مطالب خوبی که ارسال کردی
واقعأ ممنونم
چیزای خوبی بود که به دردم می خوره
اما یه سوال دیگه دارم
توی مثالی که زده بودم قراره دایره ای که رسم کردم طبق یه زاویه ای که با یکی از محورها داده میشه ، حرکت کنه و وقتی به اتنهای صفحه رسید دوباره بر اساس همون زاویه اما مخالف محور قبلی به حرکتش ادامه بده . طوری که دایره به 4طرف مانیتور برخورد کنه و بطور متوالی
یه راهنمایی در این مورد انجام بدین ممنون میشم

----------


## pswin.pooya

> توی مثالی که زده بودم قراره دایره ای که رسم کردم طبق یه زاویه ای که با یکی از محورها داده میشه ، حرکت کنه و وقتی به اتنهای صفحه رسید دوباره بر اساس همون زاویه اما مخالف محور قبلی به حرکتش ادامه بده . طوری که دایره به 4طرف مانیتور برخورد کنه و بطور متوالی
> یه راهنمایی در این مورد انجام بدین ممنون میشم


گفتم که برای اینکار باید یه بردار سرعت و یا بردار جهت حرکت (اگر نرمال باشه) درست کنی. مثلا بردار (2,.3.) داخل کد زیر میگه که توی هر فراخوانی به x، .2 واحد و y سه دهم واحد اضافه کنه:

void display()
{
px += .2;
py =.3;

....

حالا اگر یکی از px و یا pyها بزرگتر از یک و یا کوچیکتر از -1 شد. اون مولفه بردار سرعت رو توی -1 ضرب مبکنی. مثلا:

struct vector
{
vector(float _x,float _y){ x= _x;y = _y;};
float x;
float y;
};

vector s(.2,.3);
vector pos (0,0);
void main ()
{
pos.x += s.x;
pos.y += s.y;

if (pos.x > 1 || pos.x < -1) 
s.x = -s.x
if (pos.y > 1 || pos.y <-1)
s.y = -s/y;

...

glTranslatef(pos.x,pos.y,0);

....
}

----------


## amirali!

salam!
kho0bi amin?! 
bebin man o0n postet darbare "PolyTrance " ro kho0ndam!
man khodam hafte Dge projhe daram shatranj!
bad hameye mohrehasho doros kardam ba 3DMax!
bad o0n PolyTrance ro download kardam,bad ba o0n export kardam be openGl...vali vaghT run kardam sheklesh daghighan o0n nashod..yaani engar yechizayish kame..tike tike boridan az yejahayish..mikhastam bebinam to ham hamin moshkelo dari?! rahe hali nis barash?
merC!
khaheshan age mishe zood bejavab chon cchan rooz bishtar vaght nadaram!

----------


## mni1989

salam man 1 barnamey paint neveshtam, kheili kam dar rabeteh ba ijad menue v nahvehy karbordesh midonam age mishe komakam konid

----------


## amin1softco

به نظر من بهتر قید توابع glut را بزنید برای منو اما اگر هنوز اسرار دارید می تونید یک تصویر از کلید ها درست کنید و بعد وقتی مختصات ماوس روی اونجا ها قرار گرفت یک تابع را اجرا کنید یعنی منو و اینها رو خودتون بسازید glx  وجود داره
http://sourceforge.net/projects/glui/
http://www.lighthouse3d.com/opengl/glut/index.php?9

----------


## mchatavi

سلام
آقای amin1softco 
میشه ID تونو داشته باشم؟
برای یه کاری
ممنون

----------


## amin1softco

منبع : همین جا بگم اگه انگلیسیتون خوبه منبع رو بخونید چون من ترجمم یکمی مورد داره :چشمک: 

آموزش لود کردن و نمایش یک فایل تصویری بوسیله کتابخانه دویل و اپن جی ال(devil-OpenGL)
دویل (همچنین به عنوان OpenIL شناخته می شه) یک کتابخانه برای کار با عکس ها است که اجازه لود و دستکاری کردن(فیلتر گذاری و تغییر اندازه) تصاویر را به شما می دهد.
توسعه دهنده دویل Denton Woods دنتون وود کار روی پروزه خودش را حدود 2 سال به تعویق انداخت اما او کد نویسی آن را دوباره شروع کرده است. اما قدر این کتابخانه را بدانید.

دویل دنبال می کنه فلسفه نحوی توابع OpenGL را و راهی که ما آنها را به کار می بریم. بنابر این اگر شما با OpenGL آشنایی داشته باشید می تونید در عرض چند دقیقه کار با این کتابخانه را فرا بگیرید.
دویل یک کتابخانه متن باز است و برای کاربرد های تجاری و غیر تجاری رایگان است. شما می توانید اطلاعات بیشتر در این زمینه را در لینک زیر بیابید:
http://openil.sourceforge.net/about.php
هدف از این خودآموز نشان دادن راهی برای لود یک تصویر jpg و بکار بردن آن به عنوان RGB byte داده های منبع برای بافت(الگوtexture ) یک مستطیل (محیط بسته دوبعدی)است.
مهمترین قسمت این خود آموز تابع DevILTextureLoader() است.
بطور کلی , این تابع مراحل زیر را انجام می دهد:
1- ساخت و پیوست نام تصویر:
ILuint ImgId = 0;
ilGenImages(1, &ImgId);
ilBindImage(ImgId);

شبیه توابع اپن جی ال زیر
glGenTextures() / glBindTexture()
2- لود کردن تصویر از نام تصویر:
ilLoadImage(filename);

3- بدست آوردن حجم تصویر و اختصاص حافظه برای کپی کردن الگو RGB byte
width = ilGetInteger(IL_IMAGE_WIDTH);
height = ilGetInteger(IL_IMAGE_HEIGHT);
pixmap = new BYTE[width * height * 3];
ilCopyPixels(0, 0, 0, width, height, 1, IL_RGB,
IL_UNSIGNED_BYTE, pixmap);

4- آزاد کردن تصویر و حافظه مربوط به دویل:
ilBindImage(0);
ilDeleteImage(ImgId);

بر اساس برنامه شما مرحله 3 ضروری نیست. دویل نگهداری می کنه یک حافظه بافر با داده های تصویری پیوست شده به نام تصویر در این مثال ImgId شما می توانید به طور مستقیم به بافر دویل دسترسی داشته باشید:
ilBindImage(ImgId);
BYTE* data = ilGetData();


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

در فایل ضمیمه تما فایل های مورد نیاز این خود آموز قرار داده شده است (*.h + *.dll + *.lib)

فایل ضمیمه حجمش بالا بود.

----------


## pswin.pooya

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

            ilInit ();
            ilEnable (IL_CONV_PAL);

همچنین شما می تونید از devil برای تهیه شات از برنامتون استفاده کنید.این تکه کد از انجین من برای تهیه شات از فریم بافر (بافر رنگ) هست (کد مربوط به ویرایش 0.0.0 بود) :

        void Renderer::writeContentsToFile(std::string filename)
        {
            ILuint img;
            ilGenImages(1, &img);
            ilBindImage(img);
            char *buf = new char[ m_uWidth * m_uHeight * 4 *4];
            glReadPixels(0, 0, m_uWidth, m_uHeight, GL_RGBA,
                GL_UNSIGNED_BYTE, buf);

            ilTexImage(m_uWidth, m_uHeight, 1, 4, IL_RGBA,
                IL_UNSIGNED_BYTE,buf );

            // save image to file
            #ifdef DGE_UNICODE_SUPPORTED
                core::String f(filename.c_str());
                ilSaveImage(f.getUTF16());
            #else
                ilSaveImage(IL_PNG,filename.c_str());
            #endif

            DGE_DELETE_ARRAY(buf);
            ilDeleteImage(img);
        }

----------


## amin1softco

آموزش به کار گیری openGL در زبان ها برنامه نویسی دیگر 
متناسب با هر زبان یک فرم ورک تدارک دیده شده پس بهتره بعد از انتخاب زبانی که می خواهید باهاش برنامه بنویسید یک سری به اینجا بزنید :
http://www.opengl.org/resources/bindings/
خوب من فکر می کردم به راحتی می تونم از اپن جی ال در سی شارپ  استفاده کنم ولی بعد از یکمی سرچ و اینها به این نتیجه رسیدم که برای بکار بردن اپن جی ال در سی شارپ چند راه وجود داره :
1-فرم ورک csgl هست که قدیمی شده و tao که توسعه یافته همونه
2- فرم ورک OpenTK بهترین راه به نظر من و آپدیت آپدیت.
3- SharpGL
دوستان اگه راه بهتری سراغ دارند دریغ نکنند. :بوس: 
در آخر یک نتیجه دیگه هم بدست آوردم و اون این بود که آدم بره سراغ دایرکس که تو سی شارپ خیلی راحت (البته نه در اون حد) برنامه بنویسه البته سه بعدی.

----------


## ehp_kz6597

سلام
برای نصب GLUT کلی مشکل پیدا کردم
توی turbo c , BORLANDC.31 , Visual C++‎‎ 6.0  هرکاری کردم نشد
دیروز توی  Visual Studio 2005 امتحان کردم جواب داد ، اجراشد بدون اشکال و  خروجی داد 
اما امروز که اومدم شروع کنم :
- انگار برای هر برنامه باید opengl32.lib glu32.lib glut32.lib رو اضافه  کنم ( برای هر پروژه جدید یک بار ؟!)
-مشکل اصلی اینجاست که اومدم اجرا کنم دیدم رفته به glut.h گیر داده و 133  تا error , warning  داده
درحالی که من از دیروز تا اون موقع هیچ دستکاری نکرده بودم 
فایل اصلی رو جایگزین کردم باز هم جواب نداد 
گزارش خطا ها + glut.h رو میذارم اینجا یه نگاه کنین ببینین این چی میگه 
دیگه دارم قاطی میکنم  :خیلی عصبانی: 
لطفا کمک کنین

با تشکر

----------


## pswin.pooya

مشکل از opengl.h هستش. نه glut.h اول از همه opengl.h رو حذف کنید و سعی کنید برنامه رو کامپایل کنید. اگر نشدش کتابخونه glew.h رو بگیرید و از هدر اون به جای opengl.h استفاده کنید. من خودم هم بارها به این مشکل داخل ویژوال استادیو برخوردم و راه حل بهتری پیدا نکردم.

----------


## ehp_kz6597

از کمکتون خیلی ممنون
1- سرچ کردم opengl.h اصلا ندارم 
2- glew-1.5.6-win32 رو گرفتم و نصب کردم خدا رو شکر فعلا داره کار میکنه

واقعا ازتون سپاسگذارم  :تشویق:  
 :گریه:  بودم  :لبخند گشاده!:  شدم
باز هم ممنون

----------


## smh1988

یه سوال دارم .
http://www.barnamenevis.org/sh...d.php?t=245673

----------


## amin1softco

دوستاني كه گرافيك دارند و دنبال سورس كد هاي تايپ شده كتاب مي گردند به اين لينك ها مراجعه كنند:
این صفحه را مرور کنید 
http://www.cs.ukzn.ac.za/~satya/COMP712/ 

*اینم لینک اصلی کد های کتاب* 
http://www.cs.ukzn.ac.za/~satya/COMP712/PROGS/Code.zip 


اینم لینک اون جزوه انگلیسیه که می تونید باهاش غلطای کتابو پیدا و تصحیح 
 کنید 
http://www.cs.ukzn.ac.za/~satya/COMP712/GRAPHICS_notes.pdf 



اسلاید هاي كتاب رو اینجا دیدم جالب بود 
http://www.cs.virginia.edu/~gfx/Courses/2004/Intro.Spring.04/ 
 ........................... 

 آموزش خارج از كتاب
http://nehe.gamedev.net/

----------


## sarakh

سلام 
برای کار با opengl در visual C++‎6 و visual C++‎2008 آیا کدهاشون با هم فرق داره؟؟؟؟؟؟
آیا می تونم از کدهای  visual C++‎6 در visual C++‎2008 استفاده کنم؟؟؟؟؟؟؟؟؟؟؟

----------


## sarakh

می تونم توی این تاپیک در مورد گرافیک در visual C++‎6 سوال بپرسم.
منتظر جواب هستم.
ممنون

----------


## pswin.pooya

> برای کار با opengl در visual C++‎6 و visual C++‎2008 آیا کدهاشون با هم فرق داره؟؟؟؟؟؟


نه



> آیا می تونم از کدهای  visual C++‎6 در visual C++‎2008 استفاده کنم؟؟؟؟؟؟؟؟؟؟؟


بستگی داره اما توی 90 درصد موارد میشه

 							می تونم توی این تاپیک در مورد گرافیک در visual C++‎6 سوال بپرسم.
تاپیک جدا باز کنی بهتره

----------


## oghyanoos

سلام میشه لطف کنید برنامه کامل ساعت درopen gl برام بذارین.

----------


## amin1softco

مگه برنامش کامل نیست؟؟؟؟؟؟؟؟ تازه این پست خلاف قوانین سایته .......

----------


## sadaf.2006

سلام
مرسی از سایتتون
میشه بگین چطور میشه تو opengl یه دایره یا هر شکل با زدن یه کلید پرش کنه؟لطفا راهنماییم کنین

----------


## amin1softco

خیلی ممنون از سایتشون  :لبخند گشاده!:  مارو قاطی 4 تایی ها نکنید....
ببنید این opengl و برنامه نویسی کلاً هنوز اونقدر هوشمند نیست یعنی برای انجام هر کاری باید قبلش اونو تشریح کنید مثلاً وقتی می خواهید یک توپ پرتاب بشه باید حرکت پرتابی رو پیاده سازی کنید یعنی بوسیله فرمول های فیزیک مسیرش رو معین کنید و اونو در مسیرش حرکت بدین و یک کتابخانه است به اسم physics که بیشتر این چیزا رو شبیه سازی می کنه مثلاً برای جاذبه زمین 

بقیشو بزرگان باید جواب بدند

----------


## farzad_fb25

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

----------


## amin1softco

این همه ما این دایره ها رو دور هم چرخونیدم والا ... دو راه داره یا خودت بری ماتریس ها رو تغییر بدی بصورت دستی یا باید از توابع :

void glRotated  ( GLdouble _angle_ , GLdouble _x_  , GLdouble _y_ , GLdouble _z_ );  void glRotatef  ( GLfloat _angle_ , GLfloat _x_ ,  GLfloat _y_ , GLfloat _z_ );
استفاده کنید مثال از رد بوک :


#include <GL/glut.h>
#include <stdlib.h>

static int year = 0, day = 0;

void init(void) 
{
   glClearColor (0.0, 0.0, 0.0, 0.0);
   glShadeModel (GL_FLAT);
}

void display(void)
{
   glClear (GL_COLOR_BUFFER_BIT);
   glColor3f (1.0, 1.0, 1.0);

   glPushMatrix();
   glutWireSphere(1.0, 20, 16);   /* draw sun */
   glRotatef ((GLfloat) year, 0.0, 1.0, 0.0);
   glTranslatef (2.0, 0.0, 0.0);
   glRotatef ((GLfloat) day, 0.0, 1.0, 0.0);
   glutWireSphere(0.2, 10, 8);    /* draw smaller planet */
   glPopMatrix();
   glutSwapBuffers();
}

void reshape (int w, int h)
{
   glViewport (0, 0, (GLsizei) w, (GLsizei) h); 
   glMatrixMode (GL_PROJECTION);
   glLoadIdentity ();
   gluPerspective(60.0, (GLfloat) w/(GLfloat) h, 1.0, 20.0);
   glMatrixMode(GL_MODELVIEW);
   glLoadIdentity();
   gluLookAt (0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
}

void keyboard (unsigned char key, int x, int y)
{
   switch (key) {
      case 'd':
         day = (day + 10) % 360;
         glutPostRedisplay();
         break;
      case 'D':
         day = (day - 10) % 360;
         glutPostRedisplay();
         break;
      case 'y':
         year = (year + 5) % 360;
         glutPostRedisplay();
         break;
      case 'Y':
         year = (year - 5) % 360;
         glutPostRedisplay();
         break;
      case 27:
         exit(0);
         break;
      default:
         break;
   }
}

int main(int argc, char** argv)
{
   glutInit(&argc, argv);
   glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB);
   glutInitWindowSize (500, 500); 
   glutInitWindowPosition (100, 100);
   glutCreateWindow (argv[0]);
   init ();
   glutDisplayFunc(display); 
   glutReshapeFunc(reshape);
   glutKeyboardFunc(keyboard);
   glutMainLoop();
   return 0;
}

----------


## a-t-e-f-e-h

> سلام
> برای نصب GLUT کلی مشکل پیدا کردم
> توی turbo c , BORLANDC.31 , Visual C++‎‎‎‎‎ 6.0  هرکاری کردم نشد
> دیروز توی  Visual Studio 2005 امتحان کردم جواب داد ، اجراشد بدون اشکال و  خروجی داد 
> اما امروز که اومدم شروع کنم :
> - انگار برای هر برنامه باید opengl32.lib glu32.lib glut32.lib رو اضافه  کنم ( برای هر پروژه جدید یک بار ؟!)
> -مشکل اصلی اینجاست که اومدم اجرا کنم دیدم رفته به glut.h گیر داده و 133  تا error , warning  داده
> درحالی که من از دیروز تا اون موقع هیچ دستکاری نکرده بودم 
> فایل اصلی رو جایگزین کردم باز هم جواب نداد 
> ...


منم همین بدبختی رو دارم
این دفعه میزنم خودمو میکشم :خیلی عصبانی: 
همون اول مربع قرمز برای تست برنامه ارور میده 
همه ی مراحلشم رفتم
قبلا اون اجرا میشد،بقیه اجرا نمیشد
حالا خدا رو شکر هیچکدوم اجرا نمیشه :عصبانی: 
  چندین بارglut.dll وglut.lib   دانلود کردم
دیگه خسته شدممممممممممممم :گریه:

----------


## a-t-e-f-e-h

خوب خدا رو شکر مصیبت قبلی حل شد :اشتباه:  :لبخند گشاده!: 
میشه بگید dev  رو دیگه از کجا باید پیدا کنیم؟؟؟اصلا نمیدونم چی هست :ناراحت: 
آخه pdf اموزشی که ازhttp://www.parsbook.org/?s=%D9%85%D9...%D8%B1+open+gl گرفتم اسمی از dev نیاورده و اصلا ازش استفاده نکرده

----------


## amin1softco

ببنید dev یک محیط برای برنامه نویسیه که با دلفی نوشته شده و با استفاده از کامپایلر gcc/g++ کار کامپایل برنامه رو انجام میده و کلاً حجمش کمه و سریع راه اندازی می شه و قابل استفاده است و  فکر کنم جزو نرم افزار های آزاد محسوب بشه  .  آموزش پست اول فقط می خواست یک راهنما باشه برای کامپایلر هایه متنوع تر و نکته جالب این dev اینه که بیشتر library هایی که ما نیاز داریم را در اختیار ما قرار میده و شما حتی بدون طی این مراحل می تونید همون پکیج را در اینترنت سرچ کنید و دانلود کنید بدون کپی هیچ فایلی البته روش پست اول را الان فقط می تونید با استفاده از  v-p-n انجام بدید.

----------


## mahsa_shk

چرا در برنامه استفاده از کلید های صفحه کلید، کلید F2 کار نمی کند؟ یعنی با فشردنش عمل مربوطه انجام نمی شه ولی F1, F3,F4 و بقیه مشکلی ندارند؟

----------


## amin1softco

مطمئنید؟! ما که 3 تا بیشتر تعریف نکردیم f1 , f2 ,f3 منم تست کردم کار می کرد . فک کنم کلید هایه تابعی لپتاپتون برایه کار دیگه ایی تنظیم شده یا یک برنامه روش عمل می کنه

----------


## soroushp

> چرا در برنامه استفاده از کلید های صفحه کلید، کلید F2 کار نمی کند؟ یعنی با فشردنش عمل مربوطه انجام نمی شه ولی F1, F3,F4 و بقیه مشکلی ندارند؟


اگر سوالتون رو درست متوجه شده باشم جواب شما اینه که باید از تابع glutSpecialFunc برای استفاده از کلید های خاص مثله arrow key,f1,2,3,... استفاده کنید

----------


## saturn2200

سلام
دوستان من میخوام یه برنامهمه بنویسم که با اسفاده از الگوریتم tweening یه حرف الفبا مثلا "ا" رو به "ر" تبدیل کنه کسی هست راهنمایی کنه.یه سری کد دارم که tweening رو انجام مید که میذارمشون اینجا ببینید.لطفا اگه کسی هست راهنمایی کنه
 // Code from Figs. 3.25 3.26 3.27 3.28 
// and page 101 of Hill, F.S. "Computer Graphics Using
// OpenGL", 2nd edition, Prentice Hall, NJ, 2001.
// Modified Sept. 2002 by B.G. Nickerson into more
// structured C++‎‎ code.
// Code from Figs. 3.25 3.26 3.27 3.28 
// and page 101 of Hill, F.S. "Computer Graphics Using
// OpenGL", 2nd edition, Prentice Hall, NJ, 2001.
// Modified Sept. 2002 by B.G. Nickerson into more
// structured C++‎‎ code.

#include<glut.h>
#include<math.h>
#include<iostream>
#include <stdlib.h>
using namespace std;
 
class Point2   //single point w/ floating point coordinates
{
public:
	Point2() {x = y = 0.0f;} //constructor 1
	Point2(float xx, float yy) {x=xx; y=yy;} //constructor 2
	void set(float xx, float yy) {x=xx; y=yy;}
	float getX() {return x;}
	float getY() {return y;}
	void draw(void)
	{
		glBegin(GL_POINTS); //draw this point
		glVertex2f((GLfloat)x, (GLfloat)y);
		glEnd();
	}
private:
	float x, y;
};
 

//<<Support Classes for Canvas>>>

 
class IntRect  //aligned rectangle with integer coordinates, used for viewport
{
public:
	IntRect() {l = 0; r=100; b=0; t=100;} //constructors
	IntRect(int left, int right, int bottom, int top)
		{l = left; r=right; b=bottom; t=top;}
	void set(int left, int right, int bottom, int top)
	{
		l=left; r=right; b=bottom; t=top;
	}
	void draw(void); //draw this rectangle using OpenGL
	int getL(void)
	{
		return l;
	}
	int getR(void)
	{
		return r;
	}
	int getT(void)
	{
		return t;
	}
	int getB(void)
	{
		return b;
	}
 
private:
	int l, r, b, t;
};
 
class RealRect   //simlar to IntRect but w/ floating points & used for world window
{
public:
	RealRect() {l = 0; r=100; b=0; t=100;} //constructors
	RealRect(float left, float right, float bottom, float top)
		{l = left; r=right; b=bottom; t=top;}
	void set(float left, float right, float bottom, float top)
	{
		l=left; r=right; b=bottom; t=top;
	}
	float getL(void)
	{
		return l;
	}
	float getR(void)
	{
		return r;
	}
	float getT(void)
	{
		return t;
	}
	float getB(void)
	{
		return b;
	}
	void draw(void); //draw this rectangle using OpenGL
private:
	float l, r, b, t;
};
 

//<<End Support Classes>>>

class Canvas
{
public:
	Canvas(int width, int height, char* windowTitle); //constructor
        void setWindow(float l, float r, float b, float t);
        void setViewport(int l, int r, int b, int t);
        IntRect getViewport(void); //divulge the viewport data
        RealRect getWindow(void); // divulge the window data
        float getWindowAspectRatio(void);
        void clearScreen();
        void setBackgroundColor(float r, float g, float b);
        void setColor(float r, float g, float b);
        void lineTo(float x, float y);
        void lineTo(Point2 p);
        void moveTo(float x, float y);
        void moveTo(Point2 p);
	void moveRel(float dx, float dy);
	void turnTo(float angle);
	void turn(float angle);
	void forward(float dist, int isVisible);
        Point2 Tween(Point2 A, Point2 B, float t);
        void drawTween(Point2 A[], Point2 B[], int N, float t);
 
private:
     Point2 CP;         //current position in the world
     IntRect viewport;  //the current window
     RealRect window;   //the current viewport
     float CD;          //current direction in degrees (for turtle)
} ;
 

 
// Constructor
Canvas:: Canvas(int width, int height, char* windowTitle)
{
	char* argv[1];  //dummy argument list for glutinit()
	char dummyString[8];
	argv[0] = dummyString;  //hook up the pointer
	int argc = 1;
 
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
	glutInitWindowSize(width, height);
	glutInitWindowPosition (20,20);
	glutCreateWindow (windowTitle);
	setWindow(0, (float)width, 0, (float)height); // default world window
	setViewport (0, width, 0, height); //default viewport
	CP.set(0.0f, 0.0f); //initialize the cp to (0,0)
}
 
void Canvas:: moveTo(Point2 p)  //moves current point CP to point p object 
{
	float x1, y1;
	x1 = p.getX();
	y1 = p.getY();
	CP.set(x1, y1);
}
 
void Canvas:: forward(float dist, int isVisible)  //moves turtle forward by dist 
{
  const float RadPerDeg=0.017453293; //radians per degree
  float x = CP.getX() + dist * cos(RadPerDeg * CD);
  float y = CP.getY() + dist * sin(RadPerDeg * CD);
  if(isVisible)
    lineTo(x, y);
  else
    moveTo(x, y);
}
 
void Canvas:: turnTo(float angle)
{
	CD = angle;
}
 
void Canvas:: turn(float angle) {CD += angle;}
 
float Canvas:: getWindowAspectRatio(void)  //calculates aspect ratio of world window
{
	float width, height, aspectRatio;
	width = window.getR() - window.getL();
	height = window.getT() - window.getB();
	aspectRatio = width/height;
	return aspectRatio;
}
 
void Canvas:: moveRel(float dx, float dy)
{
	CP.set(CP.getX() + dx, CP.getY() + dy);
}
 
//<<setWindow>>
void Canvas:: setWindow (float l, float r, float b, float t)
{
	glMatrixMode (GL_PROJECTION);
	glLoadIdentity();
	gluOrtho2D ((GLdouble)l, (GLdouble)r, (GLdouble)b, (GLdouble)t);
	window.set (l, r, b, t);
}
 
//<<setViewport>>
void Canvas:: setViewport (int l, int r, int b, int t)
{
	glViewport(l, b, r-l, t-b);
	viewport.set (l, r, b, t);
}
 
RealRect Canvas:: getWindow(void)
{
	return window;
}
 
IntRect Canvas:: getViewport(void)
{
	return viewport;
}
 
void Canvas:: clearScreen(void)
{
	glClear(GL_COLOR_BUFFER_BIT);
}
 
void Canvas:: setBackgroundColor(float r, float g, float b)
{
	glClearColor(r, g, b, 0.0);   //4th variable level of transparency, may need to change 
}
 
void Canvas:: setColor(float r, float g, float b)
{
	glColor3f(r, g, b);
}
 
void Canvas:: lineTo(Point2 p)
{
	glBegin (GL_LINES);
		glVertex2f((GLfloat) CP.getX(), (GLfloat) CP.getY());
		glVertex2f((GLfloat) p.getX(), (GLfloat) p.getY());
	glEnd();
	CP.set(p.getX(), p.getY());
	glFlush();
}
 
//<<moveTo>>
//changes current point
void Canvas:: moveTo(float x, float y)
{
	CP.set(x, y);
}
 
//<<lineTo>>
//draws a line from current point to new point
void Canvas:: lineTo(float x, float y)
{
	glBegin(GL_LINES);
		glVertex2f((GLfloat) CP.getX(), (GLfloat) CP.getY());
		glVertex2f((GLfloat) x, (GLfloat) y); //draw the line
	glEnd();
	CP.set (x, y); //update current point to new point
	glFlush();
}
 
//<<drawTween>>
//draw the tween at time t between polylines A and B
Point2 Canvas:: Tween(Point2 A, Point2 B, float t)
{
  Point2 P;
  P.set(A.getX() + (B.getX() - A.getX())*t, A.getY() + (B.getY() - A.getY())*t);
  return P;
}
 
//<<drawTween>>
//draw the tween at time t between polylines A and B
void Canvas:: drawTween(Point2 A[], Point2 B[], int N, float t)
{
  for(int i = 0; i < N; i++)
    {
      Point2 P;
      P = Tween(A[i], B[i], t);
      if (i == 0) moveTo(P.getX(), P.getY());
      else  lineTo(P.getX(), P.getY());
    }
}
// Code from Figs. 3.25 3.26 3.27 3.28 
// and page 101 of Hill, F.S. "Computer Graphics Using
// OpenGL", 2nd edition, Prentice Hall, NJ, 2001.
// Modified Sept. 2002 by B.G. Nickerson into more
// structured C++‎‎ code.

// Code for example canvas, myDisplay, drawTween to 
// interpolate between two polyline representations
// of equal length.

Canvas cvs(640, 640, "Example of tweening"); //global canvas object

void myDisplay(void)
{
	cvs.setViewport(0, 640, 0, 640); 
        cvs.clearScreen();
        cvs.setWindow(0.0, 1.0, 0.0, 1.0);
  // Tween between two figures; a la Fig. 4.22, p.171
        Point2 A[10];
        Point2 B[10];
        A[0].set(0.2, 0.5);
        A[1].set(0.5, 0.35);
        A[2].set(0.8, 0.5);
        A[3].set(0.5, 0.2);
        A[4].set(0.2, 0.5);
        B[0].set(0.2, 0.2);
        B[1].set(0.2, 0.8);
        B[2].set(0.8, 0.8);
        B[3].set(0.8, 0.2);
        B[4].set(0.2, 0.2);
        float t = 0.0;
        int N = 10;   // Number of tweenings
        float tinc = 1.0/N;
        int vpsize = 640/(N+1);
        for (int i = 0; i <= N; i++)
	  {
            cvs.setViewport(i*vpsize,(i+1)*vpsize, (N/2)*vpsize, (N/2+1)*vpsize); 
            cvs.drawTween(A, B, 5, t);
            t = t + tinc;
          }
}
// Code from Figs. 3.25 3.26 3.27 3.28 
// and page 101 of Hill, F.S. "Computer Graphics Using
// OpenGL", 2nd edition, Prentice Hall, NJ, 2001.
// Modified Sept. 2002 by B.G. Nickerson into more
// structured C++‎‎ code.

// example of using canvas class with tweening.

int main(int argc, char **argv)
{
	cvs.setWindow(-1.0, 1.0, -1.0, 1.0);
	cvs.setViewport(0, 640, 0, 640); 
	cvs.setBackgroundColor(1.0, 1.0, 1.0);
	cvs.setColor(0.0, 0.0, 0.0);
	
	glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
	glutDisplayFunc(myDisplay);
	glutMainLoop();
	
        return 0;
}

----------


## saturn2200

کد tweening هم اینه



void drawTween(Point2 A[ ], Point2 B[ ], int n, float t)
{ // draw the tween at time t between polylines A and B
  for (int i = 0; i < n; i++)
  { Point2 P;
	 P = Tween (A[i], B[i], t);
	 if (i ==0) moveTo(P.x, P.y);
	 else lineTo(P.x, P.y);
   }
}

----------


## amin1softco

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

  // Tween between two figures; a la Fig. 4.22, p.171
        Point2 A[10];
        Point2 B[10];
        A[0].set(0.2, 0.5);
        A[1].set(0.5, 0.35);
        A[2].set(0.8, 0.5);
        A[3].set(0.5, 0.2);
        A[4].set(0.2, 0.5);
        
        B[0].set(0.2, 0.2);
        B[1].set(0.2, 0.8);
        B[2].set(0.8, 0.8);
        B[3].set(0.8, 0.2);
        B[4].set(0.2, 0.2);

دیگه بقیه کار ها رو خودش انجام میده البته اگر درست متوجه شده باشم.

----------


## saturn2200

ببخشید میشه بصورت برنامه از اول با #include ها و بقیه چیزایی که واسه اجرا نیازه   واسم بگذازید نمیدونم چطوری run کنم
اگه امکانش هست کمکم کنید.
خیلییییی مممنووووووون
هیچ جا opengl بلد نیستن .واقعا جای افتخار داره که یه فروم فعال اینجا دارین
بازم تشکر
اینجا دسور tween که اجراش مشکل نداره رو واستون گذاشتم


Point Tween(Point A, Point B, float t)
{
  Point P;
  P.x = A.x + (B.x - A.x)*t;
  P.y= A.y + (B.y - A.y)*t;
  return P;
}

من میخوام با استفاده از این اکد یه حرف الفبا رو به یه حرف دیگه تبدیل کنم.
مثلا تبدیل توی عکس پایین رو ببینید

کل مطلبی که من در این رابطه دارم از کتاب گرافیک کامپیوتری هست 
متن این قسمت رو هم واستون میذارم

Tweening and lerp
One often wants to compute the point P(t) that is fraction t of the way along the straight line from point A to point B [the tween (for in-between) at t of points A and B]. 
Each component of the resulting point is formed as the lerp() of the corresponding components of A and B. 
A procedure Tween (Point2 A, Point2 B, float t) implements tweening for points A and B, where we have used the new data type Point2 for a 2D point: 
	struct Point2
	{ float x; float y; };

Tweening takes 2 polylines and interpolates between them (using lerp) to make one turn into another (or vice versa).
We are finding here the point P(t) that is a fraction t of the way along the straight line (not drawn) from point A to point B.
To start, it is easiest if you use 2 polylines with the same number of lines.

We use polylines A and B, each with n points numbered 0, 1, …, n-1.
We form the points Pi (t) = (1-t)Ai + tBi, for t = 0.0, 0.1, …, 1.0 (or any other set of t in [0, 1]), and draw the polyline for Pi.


Code for Tween
void drawTween(Point2 A[ ], Point2 B[ ], int n, float t)
{ // draw the tween at time t between polylines A and B
  for (int i = 0; i < n; i++)
  { Point2 P;
	 P = Tween (A[i], B[i], t);
	 if (i ==0) moveTo(P.x, P.y);
	 else lineTo(P.x, P.y);
   }
}



To allow drawing tweens continuously, use the code below with double buffers.
for (t = 0.0, delT = 0.1; ; t += delT;) {
	//clear the buffer
	drawTween (A, B, n, t);
	glutSwapBuffers();
	if ((t<=0.0) || (t>=1.0)) delT = -delT;
}

----------


## amin1softco

من منظور شما رو در همون پست اول درست فهمیده بودم شما همون کار رو انجام بدید که گفتم نتیجه می گیرید
برای اجرا هم می تونید از این برنامه و آموزشش استفاده کنید http://s3.picofile.com/file/7394041826/dev.zip.html

----------


## majnoon110

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

----------


## saturn2200

> من منظور شما رو در همون پست اول درست فهمیده بودم شما همون کار رو انجام بدید که گفتم نتیجه می گیرید
> برای اجرا هم می تونید از این برنامه و آموزشش استفاده کنید http://s3.picofile.com/file/7394041826/dev.zip.html


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

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

----------


## amin1softco

خوب عزیزم اینکه خیلی واضحه  باید یک خطش رو حذف کنی این قطعه کد رو جایگزین کن جواب می گیری 

     Point2 A[10];
        Point2 B[10];
        A[0].set(0.2, 0.5);
        A[1].set(0.5, 0.35);
        A[2].set(0.8, 0.5);
        A[3].set(0.5, 0.2);
        A[4].set(0.2, 0.5);
        
        
        B[0].set(0.2, 0.2);
        B[1].set(0.2, 0.8);
        B[2].set(0.5, 0.8);
        B[3].set(0.5, 0.2);
        B[4].set(0.2, 0.2);
        float t = 0.0;
        int N = 10;   // Number of tweenings
        float tinc = 1.0/N;
        int vpsize = 640/(N+1);
        for (int i = 0; i <= N; i++)
      {
           // cvs.setViewport(i*vpsize,(i+1)*vpsize, (N/2)*vpsize, (N/2+1)*vpsize); اين خط حذف شده
           cvs.clearScreen(); // اين خط رو اگر حذف کنيد روي هم ترسيم مي شه
            cvs.drawTween(A, B, 5, t);
            t = t + tinc;
          }

N را هر چی بیشتر کنی انیمیشنش لطیف تره :دی

----------


## amin1softco

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


ببنید شما باید بین glbegin دو تا نقطه مشخص کنید و پارامتر هاش رو از کاربر در یافت کنید.
https://barnamenevis.org/showthread.p...82#post1429482

----------


## saturn2200

> خوب عزیزم اینکه خیلی واضحه  باید یک خطش رو حذف کنی این قطعه کد رو جایگزین کن جواب می گیری 
> 
>      Point2 A[10];
>         Point2 B[10];
>         A[0].set(0.2, 0.5);
>         A[1].set(0.5, 0.35);
>         A[2].set(0.8, 0.5);
>         A[3].set(0.5, 0.2);
>         A[4].set(0.2, 0.5);
> ...


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

----------


## amin1softco

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

  glBegin (GL_LINES);
        glVertex2f((GLfloat) CP.getX(), (GLfloat) CP.getY());
        glVertex2f((GLfloat) p.getX(), (GLfloat) p.getY());
    glEnd();

اینم که معلومه بین نقاط خط ترسیم می کنه که در این حالت به نظر من استفاده از روش های رسم قدیمی دایره مثل نقطه میانی است که شما باید با اون الگوریتم نقطه یابی کنید و نقاط رو به ماتریس اضافه کنید 

 Point2 A[10];
        Point2 B[10];

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

----------


## amin1softco

نه دوست عزیز پروژه دانشجویی انجام نمی دیم ولی بازم باری اینکه متوجه بشی چی به چیه به این قطعه کد را جایگزین کن و نتیجه رو مشاهده کن 

// Tween between two figures; a la Fig. 4.22, p.171
        Point2 A[10];
        Point2 B[10];
       A[0].set(0.2, 0.2);
       A[1].set(0.2, 0.5);
       A[2].set(0.3, 0.5);
       A[3].set(0.3, 0.3);
       A[4].set(0.4, 0.3);
       A[5].set(0.4, 0.5);
       A[6].set(0.5, 0.5);
       A[7].set(0.5, 0.2);
       A[8].set(0.2, 0.2);
    
        
        
        
        B[0].set(0.2, 0.2);
        B[1].set(0.2, 0.4);
        B[2].set(0.2, 0.8);
        B[3].set(0.25, 0.8);
        B[4].set(0.5, 0.8);
        B[5].set(0.5, 0.4);
        B[6].set(0.5, 0.2);
        B[7].set(0.25, 0.2);
        B[8].set(0.2, 0.2);
        float t = 0.0;
        int N = 50;   // Number of tweenings
        float tinc = 1.0/N;
        int vpsize = 640/(N+1);
        for (int i = 0; i <= N; i++)
      {
           //cvs.setViewport(i*vpsize,(i+1)*vpsize, (N/2)*vpsize, (N/2+1)*vpsize);
           cvs.clearScreen();
            cvs.drawTween(A, B, 9, t);
            t = t + tinc;
          }

منم کاملاً تفریحی اپن جی ال کار می کنم ...

----------


## poniosa

سلام
مطالب open gl که گذاشتی مفیده فایده واقع شد 
یه سوال:
من تمام مراحل اجرای برنامه opengl با C++‎ , C#‎ رو به طور دقیق انجام  دادم و وقتی که یه کد نمونه (تست شده در جای دیگه) رو هم اجرا می کنم هیچ خطایی نمیده ولی توی فرم  هم چیزی نمیکشه به نظر شما مشکل کار من کجاست؟ :گریه:

----------


## amin1softco

سلام ما در مورد اجرای برنامه در سی شارپ فقط چندتا فرم ورک برای پیاده سازی معرفی کردیم نه بیشتر !! ولی ممکنه مشکل شما اینجا باشه که در سیستم های 64 بیتی باید glut32.dll را در پوشه syswow64 کپی کنید.
به هر حال این فیلم آموزشی می تونه کمکتون کنه http://s3.picofile.com/file/7400251284/glut.zip.html

----------


## poniosa

با سپاس و تشکر فراوان از amin عزیز  :قلب: 
من تمام پیش نیاز ها رو انجام دادم  و  موقع اجرا هیچ خطایی نمیگیرم ، پنجره کنسول C باز میشه و بعدش هم پنجره open gl ولی داخل open gl شکل رو ترسیم نمیکنه و این فرم کلا به صورت ترنسپارنت هست و وقتی که سایزشو تغییر میدم مشکی میشه، از صفحه نمایشم عکس گرفتم تا بیشتر در جریان قرار بگیری، خودم احتمال میدم تنظیمات گرافیکی سیستمم باشه و تمام سوراخ سمبه های win7 رو کاوش کردم ولی بی فایده، اگه راه حلی به نظرت میرسه بگی ممنون میشم.

بازم ممنون به خاطر فیلمی که گذاشتی و اینکه همیشه در دسترس و به فکر هستی ... :بوس: 

http://up98.org/upload/server1/02/j/...u439mvwc5b.png

----------


## amin1softco

این مشکل دلایل متعددی داره که خیلی هاش مربوط به تنظیمات اشتباه توابع اولیه و گاهی هم مربوط تداخل گرافیک gdi ویندوز با wgl می شه که فکر نکنم ربطی به ما داشته باشه در آخر می رسیم به یک  باگ glut که اگر این باگ باشه با یک بافر مشکل دارید و باید با دو بافر تست کنید ببنید کد زیر درست کار میده یا نه :

//lines.cpp
//---------
//Draw lines with OpenGL + GLUT
//Compiler DevC++‎‎‎ 4.9.9.2 + GLUT3.7 (Win32)
#pragma comment(lib,"opengl32.lib")
#pragma comment(lib,"glu32.lib")
#pragma comment(lib,"glut32.lib")
#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();
glutSwapBuffers();
glFlush(); //process all OGL functions immediately
}
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 - lines"); //now create display win
init(); //run initilization procs
glutDisplayFunc(lineSegments); //call drawing func
glutMainLoop(); //display all and wait
return 0;
}

----------


## poniosa

نه متاسفانه  :ناراحت:

----------


## saturn2200

> نه دوست عزیز پروژه دانشجویی انجام نمی دیم ولی بازم باری اینکه متوجه بشی چی به چیه به این قطعه کد را جایگزین کن و نتیجه رو مشاهده کن 
> 
> // Tween between two figures; a la Fig. 4.22, p.171
>         Point2 A[10];
>         Point2 B[10];
>        A[0].set(0.2, 0.2);
>        A[1].set(0.2, 0.5);
>        A[2].set(0.3, 0.5);
>        A[3].set(0.3, 0.3);
> ...



آقا ایول واقعا نمیدونم چطوری تشکر کنم
خوب اینطوری بهتر شد تازه یاد گرفتم چطوری شکل رو عوض کنم
مرسیییییییییییییییییییییی  ییییییییییییییییییییییییی  ییییییییییییییییییییییییی  ییییییییییییییییییی :لبخند گشاده!: 
داشتم از زندگی نا امید میشدما
هنوزم آدمای با گذشت و باحالی تو این دنیا هست :تشویق: 
من اولش فکر میکردم که مثلا A[0].set(0.2, 0.2) یه خط رسم میکنه بین دو تا نقطه به این مختصات حالا فهمیدم که نه آقا اینا همش نقطه بوده که در آخر به هم وصل شده  حالا دیگه هر شکلی رو میتونم بکشم  :لبخند گشاده!:

----------


## amin1softco

> نه متاسفانه


 می تونی نتیجه دستور زیر را بهم بگی :

#include <iostream>
using namespace std;
.
.
.
cout << "OpenGL Version : " << glGetString(GL_VERSION) << endl; 
glutMainLoop(); //display all and wait
.
.

اگر ورژن openGL کارت گرافیکت بیشتر از 3 باشه فکر نکنم راهی داشته باشه باید باید یکجور دیگه کد بنویسیم :دیییییی

----------


## poniosa

سلام من پنجره open gl رو به حالت FULLScreen  بردم و مشکلم حل شد، فقط تو این حالت شکل رو ترسیم میکنه
بازم تشکر :قلب:

----------


## pswin.pooya

@*poniosa*:

اگر از glut استفاده ميكني تابع idle رو ثبت نكردي يا اينكه بافر رو تعويض نمي كني.




> اگر ورژن openGL کارت گرافیکت بیشتر از 3 باشه فکر نکنم راهی داشته باشه باید باید یکجور دیگه کد بنویسیم :دیییییی


چه ربطي داره. مال من 4.2 هست راحت دارم با ورژن 1.2 كار ميكنم.

----------


## amin1softco

> @*poniosa*:
> 
> اگر از glut استفاده ميكني تابع idle رو ثبت نكردي يا اينكه بافر رو تعويض نمي كني.
> 
> 
> چه ربطي داره. مال من 4.2 هست راحت دارم با ورژن 1.2 كار ميكنم.


والا من بیشتر از 3 رو خودم تست نکردم فقط روی حساب پستی که خود شما یکبار زده بودی این رو گفتم!!!




> *OpenGL و آینده:*
> به طور کل میشه گفتش که ما در آینده شاهد حذف بسیاری از دستورهای پیشین  OpenGL خواهیم بود. (یا حداقل از کار افتادن اونها) که توی OpenGL 3.x به  راحتی مشاهده میشد که یکی از پرکاربردترین دستورها یعنی glBegin کار نمی  کرد. (مگر با فراهم کردن شرایط خاص و غیر استاندارد) اما حالا OpenGL تمام  تمرکز خودش رو گذاشته روی دستورها و الحاقی هایی که باعث ارتباط بهتر و  کاملتر با قسمت های قابل برنامه ریزی gpu هستش.


 به هر حال آخرش بر می گرده به همون باگی که لینکش رو دادم. موفق باشید!!!

----------


## pswin.pooya

خب درسته كه دستورها حذف شدن. اما هنوز از دستورهاي پيشين پشتيباني ميشن. توي ويرايشهاي جديد OpenGL شما مي تونيد ويرايشي رو كه مي خواهيد استفاده كنيد رو مشخص كنيد. اينكار با مشخص كردن عدد minor و major ويرايش در هنگام ساخته شدن محتوا انجام مي گيره و يه كار اتوماتيك نيست كه خودش اون رو انجام بده. حالا بسته به ويرايشي كه انتخاب مي كنيد قابليتهاي قبلي رو حذف و قابليتهاي جديد رو اضافه ميكنه. 

حتي تعداد از دستورهاي حذف شده هنوز هم توي ويرايشهاي جديد قابل استفاده هستند. اما استفاده از اونها پيشنهاد نميشه و پشتيباني از اونها به شدت به ويرايش درايور بستگي داره. مثلا VBO توي داريورهاي قديمي OpenGL 3 جواب ميداد اما توي ويرايشهاي جديد ديگه امكانش نيست. بهترين راه چك كردن پرفرمانس برنامه اينجور موارد استفاده از برنامه gDEBUGer هست. كه تمام اين موارد رو بهتون گزارش ميكه. خود من هم از طريق اين برنامه متوجه قضيه VBO شدم. 

مورد ديگه در مورد GLUT هست كه glut به كمك glew (يا لود كردن دستي الحاقيها) ماكزيمم تا OpenGL 2.1 ساپورت ميده و براي وياريشهاي حداقل بالاتر بايد بريد سراغ SDL و يا اينكه از API خود سيستم عامل كمك بگيريد.

من هنوز هم حرفهاي خودم رو تاييد ميكنم. اين اتفاق مرتبا داره مي افته. در حقيقت ويرايشهاي جديد OpenGL سراغ نو آوري و ارتباط موثر هستند نه يك راه ساده براي كار. API  به شدت و به سرعت داره تغيير ميكنه. در حقيقت الان هر دو تا API دايركت و OpenGL مثل هم عمل مي كنند و شما خيلي راحت امكان سوئيچ بين اونها رو داريد (برخلاف گذشته) و موارد خيلي كمي رو پيدا مي كنيد كه در اونها اختلاف داشته باشند. بيشترين دليل اين قضيه هم اينه كه OpenGL توي سالهاي اخير  با معرفي سيستم ها و پلتفرمهاي جديد بشدت تجاري شده و برخلاف گذشته، حالا مثل دايركت بيشتر توجهش بجاي اينكه روي مسائل بنيادي گرافيك باشه روي نيازهاي بازار است.

----------


## amin1softco

دمت گرم پسر خیلی باحالی  :چشمک:  
ولی خوب قسمت اولش رو نمی دونستم ...

----------


## soroushp

در مورد 3 تابع زیر توضیحی مختصر می خواستم یک مقدار روی تعریفه خودم شک دارم :

glEnable(GL_DEPTH_TEST)
glFrontFace(GL_CCW)
glEnable(GL_CULL_FACE)

تعریف خودم به ترتیب : اجسام پشت شی مورد نظر دیده نشود - برای تشخیص رو و پشت بودن جسم کاربرد دارد - تو و داخل جسم را حساب نکن
سوال دوم اینه که صدا گذاری در opengl با استفاده از fmod هست ؛ غیر از fmod هم داریم اسمش چی بود ؟

----------


## pswin.pooya

> اجسام پشت شی مورد نظر دیده نشود


کاملا اشتباه. درسته یکی از کاربردهای بافر عمق (یعنی بیشترین کاربردش اینه) اما کلا برداشتت اشتباه هست. پیشنهاد میکنم یه کتاب OpenGL بخون




> برای تشخیص رو و پشت بودن جسم کاربرد دارد - تو و داخل جسم را حساب نکن


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

کلا OpenGL و گرافیک کامپیوتری سختر از این هست که بخوای با استباط خودت (برخلاق زبونهای C#‎ و Visual basic و...) جلو بری. قبل از هر چیز باید و اما باید یه دید دقیق ریاضی و تئوری نسبت به این مسائل داشته باشی. وگرنه همش درجا میزنی. کتابهای زیادی برای معرفی دقیق OpenGL وگرافیک کامپیوتری وجود داره و من بشدت پیشنهاد می کنم اونها رو مطالعه کنی. یکسری از اونها رو میتونی توی لینک زیر پیدا کنی:

http://opengl.persiangig.com/page.html




> سوال دوم اینه که صدا گذاری در opengl با استفاده از fmod هست


این موضوع اصلا ربطی به OpenGL نداره.




> ؛ غیر از fmod هم داریم اسمش چی بود


API سیستم عاملBassّOpenAL...

----------


## mehdi64org

سلام
دوستان من تازه کارم. اگه سوالام ابتدایی بود ببخشید :بامزه: 

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

امیدوارم خوب توضیح داده باشم
با تشکر فراوان :لبخند:

----------


## pswin.pooya

> اول اینکه وقتی روتیت میکنم به نظرم خود شکل نمیچرخه بلکه دوربین داره  میچرخه ، چون مثلا شدت نور اگر گوشه بالا سمت راست زیاده ، وقتی که میچرخه  شدت نور مثلا میاد پایین سمت راست شکل ،درحالی که منبع باید همون بالا باشه  و شکل بچرخه!


توي OpenGL با glRotate منابع نور هم ميچرخن. بايد از push و pop استفاده كني و هر شكل رو به صورت مجزا بچرخوني. 




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


خب. اين سه تا رنگ (diffuse و ambient و specular) رو بترتيب به سفيد و خاكستري تيره و سفيد ست كن. و يا مي توني براي اينكه اجسام از رنگ خودشون به عنوان متريال استفاده كنند از دستور زير توي مقدار دهي اوليه برنامت استفاده كني:

    glEnable(GL_COLOR_MATERIAL);

لينك زير يه مقاله خيلي خوب در مورد نورها در OpenGL هست كه ميتونه بهت كمك زيادي بكنه:

http://www.falloutsoftware.com/tutorials/gl/gl8.htm

----------


## majnoon110

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

آیا نیاز هست که کد هایی که نوشتم رو اینجا بیارم؟
خواهش میکنم راهنمایی کنید خیلی کارم گیره... من خیلی چیزا در این تاپیک یاد گرفتم
ازتون ممنونم

----------


## pswin.pooya

> گاهی هم مثلا نصفه نیمه رسمش میکنه...


به احتما 90% مربوط به بافر عمق هست. با غير فعال كردنش ميتوني كارهاتو انجام بدي.




> این رو هم بگم من برای کشیدن دایره و مربع از نقطه استفاده میکنم ( و از  توابع خود اوپن جی ال استفاده نمیکنم، مثلا برای مربع توپر از تعدادی خط  موازی استفاده میکنم)


پيشنهاد ميكنم از معادل OpenGL استفاده كن. چون سرعتش خيلي خيلي بيشتر هست. تقريبا كندترين چيزي كه OpenGL ميكشه خط هست و تندترين اونها مثلث

----------


## majnoon110

راستش این پروژه رو برای خودم میخواستم انجام بدم
درس اوپن جی ال هست
منظورت از بافر عمق چیه؟ چطوری باید غیر فعالش کنم؟ مشکلی پیش نمیاد؟
ممنونم بابت راهنماییت دوست بزرگوار

----------


## pswin.pooya

> منظورت از بافر عمق چیه؟ چطوری باید غیر فعالش کنم؟ مشکلی پیش نمیاد؟


توي بافر فريم چندتا بافر وجود داره كه از جمله اونها ميشه به بافر رنگ ( هموني كه رنگ فرگمنتها رو نگه ميداره). بافر عمق، استنثيل ، تجمع و ... اشاره كرد. 

بافر عمق داخل صحنه هاي سه بعدي مقدار عمق هر فرگمنت رو نگه ميداره و بطور پيش فرض بررسي ميكنه كه ببينه فرگمنت جديد كه قرار روي فرگمنت قبلي بشينه داراي عمق كمتري نسبت به اون هست يا نه. اگر فرگمنت جديد عمق كمتر داشته باشه (به دوربين نزديكتر باشه) جايگزين فرگمنت قبلي ميشه و در غير اينصورت ناديده گرفته ميشه. اين بافر براي صحنه هاي سه بعدي ضروري هست اما دليل خاصي براي وجود اون داخل صحنه هاي دو بعدي نيست. 

براي اينكه بافر عمق رو كنار بذاري بايد زمان ايجاد محتوا‌ (پنجره) توي گزينه هاي مرتبط با اون حذف يا صفر كني. مثلا اگر از GLUT داري استفاده ميكني. زمان ست كردن مد نمايش بايد گزينه GLUT_DEPTH رو ننويسي:

glutInitDisplayMode( GLUT_RGBA | GLUT_DOUBLE  );

و از دستور زير هم استفاده كني (بعد از ايجاد محتوا):

glDisable(GL_DEPTH_TEST_)

دستور glDisable براي غير فعال كردن ويژگي هاي OpenGL استفاده ميشه. كه توي اين مورد به OpenGL ميگيم تست عمق رو غير فعال كنه. اين شكلي اگر بافر عمقي هم وجود داشته باشي ديگه هيچ تستي براي عمق فرگمنت انجام نمي گيره.

يه كتاب فارسي توي لينك زير وجود داره كه مي تونيد از اون براي يادگيري استفاده كنيد. خيلي از مشكلاتون اين شكلي سريعتر حل ميشه:
opengl.persiangig.com

----------


## majnoon110

دستت درد نکنه آقا
ظاهرا مشکل حل شد، واقعا ممنونم

اما یک مشکل دیگه هم دارم که امیدوارم بازم کمکم کنید
کتاب فارسی رو هم خوندم سریع اما راه حلی برای این نگفته بود مثل اینکه
من میخوام از تابعی مثل  ( delay ) در visual ++c استفاده کنم
اما همچین تابعی نداره... برای ایجاد انیمیشن میخوام. و تاخیر در اجرای کد ها
تابعی برای این کار هست؟
ممنون میشم اگر کمکم کنید چون واقعا خیلی کارم گیر هست... در ضمن از push و pop ماتریکس هم نمیخوام استفاده کنم و با حلقه ی for میخوام انیمیشن بسازم
خیلی خیلی متشکرم، مخصوصا از توضیحات کامل و راهنمایی خوبتون دوست عزیز

----------


## pswin.pooya

> اما همچین تابعی نداره... برای ایجاد انیمیشن میخوام. و تاخیر در اجرای کد ها
> تابعی برای این کار هست؟


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

----------


## majnoon110

سلام مجدد
با تشکر مجدد از شما دوست بزرگوار بابت راهنمایی هاتون
آقا من با فایل سرآیند windows.h مشکل پیدا کردم
از C++‎ 2008  استفاده میکنم، چند تا فایل سرآیند رو داخل پروژه فرخوانی کردم مثل math,stsafx,conio.stdio,gl\glut
اما وقتی windows.h رو اضافه میکنم و برنامه رو اجرا میکنم، پنجره باز میشه اما داخلش هیچی نمایش داده نمیشه و نشانگر ماوس به شکل ساعت شنی در میاد!
یعنی داره سعی میکنه برنامه رو اجرا کنه اما نمیتونه!
واقعا از شما با مدیریت خوبتون تشکر میکنم.. همچنین از دوستان دیگه

----------


## pswin.pooya

> با تشکر مجدد از شما دوست بزرگوار بابت راهنمایی هاتون


خيلي ممنون




> از C++‎‎ 2008  استفاده میکنم، چند تا فایل سرآیند رو داخل پروژه فرخوانی کردم مثل math,stsafx,conio.stdio,gl\glut
> اما وقتی windows.h رو اضافه میکنم و برنامه رو اجرا میکنم، پنجره باز میشه  اما داخلش هیچی نمایش داده نمیشه و نشانگر ماوس به شکل ساعت شنی در میاد!


واقعا نمي دونم مشكل از چي ميتونه باشه. اما بعيد مي دونم از سرآيند windows.h باشه. شايد ميزان sleep رو زياد داديد.

----------


## saturn2200

salam be hameye soale kheyli sade daram :لبخند گشاده!: 
man ye barname neveshtam
hich errori ham nemide
ejra ham mishe
ama khoroji ha ro neshoon nemide
doostan age mishe lotf konid bebinid moshkelesh kojaaast :قلب: 

#include<GL/glut.h>
#include<math.h>
#include<iostream>
#include <stdlib.h>
using namespace std;
  
  

class Point2
{
public:
    Point2() {x = y = 0.0f;} 
    Point2(float xx, float yy) {x=xx; y=yy;} 
    void set(float xx, float yy) {x=xx; y=yy;}
    float getX() {return x;}
    float getY() {return y;}
    void draw(void)
    {
        glBegin(GL_POINTS); 
        glVertex2f((GLfloat)x, (GLfloat)y);
        glEnd();
    }
private:
    float x, y;
};

Point2 CP;

void moveTo(float x, float y)
{
    CP.set(x, y);
}

void clearScreen(void)
{
    glClear(GL_COLOR_BUFFER_BIT);
}
  
void setBackgroundColor(float r, float g, float b)
{
    glClearColor(r, g, b, 0.0);   
}
  
void setColor(float r, float g, float b)
{
    glColor3f(r, g, b);
}
  
void lineTo(Point2 p)
{
    glBegin (GL_LINES);
        glVertex2f((GLfloat) CP.getX(), (GLfloat) CP.getY());
        glVertex2f((GLfloat) p.getX(), (GLfloat) p.getY());
    glEnd();
    CP.set(p.getX(), p.getY());
    glFlush();
}
  


void lineTo(float x, float y)
{
    glBegin(GL_LINES);
        glVertex2f((GLfloat) CP.getX(), (GLfloat) CP.getY());
        glVertex2f((GLfloat) x, (GLfloat) y); 
    glEnd();
    CP.set (x, y);
    glFlush();
}
  
Point2 Tween(Point2 A, Point2 B, float t)
{
  Point2 P;
  P.set(A.getX() + (B.getX() - A.getX())*t, A.getY() + (B.getY() - A.getY())*t);
  return P;
}
  
void drawTween(Point2 A[], Point2 B[], int N, float t)
{
  for(int i = 0; i < N; i++)
    {
      Point2 P;
      P = Tween(A[i], B[i], t);
      if (i == 0) moveTo(P.getX(), P.getY());
      else  lineTo(P.getX(), P.getY());
    }
}
 
 
void myDisplay(void)
{
  glClear(GL_COLOR_BUFFER_BIT);
	glColor3f(0.0, 0.0, 1.0); 

  clearScreen();
            Point2 A[10];
        Point2 B[10];
        A[0].set(0.2, 0.5);
        A[1].set(0.5, 0.35);
        A[2].set(0.8, 0.5);
        A[3].set(0.5, 0.2);
        A[4].set(0.2, 0.5);
        
        
        B[0].set(0.2, 0.2);
        B[1].set(0.2, 0.8);
        B[2].set(0.5, 0.8);
        B[3].set(0.5, 0.2);
        B[4].set(0.2, 0.2);
        float t = 0.0;
        int N = 10;   
        float tinc = 1.0/N;
        int vpsize = 640/(N+1);
        for (int i = 0; i <= N; i++)
      {
  
            drawTween(A, B, 5, t);
            t = t + tinc;
          }
}


void init(void)
{
glClearColor(1.0,1.0,1.0,0.0);
glMatrixMode(GL_PROJECTION); 
gluOrtho2D(0.0,200.0,0.0,150.0);
}
int main(int argc, char **argv)
{
    setBackgroundColor(1.0, 1.0, 1.0);
    setColor(0.0, 0.0, 0.0);
     

	glutInit(&argc, argv); 
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowPosition(50, 100); 
glutInitWindowSize(400, 300); 
glutCreateWindow("Example01 - lines");
init(); 



    
    glutDisplayFunc(myDisplay);
    glutMainLoop();
     
        return 0;
}

----------


## amin1softco

دوست عزیز
 این خط رو پاک کن //gluOrtho2D(0.0,200.0,0.0,150.0); 
قبلاً توضیحاتش رو پویا داده من دیگه شرح نمی دم.

----------


## saturn2200

salaaaaaaaaaaaaaaaaaam
ejra gereftam
ye soal dige daram chetori mishe ye mokhtasate dorost be in noghat dad
man mikham harfe masalan harfe noon(ن) be hafe lam(ل)tabdil beshe
mokhtasate A[] male harfe noon va araye B[] male harfe lam hast
age kasi mitone mokhtasatesho dorost kone tanxxxxxxxxxxxxxxxxx

//
// ****************************************
#include <Windows.h>
// ****************************************
#include <GL/glut.h>
#include<iostream>

using namespace std;



//class Point2
//{
//public:
//    Point2() {x = y = 0.0f;} 
//	Point2(float xx, float yy,float zz) {x=xx; y=yy;z=zz;} 
//    void set(float xx, float yy,float zz) {x=xx; y=yy;z=zz;}
//    float getX() {return x;}
//    float getY() {return y;}
//	float getZ() {return z;}
//    void draw(void)
//    {
//        glBegin(GL_POINTS); 
//        glVertex3f((GLfloat)x, (GLfloat)y,(GLfloat)z);
//        glEnd();
//    }
//private:
//    float x, y,z;
//};


struct Point2{float x;float y;}P;

Point2 CP;

void moveTo(float x, float y)
{
CP.x=x;
CP.y=y;
}

void clearScreen(void)
{
    glClear(GL_COLOR_BUFFER_BIT);
}
 



void lineTo(float x, float y)
{
    glBegin(GL_LINES);
	glVertex2f(CP.x, CP.y);
    glVertex2f(x,y); 
    glEnd();
    CP.x=x;
	CP.y=y;
    glFlush();
}
  
Point2 Tween(Point2 A, Point2 B, float t)
{
  Point2 P;
  
 
  P.x=(A.x+(B.x-A.x)*t);
  P.y=(A.y+(B.y+A.y)*t);
  return P;
}
  
void drawTween(Point2 A[], Point2 B[], int N, float t)
{
  for(int i = 0; i < N; i++)
    {
      Point2 P;
      P = Tween(A[i], B[i], t);
	  if (i == 0) moveTo(P.x, P.y);
	  else  lineTo(P.x, P.y);
	  
    }
  // ****************************************
  clearScreen();
  Sleep(200);
  // ****************************************
}
 


void SetArg(float x, float y,Point2 z){
		z.x=x;
		z.y=y;

}
 
void myDisplay(void)
{
  glClear(GL_COLOR_BUFFER_BIT);
	glColor3f(1.0, 1.0, 0.0); 
	


  clearScreen();           
  
  Point2 A[20];
  Point2 B[20];


 /* SetArg(0.4,0.4,A[0]);
  SetArg(0.5,0.3,A[1]);
  SetArg(0.6,0.3,A[2]);
  SetArg(0.7,0.4,A[3]);
  SetArg(0.8,0.5,A[4]);
  SetArg(0.8,0.6,A[5]);
  SetArg(0.8,0.9,A[6]);
  SetArg(0.7,0.9,A[7]);
  SetArg(0.7,0.5,A[8]);
  SetArg(0.6,0.4,A[9]);
  SetArg(0.5,0.4,A[10]);
  SetArg(0.4,0.5,A[11]);
  SetArg(0.4,0.4,A[12]);
  */
  A[0].x=0.4;
  A[0].y=0.4;
  A[1].x=0.5;
  A[1].y=0.3;
  A[2].x=0.6;
  A[2].y=0.3;
  A[3].x=0.7;
  A[3].y=0.4;
  A[4].x=0.8;
  A[4].y=0.5;
  A[5].x=0.8;
  A[5].y=0.6;
  A[6].x=0.8;
  A[6].y=0.9;
  A[7].x=0.7;
  A[7].y=0.9;
  A[8].x=0.7;
  A[8].y=0.5;
  A[9].x=0.6;
  A[9].y=0.4;
  A[10].x=0.5;
  A[10].y=0.4;
  A[11].x=0.4;
  A[11].y=0.5;
  A[12].x=0.4;
  A[12].y=0.4;
  

  /*
  SetArg(0.1,0.6,B[0]);
  SetArg(0.1,0.3,B[1]);
  SetArg(0.2,0.2,B[2]);
  SetArg(0.3,0.2,B[3]);
  SetArg(0.4,0.2,B[4]);
  SetArg(0.5,0.3,B[5]);
  SetArg(0.5,0.6,B[6]);
  SetArg(0.4,0.6,B[7]);
  SetArg(0.4,0.4,B[8]);
  SetArg(0.3,0.3,B[9]);
  SetArg(0.2,0.4,B[10]);
  SetArg(0.2,0.6,B[11]);
  SetArg(0.1,0.6,B[12]);
  */


  B[0].x=0.1;
  B[0].y=0.6;
  B[1].x=0.1;
  B[1].y=0.3;
  B[2].x=0.2;
  B[2].y=0.2;
  B[3].x=0.3;
  B[3].y=0.2;
  B[4].x=0.4;
  B[4].y=0.2;
  B[5].x=0.5;
  B[5].y=0.4;
  B[6].x=0.5;
  B[6].y=0.6;
  B[7].x=0.4;
  B[7].y=0.6;
  B[8].x=0.4;
  B[8].y=0.4;
  B[9].x=0.3;
  B[9].y=0.3;
  B[10].x=0.2;
  B[10].y=0.4;
  B[11].x=0.2;
  B[11].y=0.6;
  B[12].x=0.1;
  B[12].y=0.6;
  













		float t = 0.0;
        int N = 10;   
        float tinc = 1.0/N;
       for (int i = 0; i <= N; i++)
      {
  
            drawTween(A, B, 5, t);
            t = t + tinc;
          }
}


int main(int argc, char **argv)
{
	
	glutInit(&argc, argv); 
	glClearColor(1.0, 1.0, 1.0, 0.0);
    glColor3f(0.0, 0.0, 0.0);
     

glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowPosition(0, 0); 
glutInitWindowSize(800, 800); 

glutCreateWindow("nike");
glShadeModel(GL_FLAT);
glutDisplayFunc(myDisplay);
    glutMainLoop();
     
        return 0;
}

----------


## saturn2200

> دوست عزیز
>  این خط رو پاک کن //gluOrtho2D(0.0,200.0,0.0,150.0); 
> قبلاً توضیحاتش رو پویا داده من دیگه شرح نمی دم.


mersiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii  iiiii hal shod :قلب:

----------


## saturn2200

ye soal daram man nazdike 30 ta noghte dadam k rasm beshe ama rasm nemishe ki midone moshkel chie lotfan komakam konid
A[0].set(0.1, 0.3);
        A[1].set(0.1, 0.6);
        A[2].set(0.2, 0.6);
        A[3].set(0.2, 0.3);
        A[4].set(0.4, 0.2);
		
        A[5].set(0.6, 0.3);
        A[6].set(0.6, 0.6);
        A[7].set(0.9, 0.6);
        A[8].set(0.9, 0.8);
        A[9].set(1.0, 0.8);
        
        A[10].set(1.0, 0.7);
        A[11].set(1.1, 0.7);
        A[12].set(1.1, 0.8);
        A[13].set(1.2, 0.8);
        A[14].set(1.2, 0.7);
        
        A[15].set(1.3, 0.7);
        A[16].set(1.3, 0.8);
        A[17].set(1.4, 0.8);
        A[18].set(1.4, 0.6);
        A[19].set(1.9, 0.6);
        
        A[20].set(1.9, 0.8);
        A[21].set(1.7, 0.8);
        A[22].set(1.7, 0.7);
        A[23].set(1.6, 0.7);
        A[24].set(1.6, 0.9);
		A[25].set(2.0, 0.9);
        A[26].set(2.0, 0.5);
        A[27].set(2.4, 0.5);
        A[28].set(2.4, 0.3);
        A[29].set(2.2, 0.3);

		A[30].set(2.2, 0.3);
        A[31].set(0.7, 0.4);
        A[32].set(0.7, 0.3);
        A[33].set(0.5, 0.1);
        A[34].set(0.3, 0.1);

----------


## amin1softco

عزیزم تو می دونی چقدر پیامبران و اندیشمندان به اهمیت تفکر تأکید کردند چرا گوش نمی دی آخه :دییییی
ما گفتیم نقطه یابیه نه دیگه همش ببنید شما وقتی تابع رو فراخوانی می کنید با این پارامتر ها drawTween(A, B, *12*, t);  پارامتر اول نقاط شکل اول رو مشخص می کنه پارمتر دوم نقاط شکل دوم و پارامتر سوم اینجا 12 *تعداد نقاط* را مشخص می کنه و t هم زمان انیمیشن رو تنظیم می کنه شما 30 تا نقطه داری باید پارامتر سوم رو 30 بدی و برای هر دو شکل 30 نقطه مشخص کنی .
برای برنامه اول یک ترانسلیت بنویسی تمام شکل رو در صفحه نشون میده...

void myDisplay(void)
{
  glClear(GL_COLOR_BUFFER_BIT);
    glColor3f(1.0, 1.0, 0.0);
     
 glTranslatef  ( -0.5 , -1.5 , -0.2 ) ;
 
.
.
.

----------


## mehdi64org

> توي OpenGL با glRotate منابع نور هم ميچرخن. بايد از push و pop استفاده كني و هر شكل رو به صورت مجزا بچرخوني. 
> 
> خب. اين سه تا رنگ (diffuse و ambient و specular) رو بترتيب به سفيد و خاكستري تيره و سفيد ست كن. و يا مي توني براي اينكه اجسام از رنگ خودشون به عنوان متريال استفاده كنند از دستور زير توي مقدار دهي اوليه برنامت استفاده كني:
> 
>  glEnable(GL_COLOR_MATERIAL);
> 
> لينك زير يه مقاله خيلي خوب در مورد نورها در OpenGL هست كه ميتونه بهت كمك زيادي بكنه:
> 
> http://www.falloutsoftware.com/tutorials/gl/gl8.htm


اول تشکر
بعد هم اینکه تونستم با راهنمایی شما نورو بندازم بدون اینکه رنگ اصلی از بین بره

ولی در رابطه با push و pop مشکل دارم . آخه من 1 مکعب با شش تا فرمان polygon درست کردم. میشه یه مقدار بیشتر راهنمایی کنی. این تیکه رسم معکبمه:
void display(){
 glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
 glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glPolygonMode(GL_BACK, GL_FILL);
glEnable(GL_DEPTH_TEST);
Rotatedecide();
 
 glBegin(GL_POLYGON);
  glColor3f(0.2,0.0,0.0);
  glVertex3f(-0.3,-0.3,-0.3);
  glVertex3f(0.3,-0.3,-0.3);
  glVertex3f(0.3,0.3,-0.3);
  glVertex3f(-0.3,0.3,-0.3);
 glEnd();
 glBegin(GL_POLYGON);
  glColor3f(0.8,0.1,0.1);
  glVertex3f(-0.3,-0.3,-0.3);
  glVertex3f(-0.3,-0.3,0.3);
  glVertex3f(-0.3,0.3,0.3);
  glVertex3f(-0.3,0.3,-0.3);
 glEnd();
 glBegin(GL_POLYGON);
  glColor3f(2.0,1.0,0.7);
  glVertex3f(-0.3,-0.3,-0.3);
  glVertex3f(-0.3,-0.3,0.3);
  glVertex3f(0.3,-0.3,0.3);
  glVertex3f(0.3,-0.3,-0.3);
 glEnd();
  glBegin(GL_POLYGON);
  glColor3f(0.0,0.0,2.0);
  glVertex3f(0.3,-0.3,-0.3);
  glVertex3f(0.3,-0.3,0.3);
  glVertex3f(0.3,0.3,0.3);
  glVertex3f(0.3,0.3,-0.3);
 glEnd();
 glBegin(GL_POLYGON);
  glColor3f(2.0,0.0,0.0);
  glVertex3f(-0.3,0.3,-0.3);
  glVertex3f(-0.3,0.3,0.3);
  glVertex3f(0.3,0.3,0.3);
  glVertex3f(0.3,0.3,-0.3);
 glEnd();
 glBegin(GL_POLYGON);
  glColor3f(1.0,1.0,0.89);
  glVertex3f(-0.3,-0.3,0.3);
  glVertex3f(0.3,-0.3,0.3);
  glVertex3f(0.3,0.3,0.3);
  glVertex3f(-0.3,0.3,0.3);
 glEnd();
 
 
  glFlush();
 
 
}


راستی اگه لطف کنی 1 سایتم در رابطه با بافتها معرفی کنی خیلی عالی میشه

بازم ممنون از محبتتون

----------


## saturn2200

> عزیزم تو می دونی چقدر پیامبران و اندیشمندان به اهمیت تفکر تأکید کردند چرا گوش نمی دی آخه :دییییی
> ما گفتیم نقطه یابیه نه دیگه همش ببنید شما وقتی تابع رو فراخوانی می کنید با این پارامتر ها drawTween(A, B, *12*, t);  پارامتر اول نقاط شکل اول رو مشخص می کنه پارمتر دوم نقاط شکل دوم و پارامتر سوم اینجا 12 *تعداد نقاط* را مشخص می کنه و t هم زمان انیمیشن رو تنظیم می کنه شما 30 تا نقطه داری باید پارامتر سوم رو 30 بدی و برای هر دو شکل 30 نقطه مشخص کنی .
> برای برنامه اول یک ترانسلیت بنویسی تمام شکل رو در صفحه نشون میده...
> 
> void myDisplay(void)
> {
>   glClear(GL_COLOR_BUFFER_BIT);
>     glColor3f(1.0, 1.0, 0.0);
>      
> ...


ahaaaaaaaaaan bale alan fahmidam mersiiiiiiiiiiiiiii

 :لبخند گشاده!: baba ma taze karim 
gharare badan ha mohanes beshim

----------


## mbgame

سلام خیلی ممنون از آموزش های که گزاشتید! 
من 5 سال هست که opengl کار میکنم البته در مورد توابع  ارتباطی gpu  زیاد کار نکردم ,فقط یک سری کدهای اولیه ی cuda و opencl رو کار کردم. اگه در این زمینه آموزش و یا مقاله مفیدی هست لطفا معرفی کنید.
2 تا سوال هم داشتم :
1. من زمانی که کدی رو روی console مینویسم سرعت اجراش از سرعت اجرای همون کد  روی windows aplication کمتره ,البته قدیما که با xp کار میکردم این مشکل رو نداشتم, از وقتی که با 7 کار کردم این مشکل پیش اومده! ممنون میشم اگه راهنماییم کنید!

2.من پروژه ای نوشته بودم که از موس در محیط 3d  استفاده میکرد و اجسام در عمق رو تشخیص میداد و از انجا که این کد را در console  نوشته بودم و بعد از کامپایل افت سرعت شدیدی رو داشت ,مجبور شدم کد رو روی windows api کامپایل کنم و بعد از کامپایل تابع gluprespective دچار خطای 10% ی میشه ,یعنی اگر قبلا روی console  میتونستم با موس یک sphere رو select کنم , حالا روی windows api باید تقریبا روی یک فاصله 10% نسبت به spere  کلیک کنم تا sphere انتخاب بشه! مشکل کجاست؟
با تشکر!

----------


## amin1softco

دوست داشتم دوستان حرفه ایی تر جواب بدند ولی خوب سرشون شلوغه.




> سلام خیلی ممنون از آموزش های که گزاشتید!


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




> من 5 سال هست که opengl کار میکنم البته در مورد توابع  ارتباطی gpu  زیاد  کار نکردم ,فقط یک سری کدهای اولیه ی cuda و opencl رو کار کردم. اگه در  این زمینه آموزش و یا مقاله مفیدی هست لطفا معرفی کنید.


توصیه حاصل از جستجوی گوگلی من  کتاب های زیر است البته خودم تا الان کار نکردم :

CUDA by Example: An Introduction to General-Purpose GPU Programming, J. Sanders and E. Kandrot, Addison-Wesley, 2011.Programming Massively Parallel Processors: A Hands-on Approach, D. Kirk and W. Hwu, Morgan Kaufmann, 2010.Nvidia CUDA Programming Guide, version 3, 2010




> 1. من زمانی که کدی رو روی console مینویسم سرعت اجراش از سرعت اجرای همون  کد  روی windows aplication کمتره ,البته قدیما که با xp کار میکردم این  مشکل رو نداشتم, از وقتی که با 7 کار کردم این مشکل پیش اومده! ممنون میشم  اگه راهنماییم کنید!


مشکل اصلی همیشه امنیت است . در ویندوز xp کنسول مستقیماً به هسته سیستم عامل kernel32 دسترسی داشت و دسترسی اون از نوع system بود این باعث می شد که بعضی نرم افزار های مخرب بتونند کارهایی رو بکنند مجاز نیستند!!! به خاطر همین در ویندوز های سون و سرور2008 یک پروسه جدید براش تعریف می شه با conhost برای همین سرعتش کمتره اطلاعات بیشتر که راه حلی به نظر من نمی رسه جز اینکه برید سراغ windows api یا چیزای دیگه مثل SDL




> 2.من پروژه ای نوشته بودم که از موس در محیط 3d  استفاده میکرد و اجسام در  عمق رو تشخیص میداد و از انجا که این کد را در console  نوشته بودم و بعد  از کامپایل افت سرعت شدیدی رو داشت ,مجبور شدم کد رو روی windows api  کامپایل کنم و بعد از کامپایل تابع gluprespective دچار خطای 10% ی میشه  ,یعنی اگر قبلا روی console  میتونستم با موس یک sphere رو select کنم ,  حالا روی windows api باید تقریبا روی یک فاصله 10% نسبت به spere  کلیک  کنم تا sphere انتخاب بشه! مشکل کجاست؟
> با تشکر!


به نظرم یک جایی در هنگام مشخص کردن ثابت های اولیه پروژه یک خطایی کردید که اینجا این اتفاق افتاده و گرنه نباید تفاوتی داشته باشه .
بازم خواهش می کنم!

----------


## pswin.pooya

سلام

1. شما از چه روشی برای picking استفاده می کنید؟

2. من توی ویندوز 7 مشکل شما رو ندارم. احتمالا شما درایور رو نصب نکرده باشید و یا اینکه درایور اشتباه نصب کرده باشید.

----------


## mjshaman

سلام به عزیزان
من تا حالا با opengl  کار نکردم و الآنم از اینجا چیزای خیلی زیادی یاد گرفتم که از همه ی عزیزان خیلی خیلی تشکر میکنم
من میخوام یه فوتبال سه بعدی طراحی کنم( مثل فوتبال بازی میکرو) اگه دوستان خاطرشون باشه و بازی کرده باشن
و برای شروع فقط میخوام بازیکنای توش حرکت کنن
الآن زمینو دروازه هارو کشیدم (خود opengl تابعی برای لود کردن عکس jpg نداره؟)، میخوام یه آبجکت برای بازیکناش بسازم که بعدا فقط یه مکان و رنگ بهش بدم تا بره سر جاش اما برای خود آدمکه مشکل دارم که چطوری سه بعدی بسازمش
ممنون میشم اگه راهنماییم کنید

----------


## mjshaman

راستی من سی شارپم خیلی بهتر از سی پلاسمه اما چندجا خوندم که opengl روی سی شارپ جواب نمیده و دردسره و بهتره که با سی پلاس گرافیک بنویسم
میشه راهنماییم کنید چطور توی سی شارپ 3 بعدی بنویسم؟ من قبلا کمی با توابع گرافیک سی شارپ کار کردم اما واردش نشدم میشه توی این موردم راهنماییم کنید
بازم مرسی

----------


## shecarchi

از کتابخانه openTK استفاده کن

----------


## amin1softco

> سلام به عزیزان
> من تا حالا با opengl  کار نکردم و الآنم از اینجا چیزای خیلی زیادی یاد گرفتم که از همه ی عزیزان خیلی خیلی تشکر میکنم
> من میخوام یه فوتبال *سه بعدی* طراحی کنم( مثل فوتبال بازی *میکرو*) اگه دوستان خاطرشون باشه و بازی کرده باشن
> و برای شروع فقط میخوام بازیکنای توش حرکت کنن
> الآن زمینو دروازه هارو کشیدم (خود opengl تابعی برای لود کردن عکس jpg نداره؟)، میخوام یه آبجکت برای بازیکناش بسازم که بعدا فقط یه مکان و رنگ بهش بدم تا بره سر جاش اما برای خود آدمکه مشکل دارم که چطوری سه بعدی بسازمش
> ممنون میشم اگه راهنماییم کنید


 بهتره این کتاب را یک نگاهی بندازید .
خداییش فوتبال میکرو سه بعدی بود ؟ جل الخالق
برای لود کردن عکس چیز خاصی نداره باید بوسیله devil هر نوع عکس را باز کنید و بوسیله gldrawpixel اونو ترسیم کنید یا با استفاده از texture برای یک سطح
برای بقیش من خودم از لیست پیوندی استفاده می کنم که مثلاً چیا باید رسم بشه و داخل یک حلقه این لیست را ترسیم می کنم بازکن را باید مثل یک درخت در نظر بگیری فک کنما....




> راستی من سی شارپم خیلی بهتر از سی پلاسمه اما چندجا خوندم که opengl روی سی شارپ جواب نمیده و دردسره و بهتره که با سی پلاس گرافیک بنویسم
> میشه راهنماییم کنید چطور توی سی شارپ 3 بعدی بنویسم؟ من قبلا کمی با توابع گرافیک سی شارپ کار کردم اما واردش نشدم میشه توی این موردم راهنماییم کنید
> بازم مرسی


والا بهترین چیزی که من دیدم که با ویندوز سون مشکلی نداشت همون OpenTK بود ولی بهتره با همون سی کنار بیایید یکمی کار با رشته ها سخت تره و خیلی امکانات رو ندراه :دییی

----------


## lpeiatb

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

);

int main (int argc, char*argv[])
{
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
    glutInitWindowPosition(30,30);
    glutInitWindowSize(300,300);
    glutCreateWindow("cg");
    init();
    glutDisplayFunc(circleMidpoint);
     glutDisplayFunc(linesegment);
    glutMainLoop();
    return 0;
}

پ.ن :
میدونم جواب دادن به سوالات ابتدایی خیلی عذاب آوره، ولی خب ما هم تازه اول راهیم و به کمک واسه بلند شدن احتیاج داریم
مرسی

----------


## pswin.pooya

جفتشون رو باید توی یک تابع بنویسی. نه جدا جدا. یا میتونی توی دو تا تابع جدا بنویسی و هر دو تابع رو از تابع اصلی صدا بزنی.

----------


## lpeiatb

تشکر، روش دومی که گفتید رو نفهمیدم چون یخورده برنامه نویسی گرافیک عجیب غریبه، ولی هر دو رو توی یه تابع نوشتم جواب داد، خیلی ممنون
 حقیقتش استاد یه خورده گنگ درس میده و کلا توضیحات کاملی نمیده که مثلا فلان کد مربوط به این میشه...
دوتا سوال دیگه هم دارم که مربوط به کنجکاوی خودم میشن، اگه جواب بدید ممنون میشم
میخواستم بدونم هر کدوم از این کد ها مربوط به چی میشن:
این کد رو گفتن پارامتر دوم و چهارمش تراکم صفحه رو مشخص میکنه، ولی نگفتن پارامتر اول و سوم چه کاری میکنن
(gluOrtho2D(0,300,0,300

Single تو این کد مربوط به چی میشه؟ وقتی گذاشتم رو double صفحه خروجی چیزی رو نشون نداد، توخالی شد
(glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB

ممنون که تحمل کردید
پیروز و پاینده باشید

----------


## amin1softco

بهتره اینا رو در گوگل سرچ کنی یا openGL manual را ببنی ..
gluOrtho2D
(ازچپ,
از راست ,
از بالا,
از پایین);
ترتیب پارامتر ها برای مشخص کردن محور مختصات !!!
GLUT_SINGLE : یعنی از یک بافر استفاده کند .
GLUT_DOUBLE :  دوتا بافر یعنی قبل از رسم در صفحه اصلی در یک بافر دیگه ترسیم انجام بشود. برای حالت انیمیشن که پشت سر هم ترسیم انجام می شه بدرد می خوره .
برای اینه روی دابل کار کنه باید تنظیم کنی که هرچقدر بیکاره بیاد و این تابع نمایش را صدا بزنه ...

----------


## mjshaman

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

----------


## amin1softco

اولین روش یک متغیر بولی تعریف می کنیم به  عنوان پرچم و متغیر سراسری است و مقدار پیش فرض بهش 1 میدیم که مکعب بچرخه وقتی کلید را زد و اون تابع را اجرا کرد می تونی این پرچم را تغییرش بدیم و در تابع اصلی یک شرط بگذاریم که اگر مقدار پرچم برابر 1بود مقدار زاویه ها را اضافه کنه یا تابع چرخش را اجرا کند.
روش دیگه برای انجام این کار استفاده از تابه glutTimerFunc(20,timerFunc,0); که بوسیله این تابع شما می تونید یک تایمر بوسیله openGL برای انیمشین درست کنید 
پارامتر اول برای زمان تایمر است به میلی ثانیه فک کنم پارامتر دوم تابعی است که صدا می زنه بعد از زمان مشخص شده و پارامتر سوم مقداری است که به عنوان آرگومان به تابع فراخوانی شده میده شما با پارامتر سوم این کار را می تونید هندل کنید ...
مثال ساده :

#include <stdio.h>
#include <stdlib.h>

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

static double s_line_length = 0.5;

void display_function(void)
{
 glClear(GL_COLOR_BUFFER_BIT);
 glColor3f(0.0 ,1.0,0.0);
 glBegin (GL_LINES);
 glVertex3f (0.0 ,s_line_length , 0.0);
 glVertex3f (s_line_length, 0.0 ,0.0);
 glColor3f(0.0,0.0,1.0);
 glVertex3f( 0.0 , -s_line_length , 0.0);
 glVertex3f(-s_line_length , 0.0 , 0.0);

 glEnd();
 glFlush();
}

void keyboard_function( unsigned char ch , int x , int y)
{
//&nbsp;&nbsp; &nbsp;exit (0);

}

void timer_function( int value)
{
 static bool flag = true ;
 static int count = 5;
 if ( count == 10 )
 {
 flag=false;
 }
 if (count == 0){
 flag=true;
 }

 if (flag )
 {
 s_line_length += 0.1;
 count++;
 }
 else
 {
 s_line_length -= 0.1;
 count--;
 }
 glutPostRedisplay();
 glutTimerFunc( 200,timer_function , 0);
}

void mouse_func ( int button , int status , int x , int y)
{

}

int main ( int argc , char ** argv)
{
 glutInit( &argc , argv);
 glutInitDisplayMode(GLUT_SINGLE |GLUT_RGB);
 glutInitWindowSize( 250,250);
 glutInitWindowPosition(100,100);
 glutCreateWindow("Line Animation");
 glutKeyboardFunc( keyboard_function);
 glutDisplayFunc ( display_function);
 glutTimerFunc (1, timer_function,0);
 glutMouseFunc( mouse_func);

 glutMainLoop();
}

----------


## mjshaman

شرمنده ی مرام و معرفتت، عزیز من هر چی فکر کردم و با کد بالا ور رفتم  نتوستم بفهمم چطوری باهاش برنامه مو pause کنم و بعدش resume کنمش، میشه  همین برنامه بالا رو براش این خصوصیتها رو بذاری
پیشاپیش مرسی

----------


## amin1softco

بفرما عزیز دلم با فشردن کلید p صفحه کلید عمل مکث انجام می شود و با فردن مجدد انیمیشن ادامه پیدا می کند.

#include <stdio.h>
#include <stdlib.h>
#include <GL/gl.h>
#include <GL/glut.h>
static double s_line_length = 0.5;
bool f=true; //تعریف یک متغیر سراسری
void display_function(void)
{
 glClear(GL_COLOR_BUFFER_BIT);
 glColor3f(0.0 ,1.0,0.0);
 glBegin (GL_LINES);
 glVertex3f (0.0 ,s_line_length , 0.0);
 glVertex3f (s_line_length, 0.0 ,0.0);
 glColor3f(0.0,0.0,1.0);
 glVertex3f( 0.0 , -s_line_length , 0.0);
 glVertex3f(-s_line_length , 0.0 , 0.0);
 
 glEnd();
 glFlush();
}
void timer_function( int value)
{
 static bool flag = true ;
 static int count = 5;
 if ( count == 10 )
 {
 flag=false;
 }
 if (count == 0){
 flag=true;
 }
 
 if (flag )
 {
 s_line_length += 0.1;
 count++;
 }
 else
 {
 s_line_length -= 0.1;
 count--;
 }
 glutPostRedisplay();

 if(f)//شرط برای چک کردن اجرای مجدد تایمر
 glutTimerFunc( 200,timer_function , 0);
}
 
void mouse_func ( int button , int status , int x , int y)
{
 
}
 void keyboard_function( unsigned char ch , int x , int y)
{
//&nbsp;&nbsp; &nbsp;exit (0);
    if (ch=='p'){
        f=(f)?false:true;
    glutTimerFunc( 200,timer_function , 0);
    }

 
}
int main ( int argc , char ** argv)
{
 glutInit( &argc , argv);
 glutInitDisplayMode(GLUT_SINGLE |GLUT_RGB);
 glutInitWindowSize( 250,250);
 glutInitWindowPosition(100,100);
 glutCreateWindow("Line Animation");
 glutKeyboardFunc( keyboard_function);
 glutDisplayFunc ( display_function);
 glutTimerFunc (1, timer_function,0);
 glutMouseFunc( mouse_func);
 
 glutMainLoop();
}

----------


## mjshaman

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

----------


## mjshaman

دوستان عزیز شرمنده که هی میام سوال میپرسم
من یه انیمیشن با opengl نوشتم که30 تا شکلک طبق یه آرایه ی a[30][900][2]i توی پنجره نمایش داده بشن، 30 تعداد شکلکها، 900 تعداد حالتها و 2 مختصات هر حالت به x,y هستن
طبق قواعد انیمیشن این 900 خط باید در 30 و نهایتا 40 ثانیه نمایش داده بشن اما خیلی بیشتر طول میکشه یعنی حدود 6دیقه و نیم و بدتر از اون اینه که در پایان حدود ده تا از شکلک هام پاک میشن و در حال اجرا هم به صورت چشمک زن ظاهر میشن، pls help me
من برای اجراش یه حلقه 900 تایی گذاشتم و توش اول صفحه رو پاک کردم و بعدش یه حلقه 30 تایی گذاشتم و توش شکلک رو با مختصات آرایه رسم کردم

----------


## amin1softco

شما باید تعداد فرم هایی که در ثانیه رندر می شوند (FPS) را حساب کنید و طبق اون از روی بعضی از فرم ها بپرید برای اون مشکل پرش بهتر از 
 glutInitDisplayMode(GLUT_DOUBLE |GLUT_RGB);
استفاده کنید.

----------


## mjshaman

عزیزجان، میشه یکم بیشتر توضیح بدی که باید دقیقا چطوری و کجا و با چه مقادیر ورودی با glutInitDisplayMode(GLUT_DOUBLE |GLUT_RGB); کار کنیم
مرسی

----------


## amin1softco

> عزیزجان، میشه یکم بیشتر توضیح بدی که باید دقیقا چطوری و کجا و با چه مقادیر ورودی با glutInitDisplayMode(GLUT_DOUBLE |GLUT_RGB); کار کنیم
> مرسی


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

----------


## mjshaman

خیلی برام جالبه فیالی که گذاشتی
من سه چهارتا کتاب pdf خوندم که یکیشم اینجا معرفی شده بود اما همشون درباره ترسیم بودن و چیز خاصی درباره ی انمیشن و این مباحث نگفته بودن
میشه یه کتاب بهم معرفی کنید، البته زیادم عمیق و تخصصی نباشه که گیج کننده باشه
میدونم پرروییه اما اگه بشه کد رو (توابعی که استفاده کردی) و مخصوصا بخش محاصبه fps رو یه توضیحی بدی خیلی خوب میشه، مرسی

----------


## amin1softco

کتاب روی نت سرچ کن 
Addison.Wesley.OpenGL.SuperBible.5th.Edition.Jul.2  010.rar
برای آموزشم سرچ کنید بهتر به جواب می رسید مثلاً
توضیح :
void lineSegments(void){//این تابع هر وقت ترسیم قبلی انجام شد دوباره صدا زده می شه تا جایی که امکان داشته باشه
.
.
.
frame++;//این تابع شمارنده تعداد فراخوانی های تابع بالاست
    time=glutGet(GLUT_ELAPSED_TIME);//این تابع طول زمان اجرای برنامه از شروع را حساب می کنه
    printf("FPS:%4.2f\n",fps);//این تابع مقدار فرم در ثانیه قبلی را چاپ می کنه
    
    if (time - timebase > 1000) {//این تابع زمان کلی اجرا را از مقدار تایم بیس کم می کنه اگر 1000 معادل 1 ثانیه شد باید این شرط اجرا بشه
        fps = float(frame*1000.0/(time-timebase));//این تابع میگه فرم در ثانیه برابر با فرم هایی که شمارش شده تا رسیدن به شرط تقسیم برای دقت بیشتر است چون حدوداً برابر 1 می شه  
         timebase = time;//مقدار تایم بیس را با مقدار قبلی جایگزین می کنه برای یک ثانیه بعدی 
        frame = 0;//مقدار فرم هم صفر می شود
    }
.
.
.}

----------


## mosi98

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

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

----------


## pswin.pooya

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


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

GLvoid *reshape*( GLsizei *width*, GLsizei *height* ) {     GLdouble    aspect, left, right, bottom, top;  *    glViewport( 0, 0, width, height );*      /* compute aspect ratio */ *    aspect = (GLdouble) width / (GLdouble) height;*      /* make sure the window goes from [-2.0, 2.0] in the        smallest dimension */     if ( *aspect < 1.0* ) {          left = -2.0;          right = 2.0; *         bottom = -2.0 * ( 1.0 / aspect );* *         top = 2.0 * ( 1.0 / aspect );*     } else { *         left = -2.0 * aspect;* *         right = 2.0 * aspect;*          bottom = -2.0;          top = 2.0;     }      glMatrixMode( GL_PROJECTION );     /* Reset world coordinates first ... */ *    glLoadIdentity();*      /* Then set them to what we want based on the new aspect ratio */ *    glOrtho( left, right, bottom, top, -1.0, 1.0 );*     glMatrixMode( GL_MODELVIEW ); }




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


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

http://www.lighthouse3d.com/opengl/p...php?openglway2
http://content.gpwiki.org/index.php/...orials:Picking

البته روشهای پیچیده تر و بهتری وجود دارن که سرعت بیشتری رو هم دارن. مثلا توی ویرایشهای OpenGL 2.0 به بعد بعضی ها از FBO استفاده می کنن و یا معمولا نرم افزاری حرفه ای از Ray picking استفاده می کنن:

http://schabby.de/picking-opengl-ray-tracing/

----------


## amin1softco

در ادامه صحبت های دوست خوبم پویا باید عرض کنم وقتی شما پنجره را تغییر سایز میدید یک تابعی در glut موجوده به نام glutReshapeFunc که وقتی پنجره تغییر شکل داده شد تابعی را که بهش معرفی می کنید را اجرا می کنه و اینا باید در قسمتی که تابع display وغیر را تعریف می کنید در main مشخص بشه بعدشم از من می شنوید بهتره جلوی تغییر اندازه را بگیرید با کد زیر تا با مشکلات بالا روبرو نشید !!!:دی با کد زیر :

GLint WindowWidth=500,WindowHeight=500;
.
.
void resizeWindow(int w, int h){
     if( w != WindowWidth || h != WindowHeight )
glutReshapeWindow( WindowWidth, WindowHeight);
.
.
int main(int argc, char** argv)
{
.
.
.
glutReshapeFunc(resizeWindow);
     }

که مشکل دوم هم خود به خود منتفی می شه در غیر اینصورت روش پست قبل را دنبال کنید.

----------


## mosi98

سلام
یه سوال دیگه:
چطور میشه تو opengl یک شی و درگ کرد؟

----------


## pswin.pooya

سلام

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

اما اگر منظورتون درگ کردن داخل خود برنامه باشه که باید این روند رو با ماوس کنترل کنید. اصولا باید یک شی رو pick‌( انتخاب کنبد) و مکان رو به جایی که ماوس هست انتقال بدید و لحظه ای که ماوس رها شد از انتقال شی جلوگیری کنید.

----------


## mjshaman

با سلام خدمت دوستان
من یه برنامه که تقریبا بیشتر انیمیشنه نوشتم( البته به کمک این بخش و کمک دوستان) که دوبعدیه
حالا میخوام سه بعدیشو بنویسم، میشه راهنمایی و کمکم کنید
برای سه بعدی کردن باید برنامه رو از اول بنویسم یا با یه سری تغییرات میشه سه بعدیش کرد؟
انیمیشنم چندتا آدمک هستن که روی زمین جرکت میکنن
آیا حرکت دوربین دور اشیا با سه بعدی فرق میکنه؟

----------


## amin1softco

openGL خودش فرمت خاصی مثل دایرکس که .x هست نداره و باید از فرمت هایی مثل .obj استفاده کنید.
مراحل کار :
1- وارد یک نرم افزار سه بعدی ساز مثل 3Dmax یا maya یا blender یا ... شده بازیکن مورد نظر خودتون را طراحی می کنید .
2- بعد از طراحی باید با فرمت .obj یا هر فرمتی که توانایی لود کردنش را در openGL دارید ذخیره می کنید . برای مثال یک فایل obj به صورت متنی حاوی یک ماتریس 4 ستونه است که خانه اول برای ذخیره نوع و سه تای بعدی مختصاته فک کنم
3- فایل ذخیره شده را با کدی که نوشتید لود کنید .
به همین راحتی و خوشمزگی کارکتر شما در محیط gl لود خواهد شد برای مثال این کد را ببنید . با فشردن کلید L فایل لود می شه.
http://www.gamedev.net/topic/312335-...ing-in-detail/

----------


## atefe70

خسته نباشید 

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

علتش چیه و چیکار باید بکنم ؟؟

Error 1 fatal error C1083: Cannot open include file: 'GL/glut.h': No such file or directory c:\users\ensi\documents\visual studio 2008\projects\opengl3\opengl3\tasvir.cpp 2 opengl3


ممنون اگه راهنمایی کنید . 
سپاس

----------


## atefe70

این برنامه اگه درایورا نصفه و نیمه نصب باشه جواب نمیده یعنی ؟

----------


## amin1softco

فایل مورد نظر را درست کپی کردید GL/glut.hنوشته که اینو پیدا نکرد باید درست کپی کنید .

----------


## atefe70

Error 1 error LNK2019: unresolved external symbol _WinMain@16 referenced in function ___tmainCRTStartup MSVCRTD.lib atefe2


Error 2 fatal error LNK1120: 1 unresolved externals C:\Users\ensi\Documents\Visual Studio 2008\Projects\atefe2\Debug\atefe2.exe atefe2


این 2تا خطا چی میگه ؟ من دیگه واقعا گیچ شدم . کسی نمیاد به این مساله رسیدگی کنه :(

----------


## ehsanware

آقا من تازه میخوام شروع کنم 
همون اول اون Compiler need ها رو که کپی میکنم انگار درست نیست همون پیغام اولی رو میده بازم.
من اونا رو تو program files x86 ریختم چون ویژوالم اونجا بود مشکلش از این میتونه باشه؟؟؟

----------


## amin1softco

شما بایدglut32.dll  را در syswow64 کپی کنید. و x86 درسته...

----------


## ehsanware

> شما بایدglut32.dll  را در syswow64 کپی کنید. و x86 درسته...


همه رو وارد کردم الان چک کردم دیدم کلا اصلا هیچ هدری رو نمیشناسه هیچ برنامه ای رو نمیتونه اجرا کنه ولی تو فایل lib همه ی هدرها هست نمیدونم چیکار کنم :گریه:

----------


## amin1softco

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



> کلا اصلا هیچ هدری رو نمیشناسه هیچ برنامه ای رو نمیتونه اجرا کنه ولی تو فایل lib همه ی هدرها هست نمیدونم چیکار کنم


خوب ببین این می تونه مشکل از ویژوالت یک برنامه ساده داس می تونی اجرا کنی ؟

----------


## reza-sj

سلام به همه دوستان 
من دارم یه پروژه paint ساده می نویسم به رسم خط و مربع و دایره و ... مشکل خاصی ندارم مشکل اصلی من وقتی هستش که میخوام مختصاتی که باید اون شکل رسم بشه رو از موس بگیرم به مشکل بر میخورم من از دستور :
glutMouseFunc( mouse);



استفاده میکنم مشکل اینجاست که میخوام 2 تا مختصات از موس بخونه اما این مختصات هایی که میخونه با مختصات صفحه هماهنگی نداره اینم کده من هستش ممنون میشم که کمکم کنید :



#include<gl/glut.h>
#include<math.h>
int xx1=2,xx2=70,yy1=2,yy2=2;
int i=0;
double round(double x)
{
return floor(x + 0.5);
}
void DDALine( GLint X1, GLint Y1, GLint X2, GLint Y2)
{
GLint iX, iY, Temp;
float m, X, Y;
if( (X2-X1) > (Y2-Y1))
{
if( X1 > X2)
{
Temp=X1; X1=X2; X2=Temp;
Temp=Y1; Y1=Y2; Y2=Temp;
}
Y=Y1;
m = (GLfloat) (Y2-Y1)/(X2-X1);
for( iX = X1; iX <= X2; iX ++)
{
glBegin(GL_POINTS);
glColor3f(1.0,0.2,0.0);
glVertex2i(iX,round(Y));
glEnd();
Y += m;
}
}
else
{
if( Y1 > Y2)
{
Temp=X1; X1=X2; X2=Temp;
Temp=Y1; Y1=Y2; Y2=Temp;
}
X = X1;
m = (float) (X2-X1)/(Y2-Y1);
for( iY = Y1; iY <= Y2; iY ++)
{
glBegin(GL_POINTS);
glColor3f(1.0,0.2,0.0);
glVertex2i(round(X),iY);
glEnd();
X += m;
}
}
}
void init()
{
glClearColor(0,0,0,0);
glMatrixMode(GL_PROJECTION);
gluOrtho2D(0,100,0,200);
}
void display()
{
 
glClear(GL_COLOR_BUFFER_BIT);
glEnable(GL_POINT_SMOOTH);
glPointSize(10);
if (i==2)
{
DDALine(xx1,yy1,xx2,yy2);
}
glFlush();
i=0;
}
void mouse(int button, int state, int x, int y)
{
i++;
if (state == GLUT_DOWN)
{
 
if (i==1)
{
xx1=x;
yy1=y;
 
}
if (i==2)
{
xx2=x;
yy2=y;
 
}
 
}
　
　
}
int main(int argc,char **argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
glutInitWindowSize(500,500);
glutInitWindowPosition(200,200);
glutCreateWindow("Line With Slope");
init();
glutDisplayFunc(display);
glutMouseFunc( mouse);
glutMainLoop();
return 0;
}

----------


## amin1softco

مختصات ماوس معکوس است یعنی یکبار باید از ارتفاع را ازش کم کنیم تا مختصات ما بدست بیاد .
مثلاً اگر از 
gluOrtho2D(0.0,650.0,0.0,300.0);
.
.
void myMouseFunc( int button, int state, int x, int y ) {
    if ( button==GLUT_LEFT_BUTTON && state==GLUT_DOWN ) {
        
        xx=x;
        yy=300-(y);

اگر دستگاه 1 باشه بجای 300 از یک کمش می کنیم.
این پست را ببین.

----------


## H_G_G_I

سلام ببخشید سوالمو اینجا می پرسم اخه سولای مختلفه ! :خجالت: 
اول از همه یکم 

glLightfv(GL_LIGHT0, GL_POSITION, position);
 
رو توضیح بدین یعنی الان منظورم اینه که این نور ما نقه ایه جهتیه اسپاته ! :متفکر: 
چطور تعیین کنم چه مدلی باشه ! :متفکر: 

بعد این یعنی چی ؟ چی رو فعال می کنه ؟ :متفکر: 
glEnable(GL_CULL_FACE);

بافر Stencil واس چیه ؟ :متفکر: 

بعد الان من مثلا با اپن جی ال برنامه نوشتم با ورژن جندش نوشتم ؟ الان از کجا بدونم تو چه ورژنی کار می کنه ! :متفکر: 
شیدر هم استفاده نکردم ! تو همه کار می کنه ؟ :متفکر: 
 :متفکر: 
 :متفکر: 
 :متفکر: 
 :متفکر:

----------


## ab_ir_007

دوستان سلام
کسی کد رسم هواپیمای 2 بعدی در opengl رو داره برام بزاره؟
فوری یه!!!!

----------


## amin1softco

> سلام ببخشید سوالمو اینجا می پرسم اخه سولای مختلفه !
> اول از همه یکم 
> 
> glLightfv(GL_LIGHT0, GL_POSITION, position);
>  
> رو توضیح بدین یعنی الان منظورم اینه که این نور ما نقه ایه جهتیه اسپاته !
> چطور تعیین کنم چه مدلی باشه !
> 
> بعد این یعنی چی ؟ چی رو فعال می کنه ؟
> ...


glLightfv  ( light , pname , params ) →  None  
پارامتر ها
light 
یک نور را مشخص می کند . تعداد نور ها بر حسب پیاده سازی مشخص می شود ولی حداقل 8 نور پشتیبانی می شود اینها بوسیله نام سمبلیک مشخص می شوند از GL_LIGHT i زمانی که 0 ≤ i < GL_MAX_LIGHTS

pname 
نوع منبع نور را مشخص می کند برای light  
مقادیرقابل قبول 
GL_AMBIENT, GL_DIFFUSE, GL_SPECULAR, GL_POSITION, GL_SPOT_CUTOFF, GL_SPOT_DIRECTION, GL_SPOT_EXPONENT, GL_CONSTANT_ATTENUATION, GL_LINEAR_ATTENUATION, and GL_QUADRATIC_ATTENUATION are accepted. 

params
 یک اشاره گر به مقادیر که به pnameو نوع نور تخصیص داده می شود.

تشریح :
glLight تعیین می کند مقادیر منحصر به فرد منبع نور را مشخص می کند. light نام نور و یک نام سمبلیک از GL_LIGHT i, زمانی که 0 ≤ i < GL_MAX_LIGHTS و pname مشخص می کند یکی از 10 مشخصه منبع نور را دوباره بوسیله نام سمبلیک
params می تونه یک مقدارباشه یا یک اشاره گر به آرایه ایی از مقادیر جدید.

برای فعال و غیر فعال کردن محاسبات نور می توانید بوسیله فراخوانی glEnable و glDisable با آرگومان GL_LIGHTING اقدام کنید. نور پردازی بطور پیش فرض غیر فعال است. زمانی که فعال می شود منابع نور فعال در محاسبات نور پردازی شرکت می کنند . منبع نور i بوسیله دستور glEnable و glDisable  با آرگومان GL_LIGHT i فعال و غیر فعال می شوند.

10 پارامتر منبع نور به ترتیب زیر است :
GL_AMBIENT
نور محیط یا Ambient Light:
params شامل 4 عدد صحیح یا ممیز شناور که مشخص می کنند رنگ نور محیطی RGBA و شدت نور را. مقادیر صحیح به صورت خطی به دستگاه واحد نگاشت می شوند بیشترین مقدار به 1 و منفی ترین مقدار به -1 نگاشت می شود. مقادیر ممیز شناور بطور مستقیم نگاشت می شوند. شدت اولیه نور (0, 0, 0, 1) است.

GL_DIFFUSE 
نور پخشی :
params شامل 4 عدد صحیح یا ممیز شناور که مشخص می کنند رنگ نور محیطی RGBA و شدت نور را. مقادیر صحیح به صورت خطی به دستگاه واحد نگاشت می شوند بیشترین مقدار به 1 و مقادیر ممیز شناور بطور مستقیم نگاشت می شوند. مقدار اولیه برای GL_LIGHT0 بابر (1, 1, 1, 1) است. برای نور های دیگر مقادیر دیگر مقادیر دیگر  (0, 0, 0, 0) است.

GL_SPECULAR
نور متمرکز :
params شامل 4 عدد صحیح یا ممیز شناور که مشخص می کنند رنگ نور محیطی RGBA و شدت نور را. مقادیر صحیح به صورت خطی به دستگاه واحد نگاشت می شوند بیشترین مقدار به 1 و مقادیر ممیز شناور بطور مستقیم نگاشت می شوند. مقدار اولیه برای GL_LIGHT0 برابر (1, 1, 1, 1) و برای نور ها دیگر برابر (0, 0, 0, 0) است.

GL_POSITION 
نور موضعی, نقطه ایی :

params شامل 4 عدد صحیح یا ممیز شناور که مشخص می کنند رنگ نور محیطی RGBA و شدت نور را. مقادیر صحیح به صورت خطی به دستگاه واحد نگاشت می شوند بیشترین مقدار به 1 و مقادیر ممیز شناور بطور مستقیم نگاشت می شوند.

موضع تبدیل بوسیله ماتریس modelview است زمانی که glLight فراخوانی می شود زمانی که فقط یک نقطه است و آن در مختصات چشم ذخیره می شود اگر کامپوننت w از موقعیت صفر باشد نور رفتار می کند شبیه منبع نور مستقیم . محاسبات نور پخشی و موضعی نیاز به جهت دارند . ولی نه موقعیت واقعی موقعیت شروع برابر (0, 0, 1, 0) است پس منبع اولیه نور مستقیم است . به موازات جهت مختصات محور -z.

بقیشم من حسش نبود ترجمه کنم ولی اینا رو برو در قسم برنامه های و مثال های openGL یک برنامه هست مقادیرشونو کم و زیاد کن بدست میاد.

GL_SPOT_DIRECTION 
params contains three integer or floating-point values that specify the direction of the light in homogeneous object coordinates. Both integer and floating-point values are mapped directly. Neither integer nor floating-point values are clamped. 

The spot direction is transformed by the inverse of the modelview matrix when glLight is called (just as if it were a normal), and it is stored in eye coordinates. It is significant only when GL_SPOT_CUTOFF is not 180, which it is initially. The initial direction is (0, 0, -1). 

GL_SPOT_EXPONENT 
params is a single integer or floating-point value that specifies the intensity distribution of the light. Integer and floating-point values are mapped directly. Only values in the range [0,128] are accepted. 

Effective light intensity is attenuated by the cosine of the angle between the direction of the light and the direction from the light to the vertex being lighted, raised to the power of the spot exponent. Thus, higher spot exponents result in a more focused light source, regardless of the spot cutoff angle (see GL_SPOT_CUTOFF, next paragraph). The initial spot exponent is 0, resulting in uniform light distribution. 

GL_SPOT_CUTOFF 
params is a single integer or floating-point value that specifies the maximum spread angle of a light source. Integer and floating-point values are mapped directly. Only values in the range [0,90] and the special value 180 are accepted. If the angle between the direction of the light and the direction from the light to the vertex being lighted is greater than the spot cutoff angle, the light is completely masked. Otherwise, its intensity is controlled by the spot exponent and the attenuation factors. The initial spot cutoff is 180, resulting in uniform light distribution. 
GL_LINEAR_ATTENUATION , GL_QUADRATIC_ATTENUATION , GL_CONSTANT_ATTENUATION 
params is a single integer or floating-point value that specifies one of the three light attenuation factors. Integer and floating-point values are mapped directly. Only nonnegative values are accepted. If the light is positional, rather than directional, its intensity is attenuated by the reciprocal of the sum of the constant factor, the linear factor times the distance between the light and the vertex being lighted, and the quadratic factor times the square of the same distance. The initial attenuation factors are (1, 0, 0), resulting in no attenuation. 
Notes
It is always the case that GL_LIGHT i = GL_LIGHT0 + i. 






> بعد این یعنی چی ؟ چی رو فعال می کنه ؟
> glEnable(GL_CULL_FACE);


ببین در ابتدا این مشخصه غیر فعال است ولی اگر فعال بشه با این دستور ما خودمون بوسیله دستور glFrontFace مشخص می کنیم پشت یا رو اجسام برای رندر انتخاب یا گلچین بشود !!  
GL_FRONTو GL_BACK, و  GL_FRONT_AND_BACK قابل قبول است .

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





> بعد الان من مثلا با اپن جی ال برنامه نوشتم با ورژن جندش نوشتم ؟ الان از کجا بدونم تو چه ورژنی کار می کنه !


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

لینک های مفید :
http://www.opengl.org/wiki/Getting_Started
http://en.wikipedia.org/wiki/Stencil_buffer
http://developer.apple.com/library/i...roduction.html
http://developer.android.com/trainin...ngl/index.html

اینا شاید غلط و اشتباه زیاد داشته باشه خوشحال می شم دوستان اصلاح کنند.

----------


## nok_tala

سلام میشه توابع 
glDrawArrays
glDrawArraysIndirect
glDrawArraysInstanced
glDrawArraysInstancedBaseInstance
glDrawBuffers
glDrawElementsBaseVertex رو توضیح بدید ؟

----------


## amin1softco

glDrawArrays  ( mode , first , count ) →  رندر کردن اشکال پایه بوسیله داده های ماتریسی

پارا متر ها :
mode 
نوع شکل پایه را مشخص می کند و می تواند مقادیر ثابت زیر باشد :
GL_POINTS, GL_LINE_STRIP, GL_LINE_LOOP, GL_LINES, GL_TRIANGLE_STRIP, GL_TRIANGLE_FAN, GL_TRIANGLES, GL_QUAD_STRIP, GL_QUADS, و GL_POLYGON قابل قبول هستند.

first 
مشخص کننده راس شروع.

count 
مشخص کننده تعداد که باید رندر شود.

Description
glDrawArrays specifies multiple geometric primitives with very few subroutine calls. Instead of calling a GL procedure to pass each individual vertex, normal, texture coordinate, edge flag, or color, you can prespecify separate arrays of vertexes, normals, and colors and use them to construct a sequence of primitives with a single call to glDrawArrays. 

When glDrawArrays is called, it uses count sequential elements from each enabled array to construct a sequence of geometric primitives, beginning with element first. mode specifies what kind of primitives are constructed, and how the array elements construct those primitives. If GL_VERTEX_ARRAY is not enabled, no geometric primitives are generated. 

Vertex attributes that are modified by glDrawArrays have an unspecified value after glDrawArrays returns. For example, if GL_COLOR_ARRAY is enabled, the value of the current color is undefined after glDrawArrays executes. Attributes that aren't modified remain well defined. 

Notes
glDrawArrays is available only if the GL version is 1.1 or greater.


برای بقیه هم به این رفرنس opengl 4 مراجعه کنید 
http://www.opengl.org/sdk/docs/man/

----------


## sanazy

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

----------


## UfnCod3r

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


 برای ابر اول باید تابع رسم کمان رو بنویسی !
بعد ابر درست کردن کاری نداره دیگه ساده میشه !
برای عکس انداختن هم اول باید عکس رو با یه کتاب خون ای لود کنید بعد وارد پان جی ال کنید !
سرچ کنید مثال هست ! اگه تو کد مشکلی داشتین بگین ! :لبخند:

----------


## sanazy

مرسی از کمکتون اما من اینارو میدونم !!!!!!
تو ابربیضی وقتی x,y,z بدست آوردیم باید چیکار کنیم؟ تابعی هست واسه کشیدن ابربیضی؟
عکسم هرجا سرچ کردم جواب درست حسابی پیدا نکردم هیچ جا درست توضیح نداده :( :ناراحت:

----------


## kazemiam

با سلام
میخواستم بدونم برای انتخاب یک شکل دو بعدی چطوری باید مختصات اون شکل رو برای موس بدست بیارم؟

یه برنامه کوچیک دارم مینویسم که با کلیک بر روی یک مربع 1x1 به حالت انتخاب بره(مثلا دور اون خط کشیده بشه) و بعد از اون، با کلید های صفحه کلید قابل جابجایی  باشه و در صورتی که جای دیگری از صفحه(غیر از مربع) کلیک شد دیگه از حالت انتخاب خارج بشه.

بنده به صورت زیر محدوده شکل رو مشخص کردم اما انتخاب نمیشه!!  :ناراحت: 
میدونم کاملا اشتباه هستش، اما جور دیگه ای هم نتونستم حساب کنم!!! :اشتباه: 
با کلیک بر روی صفحه، تابع زیر فراخوانی میشه:

 void Positions(int x,int y)
{
    if((x>(px-0.5) && x<(px+0.5)))
        if((y<(py+0.5) && y>(py-0.5)))
        {
            select=true;
        draw_Quad();
    glColor3f(1.0, 1.0, 1.0);
    glLineWidth(2.0);
        draw_Quad_Line();
        }
    else 
    {
        select=false;
        glClearColor(0.5, 1.0, 0.5, 0.0);
        glClear(GL_COLOR_BUFFER_BIT);
    draw_Quad();
    }
glFlush();
}

ممنون میشم که راهنماییم کنید.
 :لبخند: 
اگه جایی از سوال مجهول هستش، یا نیازی به ارسال کل کد هست بفرمایید تا زودتر به جواب برسیم.
با تشکر.

----------


## amin1softco

اول از همه این را در نظر بگیرید شما در یک حلقه هستید که هر ثانیه 30 بار تکرار می شه بعدش کد بزنید . اول شما باید بوسیله glut  مختصات ماوس را بدست بیارید و یک شرط چک کنید اگر مختصات ماوس در محدوده شکل بود select را 1 یا true کندو در غیر اینصورت 0 یا false برای اینکه مختصات بهتر تنظیم بشه شما باید پرجکشن را روی 500 * 500 یا هر مقدار دلخواه دیگر تنظیم کنید . اصولاً برای ترسیم بهتر از یک لیست پیوندی یا درخت یا هر چیزی که راحت تر هستید استفاده کنید .
یک کد برای اینکه ازش الهام بگیرید گذاشتم که وقتی مأوس میره روش رنگش سبز می شه ..

#include <math.h>
#include <GL/glut.h> 
bool flag=0;
void special( int key, int x, int y)
{
switch(key){
case GLUT_KEY_UP:
    //your code
break;
case GLUT_KEY_DOWN:
//your code
break;
}
}

void init(void){                
glClearColor(1.0,1.0,1.0,0.0);
glMatrixMode(GL_PROJECTION); //projection parameters
gluOrtho2D(0.0,300.0,0.0,300.0); //sets up WC extent
}

void Display()         
 {
 glClear(GL_COLOR_BUFFER_BIT); 
   
    
   if (flag) glColor3f(0.0, 0.0, 1.0);  
   else glColor3f(0.0, 1.0, 0.0);
    glPushMatrix();  
    glTranslatef(150.0,150.0,0.0);
GLUquadricObj *circle = gluNewQuadric ();
gluQuadricDrawStyle (circle, GLU_FILL);
gluDisk (circle,0,100,5000,1);               
gluDeleteQuadric(circle);    

glPopMatrix();
                                
                                           
glutSwapBuffers();                               
 }
 void myMotionFunc(  int x, int y ) {
        y=300-(y);
        if(sqrt(double(pow(float(abs(150-x)),2)+pow(float(abs(150-y)),2)))>100) flag=1;
        else flag=0;
 }
int main(int argc, char **argv)
{
  glutInit(&argc, argv);
  glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
  glutInitWindowPosition(500,500);
  glutInitWindowSize(300,300);
  
  glutCreateWindow("Circle key");
  init();
  glutDisplayFunc(Display);
  glutIdleFunc(Display);
  glutPassiveMotionFunc (myMotionFunc);
  glutSpecialFunc(special);
  glutMainLoop();
  return 0;
}

----------


## kazemiam

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

// Select_Move_shape.cpp : Defines the entry point for the console application.

#include "stdafx.h"
#include <stdlib.h>
#include <glut.h>

GLsizei wh = 500, ww = 500; 

GLfloat px = 0.0;
GLfloat py = 0.0;
GLfloat Munit = 0.05;

GLfloat wx = ww/2;
GLfloat wy = wh/2;
GLfloat wxMunit = wx * Munit;
GLfloat wyMunit = wy * Munit;

bool select=false;
GLfloat size = 0.5;
GLfloat PXsize = wx* size;
GLfloat PYsize = wy* size;


void draw_Quad()
{
glClear(GL_COLOR_BUFFER_BIT);
    glBegin(GL_QUADS);
    glVertex2f(px-size, py+size);
    glVertex2f(px+size, py+size);
    glVertex2f(px+size, py-size);
    glVertex2f(px-size, py-size);
    glEnd();
glFlush();
}

void Positions(int x,int y)
{
    //x = ww - x;
    y = wh - y;

    if((x>(wx-PXsize) && x<(wx+PXsize))) //(float)
        if((y<(wy+PYsize) && y>(wy-PYsize)))
        {
            select=true;
        
        glClearColor(0.5, 0.5, 1.0, 0.0);
        glClear(GL_COLOR_BUFFER_BIT);
        draw_Quad();
        }
    else 
    {
        select=false;
        glClearColor(0.5, 1.0, 0.5, 0.0);
        glClear(GL_COLOR_BUFFER_BIT);
    draw_Quad();
    }
glFlush();
}

void my_key_events (unsigned char key, int x, int y )
{
    int k=key;
    printf("Key Value Is: %d\n",k);
    switch ( key ) {
        case 'a': case 'A': //case GLUT_KEY_LEFT:
            if(select==true)
            {
                px-=Munit;  //Left
                wx-=wxMunit;
                draw_Quad();
            }
           break;
        case 'd': case 'D': //case GLUT_KEY_RIGHT:
            if(select==true)
            {
                px+=Munit;  //0.05--2.5//Right
                wx+=wxMunit;
                draw_Quad();
            }
           break;
        case 'w': case 'W': //case GLUT_KEY_UP:
            if(select==true)
            {
            py+=Munit;  //Up
            wy+=wxMunit;
            draw_Quad();
            }
           break;
        case 's': case 'S': //case GLUT_KEY_DOWN:
            if(select==true)
            {
            py-=Munit;  //Down
            wy-=wxMunit;
            draw_Quad();
            }
           break;

        case 'r' : case 'R' :
            glColor3f(1.0, 0.0, 0.0);  //Red
            draw_Quad();
           break;
        case 'g' : case 'G' :
            glColor3f(0.5, 1.0, 0.5);  //Green
            draw_Quad();
            break;
        case 'b' : case 'B' :
            glColor3f(0.0, 0.0, 1.0);  //Blue
            draw_Quad();
           break;
        case 'q' : case 'Q' :
           exit ( EXIT_SUCCESS);
           break;
    }
}

void mouse_action(int btn, int state, int x, int y)
{
    if(btn==GLUT_RIGHT_BUTTON)
    {
        glClearColor(1.0, 1.0, 1.0, 0.0);
        glClear(GL_COLOR_BUFFER_BIT);
        draw_Quad();
    }
    if(btn==GLUT_LEFT_BUTTON && state==GLUT_DOWN)
    {    
        Positions(x,y);
printf("Xs: %d\nYs: %d\n\n",x,y);
if((x>0 && y>0) && (x<=10 && y<=10))
printf("OKsss\n");
    }
}

void mydisplay(void)
{
glClearColor(0.8, 1.0, 0.8, 0.0);
glClear(GL_COLOR_BUFFER_BIT);

    glColor3f(0.0, 0.0, 0.0); //Black

    draw_Quad();
glFlush();
}

int main(int argc, char** argv)
//int _tmain(int argc, _TCHAR* argv[])
{
    glutInit(&argc,argv);
    glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);
    glutInitWindowSize(500,500);
    glutInitWindowPosition(500,150);
    glutCreateWindow("Move_Game => Author: Kazemian");
    
    //init(); //!!!!!

    glutDisplayFunc(mydisplay);
    glutMouseFunc (mouse_action);
    
    glutKeyboardFunc( my_key_events );
    //glViewport(0,0,2,2);

glutMainLoop();
return 0; 
}

----------


## amin1softco

یکمی اصلاحات برات انجام دادم ولی انگار کلاً ما در و دیوار حرف می زنیم !!!

// glut.cpp : Defines the entry point for the console application.
//

// Select_Move_shape.cpp : Defines the entry point for the console application.
 
#include "stdafx.h"
#include <stdlib.h>
#include <GL/glut.h>
 
GLsizei wh = 500, ww = 500,color=1;
 
GLfloat px = 0.0;
GLfloat py = 0.0;
GLfloat Munit = 1;
 
GLfloat wx = ww/2;
GLfloat wy = wh/2;
GLfloat wxMunit = wx * Munit;
GLfloat wyMunit = wy * Munit;
 
bool select=false;
GLfloat size = 200;
GLfloat PXsize = wx* size;
GLfloat PYsize = wy* size;
 
 
void draw_Quad()
{
    glBegin(GL_QUADS);
  glVertex2f(px, py);
    glVertex2f(px, py+size);
    glVertex2f(px+size, py+size);
    glVertex2f(px+size, py);
    glEnd();

}
void draw_OQuad()
{
    glColor3f(1.0, 0.0, 0.0);
    glBegin(GL_LINE_LOOP);
    glVertex2f(px, py);
    glVertex2f(px, py+size);
    glVertex2f(px+size, py+size);
    glVertex2f(px+size, py);
    glEnd();
}
 
void Positions(int x,int y)
{
    //x = ww - x;
    y = wh - y;
 
    if((x>(wx-PXsize) && x<(wx+PXsize))) //(float)
        if((y<(wy+PYsize) && y>(wy-PYsize)))
        {
            select=true;
         
        glClearColor(0.5, 0.5, 1.0, 0.0);
        glClear(GL_COLOR_BUFFER_BIT);
        draw_Quad();
        }
    else
    {
        select=false;
        glClearColor(0.5, 1.0, 0.5, 0.0);
        glClear(GL_COLOR_BUFFER_BIT);
    draw_Quad();
    }
glFlush();
}
 
void my_key_events (unsigned char key, int x, int y )
{
    int k=key;
    printf("Key Value Is: %d\n",k);
    switch ( key ) {
        case 'a': case 'A': //case GLUT_KEY_LEFT:
            if(select==true)
            {
                px-=Munit;  //Left
                wx-=wxMunit;
                
            }
           break;
        case 'd': case 'D': //case GLUT_KEY_RIGHT:
            if(select==true)
            {
                px+=Munit;  //0.05--2.5//Right
                wx+=wxMunit;
                
            }
           break;
        case 'w': case 'W': //case GLUT_KEY_UP:
            if(select==true)
            {
            py+=Munit;  //Up
            wy+=wxMunit;
            
            }
           break;
        case 's': case 'S': //case GLUT_KEY_DOWN:
            if(select==true)
            {
            py-=Munit;  //Down
            wy-=wxMunit;
            
            }
           break;
 
        
        case 'q' : case 'Q' :
           exit ( EXIT_SUCCESS);
           break;
    }
}
 
void mouse_action(int btn, int state, int x, int y)
{
    y=wh-y;
    if(btn==GLUT_RIGHT_BUTTON)
    {
        draw_Quad();
    }
    if(btn==GLUT_LEFT_BUTTON && state==GLUT_DOWN)
    {   
        //Positions(x,y);
printf("Xs: %d\nYs: %d\n\n",x,y);

if (x>=(px-size) && x<=(px+size) && y<= (py+size) &&y>= (py-size))
 select=true;
else
    select=false;
printf("select: %d\n",select);

    }
}
 
void mydisplay(void)
{
        glClearColor(0.8, 1.0, 0.8, 0.0);
glClear(GL_COLOR_BUFFER_BIT);
 
    glColor3f(0.0, 1.0, 0.0); //Black
 
    draw_Quad();
     if (select) draw_OQuad();
     

     
    glutSwapBuffers(); 
glFlush();
}
 
int main(int argc, char** argv)
{
    glutInit(&argc,argv);
    glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB);
    glutInitWindowSize( wh,ww);
    glutInitWindowPosition(500,150);
    glutCreateWindow("Move_Game => Author: Kazemian");
     
    glClearColor(0.8, 1.0, 0.8, 0.0);
glMatrixMode(GL_PROJECTION); //projection parameters
gluOrtho2D(0.0,wh,0.0,ww); //sets up WC extent
 
    glutDisplayFunc(mydisplay);
    glutIdleFunc(mydisplay);
    glutMouseFunc (mouse_action);
     
    glutKeyboardFunc( my_key_events );
  glutIdleFunc(mydisplay);
glutMainLoop();
return 0;
}

----------


## kazemiam

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



> یکمی اصلاحات برات انجام دادم ولی انگار کلاً ما در و دیوار حرف می زنیم !!!
> 
> glMatrixMode(GL_PROJECTION); //projection parameters
> gluOrtho2D(0.0,wh,0.0,ww); //sets up WC extent
>   
>     glutDisplayFunc(mydisplay);
>     glutIdleFunc(mydisplay);
>     glutMouseFunc (mouse_action);
>       
>   glutIdleFunc(mydisplay);


یعنی درو دیوار برنامه؟
یه چند تا سوال:
به اشتباه از دو تابع Idle استفاده شده؟ یا دلیل خاصی داره؟
تابع Ortho دقیقا چیه و چطوری کار میکنه؟

و اینکه من برای نمایش حالت انتخاب، از خط دور شکل استفاده کردم ولی درست نشون نمیداد!!  :ناراحت: 
میشه توضیح بدید که از چه ترفندی استفاده کردید؟

----------


## amin1softco

مشکل از شرط سلکت است دیگه اینجوری درست می شه 
if (x>=(px) && x<=(px+size) && y<= (py+size) &&y>= (py))
 select=true;
else
    select=false;

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

----------


## kazemiam

درسته مشکل برطرف شد.  :تشویق: 
فقط الان دارم سعی میکنم با این حلقه ی تکراری که شما گفتید کنار بیام تا برنامه رو به سبک دیگه ای تغییر بدم(یه جور تمرین).!!!



> اما  اگه دقت کنید همون مشکلی که توی کد من هستش، داخل کد شما هم وجود  داره!!!
> 
> و اینکه من برای نمایش حالت انتخاب، از خط دور شکل استفاده کردم ولی درست نشون نمیداد!!


بنده هم همچین تابعی نوشته بودم، فقط دیدم درست کار نمیکنه پاکش کردم!!
البته اون تابع رو داخل تابع Position استفاده کرده بودم که شما زحمت کشیدید کلا بیخیال تابع Position شدی. :متفکر: 





> کد من مثل شماست ؟! یا حضرت ....


مشکلمون شبیه به همه، وگرنه کد شما کجا و کد ما...  :لبخند گشاده!: 
ما که جسارت نمیکنیم، پوزش مرا پذیرا باشید. :خجالت: 
ممنون.

----------


## mgshervin

سلام دوستان 
من با ویژوال استادیو 2012 هر برنامه ای که برای OpenGL مینویسم ارر میده و نمیتونه فایل exe  را ایجاد کنه باید چیکار کنم ؟

----------


## mgshervin

من این کد صفحه 321 کتاب قلی زاده را نوشتم ولی با این که مثل کتابه باز ارر میده کدش را اینجا میزارم از دوستان میخوام که کمک کنن ببینن مشکل چیه 
پیشاپیش سپاس گذارم 
این کد الگوریتم برش چند ضلعی ساترلند-هاگمن هستش


# include<stdlib.h>
# include <GL/glut.h>
# include <math.h>
# include <iostream.h>
class wcPt2D {
	public:
	GLfloat x, y;
	};
typedef enum {Letf, Right, Bottom, Top } Boundary;
const GLint nClip = 4;
GLint inside (wcPt2D p, Boundary b, wcPt2D wMin, wcPt2D wMax)
{
	switch (b) {
	case Left: if (p.x < wMin.x) return (false); break;
	case Right: if (p.x > wMax.x)return (false); break;
	case Bottom: if (p.y < wMIn.y)return (false); break;
	case Top: if (p.y > wMax.y) return (false); break;
	}
	return (true);
}
GLint cross (wcPt2D p1, wcPt2D p2, Boundary winEdge, wcPt2D wMin, wcPt2D wMax)
{
if (inside (p1, winEdge, wMin, wMax) == inside (p2, winEdge, wMin, wMax))
return (false);
else return (true);
}
wcPt2D intersect (wcPt2D p1, wcPt2D p2, Boundary winEdge, wcPt2D wMin, wcPt2D wMax)
{
	 wcPt2D iPt;
	 GLfoat m;

	 if (p1.x!= p2.x) m= (p1.y - p2.y) / (p1.x - p2.x);
	 switch (winEdge) {
	 case Left:
		iPt.x = wMin.x;
		iPt.y = p2.y + (wMin.x - p2.x) * m;
		break;
	 case Right:
		iPt.x = wMax.x;
		iPt.y = p2.y + (wMax.x - p2.x) * m;
		break;
	 case Bottom:
		iPt.y = wMin.y;
		if (p1.x!= p2.x) iPt.x = iPt.x = p2.x + (wMin.y - p2.y) / m;
		else iPt.x = p2.x;
		break;
	 case Top:
		iPt.y = wMax.y;
		if (p1.x != p2.x) iPt.x = p2.x + (wMax.y - p2.y) / m;
		else iPt.x = p2.x;
		break;
		}
		return (iPt);
}
void clipPoint (wcPt2D p, wcPt2D p2, Boundary winEdge, wcPt2D wMin, wcPt2D wMax
						wcPt2D * pOut, int * cnt, wcPt2D first[], wcPt2D * s)
{
wcPt2D iPt;

if (!first[winEdge])
	first[winEdge] = &p;
	else
	if (cross (p, s[winEdge], winEdge, wMin, wMax)){
		iPt = intersect (p, s[winEdge], winEdge, wMin, wMax);
		if (winEdge < Top)
			clipPoint (iPt, b+1, wMin, wMax, pOut, cnt, first, s);
		else {
			pOut[*cnt] = iPt;  (*cnt)++;
		}
	}
s[winEdge] = p;
if (inside (p, winEdge, wMin, wMax))
	if (winEdge < Top)
		clipPoint (P, winEdge + 1, wMin, wMax, pOut, cnt, first, s);
	else {
		pOut[*cnt] = p; (*cnt)++;
		}
	}
void closeClip (wcPt2D wMin, wcPt2D wMax, wcPt2D * pOut, GLint * cnt, wcPt2D * first[ ], wcPt2D * s)
{
  wcPt2D pt;
  Boundary winEdge;

  for (winEdge = Left ; winEdge <= Top ; winEdge++) {
	if (cross (s[winEdge], *first[winEdge], winEdge, wMin, wMax)) {
	pt = intersect (s[winEdge], *first[winEdge], winEdge, wMin, wMax);
	if (winEdge < Top)
		clipPoint (pt, winEdge + 1, wMin, wMax, pOut, cnt, first, s);
	else {
		pOut[*cnt] = pt; (*cnt)++;
		}
	}
  }
}
GLint polygonClipSuthHodg (wcPt2D wMin, wcPt2D wMax, GLint n, wcPt2D * pIn, wcPt2D * pOut)
{
	wcPt2D * first[nClip] = {0, 0, 0, 0 }, s[nClip]:
	GLint k, cnt = 0;
	for (k = 0; k < n; k++)
		clipPoint (pIn[k], Left, wMin, wMax, pOut, &cnt, first, s);
	closeClip (wMin, wMax, pOut, &cnt, first, s);
	return (cnt);
}

----------


## orache

نمیدونم چه اروری میده ولی در خط 9 این کد شما نوشتین Letf   شما اول نوشتین Letf ولی بعد از Left استفاده کردین  :لبخند:

----------


## mehran788

> Error 1 error LNK2019: unresolved external symbol _WinMain@16 referenced in function ___tmainCRTStartup MSVCRTD.lib atefe2
> 
> 
> Error 2 fatal error LNK1120: 1 unresolved externals C:\Users\ensi\Documents\Visual Studio 2008\Projects\atefe2\Debug\atefe2.exe atefe2
> 
> 
> این 2تا خطا چی میگه ؟ من دیگه واقعا گیچ شدم . کسی نمیاد به این مساله رسیدگی کنه :(


دوستان این خطاها رو به من میده.
نمی دونم مشکل از چیه.خواهش می کنم کمکم کنید  :افسرده:

----------


## gta0007

با سلام خسته نباشين

بصورت رايگان بازديد کننده وبسايت شمارو افزايش ميديم
  سايت اسکاي رنک (سامانه افزايش سريع بازديد و بهبود رتبه السکا) تنها سايت اسکاي رنک چنين فرصتي به شما داده تا رتبه وبسايت خود رو در السکا بالا ببريد پس از همين حالا در سايت عضو بشين و آدرس وبسايت خود رو تو پنل کاربريتون اضافه کنيد و به بازديد اتومات و خريد بازديد بپردازيد موفق باشيد
http://skyrank.ir/
09397951796

----------


## kazemiam

با سلام و خسته نباشید،

یه چندتایی سوال دارم!!

چطوری میتونم شدت تابش یه منبع نور رو کم و زیاد کنم؟
خودم فکر میکنم باید پارامتر چهارم A0 رو تغییر بدم، اما شاید چون هنوز کامل با OpenGL آشنا نشدم، نتونستم!!!  :ناراحت: 
GLfloat A0[4]={1,0,0,1};
glLightfv(GL_LIGHT0,GL_DIFFUSE,A0);

یه سوال دیگه اینکه چطور میتونم دوربین رو حرکت بدم و با رسیدن به یک شیئ با کلید های جهتی *دور اون شیئ بچرخم*؟
وقتی فقط مختصات چشم(دوربین) رو تغییر میدم به شکل خیلی بدی جابجا میشه!!
وقتی مختصات دوربین و مختصات نقطه فوکوس شده رو با هم تغییر میدم به صورت موازی جابجا میشه.
و زمانی که مختصات نقطه فوکوس شده رو تغییر میدم مثل اینه که دوربین روی پایه قرار گرفته و به اطراف میچرخه.البته نمیدونم چرا بیش از 180 درجه نمیچرخه؟!
(البته روش بهتری برای این کار نیاز دارم که با چرخش دوربین، سمت حرکت برای کاربر مثل قبل باشه و تغییری نکنه یعنی با کلید جلو فقط جلو بره و چپ و راست نره!!)
لطفا پارامتر های خود تابع Perspectiv رو هم یه مخصر توضیح بدید.   :خجالت: 

سوال بعدی هم اینه، چطور میتونم *فقط یک شیئ* سه بعدی رو به شکل شفاف(شیشه ای) تبدیل کنم؟

با تشکر از زحمات شما.   :چشمک:

----------


## mehran788

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

----------


## davod_

درود به دوستان

این سه خط چیکار میکنه؟ممنون میشم راهنماییم کنین
glutAttachMenu(GLUT_RIGHT_BUTTON);
    glutAttachMenu(GLUT_MIDDLE_BUTTON);
    glutMouseFunc(mouse);

سپاس

----------


## mehran788

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


دوستان بالاخره این رو پیدا کردم
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	glColor3f(1.0,0.0,0.0);
	glPushMatrix();
	glTranslatef(-0.6,0,0);
	glRotatef(t,t,t,0);
    glutSolidTeapot(0.2);
	glPopMatrix();

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

----------


## orache

سلام داداش ببین تو که میگی هنوز اول کاری ! اخه نه اصلا از دوربین استفاده کردی نه از هیچی الان دقیقا هم منظورتو نفهمیدم چیه میخای 3 تا قوری بسازی که رو هم نیافتن ؟؟ یعنی با فاصله از هم ساخته بشن ؟؟ اینکه کاری نداره فکر کنم تو همون کتاب انگیسیه گفته بود 
بیا ببین منظورت همینه یا خیر 
#include <freeglut.h>
void display () {
    glClear(GL_COLOR_BUFFER_BIT);
    glMatrixMode(GL_MODELVIEW);
    glPushMatrix();
    glPushMatrix();
    glTranslatef(0,0,-3);
    glutWireTeapot(1);               
    glTranslatef(0,2,0);
    glutSolidTeapot(1);       
    glPopMatrix();
    glTranslatef(0,-2,-1);
    glutSolidTeapot(1);         
    glPopMatrix();
    glFlush();
}

void reshape ( int width, int height )
{
    glViewport(0,0,width,height);
}

int main ( int argc, char * argv[] )
{
    glutInit(&argc,argv);
    glutInitWindowSize(500,500);
    glutInitWindowPosition(0,0);
    glutInitDisplayMode(GLUT_RGB);
    glutCreateWindow("mehran!");
    glutDisplayFunc(display);
    glutReshapeFunc(reshape);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(60,1,1,10);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    gluLookAt(0.0,0.0,5.0,0.0,0.0,0.0,0.0,1.0,0.0);
    glutMainLoop();
}

----------


## mehran788

> سلام داداش ببین تو که میگی هنوز اول کاری ! اخه نه اصلا از دوربین استفاده کردی نه از هیچی الان دقیقا هم منظورتو نفهمیدم چیه میخای 3 تا قوری بسازی که رو هم نیافتن ؟؟ یعنی با فاصله از هم ساخته بشن ؟؟ اینکه کاری نداره فکر کنم تو همون کتاب انگیسیه گفته بود 
> بیا ببین منظورت همینه یا خیر 
> #include <freeglut.h>
> void display () {
>     glClear(GL_COLOR_BUFFER_BIT);
>     glMatrixMode(GL_MODELVIEW);
>     glPushMatrix();
>     glPushMatrix();
>     glTranslatef(0,0,-3);
> ...


دمت گرم داداش
چیزی که می خواستم رو از روش پیدا کردم
خیلی آقایی

----------


## kazemiam

> درود به دوستان
> 
> این سه خط چیکار میکنه؟ممنون میشم راهنماییم کنین
> glutAttachMenu(GLUT_RIGHT_BUTTON);
>     glutAttachMenu(GLUT_MIDDLE_BUTTON);
>     glutMouseFunc(mouse);
> 
> سپاس


سلام دوست عزیز،
خط اول برای ارتباط کلید راست به منویی که از قبل نوشته شده هست و همچنین خط دوم نیز برای ارتباط منو با کلید وسط موس هستش.
خط آخر هم تابع کالبکی هستش که باید به برنامه بفهمونیم از کدوم تابع برای عکس العمل نشون دادن به رویدادهای موس استفاده کنه، که در تابع main نوشته میشه و اسمی که در ورودی اون نوشته شده(mouse) همون تابع مورد نظر هستش.

----------


## mehran788

سلام 
من می خواستم یه برنامه به شیوه rastering بنویسم و نحوه نوشتن به این شیوه رو هم مطالعه کردم ولی آدرس دهی خونه ها رو خوب متوجه نشدم.میشه کمی به من توضیح بدین جریان چیه؟
ممنون از لطفتون

----------


## amin1softco

یکی از دوستان در مورد بافت ها سئوال پرسیده بود و در خواست یک مثال ساده از لود کردن یک فایل bmp توسط سی++ و قرار دادن بعنوان بافت را داشته بود من این کد را زدم که ضمیمه این پست است <br>
برای اینکار ما ابتدا باید فایل را باز کنیم و هدر های فایل را بخونیم و اندازه طول و عرض فایل بیتمپ را بدست بیاریم و بعد از اون بوسیله توابع یک تکسچر ایجاد و مقید کنیم برای توضیحات مفصل تر از لینک های زیر استفاده کنید :
http://nehe.gamedev.net/tutorial/texture_mapping/12038/
http://www.opengl-tutorial.org/begin...textured-cube/



#include <iostream>
#include <GL/gl.h>  //سر فایل که هسته اپن جی ال را به برنامه اضافه می کند

#include <GL/glut.h>//سر فایل برای اضافه کردن توابع مورد نیاز ایجاد پنجره 

GLfloat angle = 0.0;// برای چرخش مکعب ااین متغیر استفاده می کنیم ز 

GLuint textureID; // ایجاد یک متغیر برای ایجاد شناسه برای بافت
GLuint loadBMP_custom(const char * imagepath){// تابع ساده برای لود کردن تصاویر بیتمپ از نوع 24 بیتی

// خواندن اطلاعات هدر فایل بیتمپ
unsigned char header[54]; // هر فایل بیتمپ با 54 بایت هدر شروع می شود که در این متغیر ذخیره می شود
unsigned int dataPos;     // نگهداری موقعیت ما در فایل که تا کجا خوانده شده
unsigned int width, height;// متغیر برای ذخیره کردن طول و عرض بیتمپ
unsigned int imageSize;   // = width*height*3  اندازه کلی تصویر برابر است با طول در عرض در 3 که شامل 3 مقدار رنگی است
// داده های واقعی بیتمپ در این متغیر ذخیره می شوند
unsigned char * data;

// باز کردن فایل 
FILE * file = fopen(imagepath,"rb");//آدرس از ورودی تابع اصلی گرفته می شود
if (!file)                              {printf("Image could not be opened\n"); return 0;}

if ( fread(header, 1, 54, file)!=54 ){ // اگر 54 بایت هدر نداریم پس یک مشکل وجود دارد
    printf("Not a correct BMP file\n");
    return 0;
}
//هر فایل بیتمپ با این دو حرف شروع می شود
if ( header[0]!='B' || header[1]!='M' ){
    printf("Not a correct BMP file\n");
    return 0;
}

// گرفتن اطلاعات از هدری که قبلاً خوانده شده
dataPos    = *(int*)&(header[0x0A]);
imageSize  = *(int*)&(header[0x22]);
width      = *(int*)&(header[0x12]);
height     = *(int*)&(header[0x16]);

// بعضی فایل های بیتمپ درست قالب بندی نشده اسند 
if (imageSize==0)    imageSize=width*height*3; 
if (dataPos==0)      dataPos=54; // گذر از هدر فایل بیتمپ

// ساخت یک بافر
data = new unsigned char [imageSize];
 
// خواندن داده های واقعی از فایل به داخل بافر
fread(data,1,imageSize,file);
 
//همه چیز در حافظه است الان می تونیم فایل را ببندیم
fclose(file);

//بیتمپ ها با فرمت بی جی آر ذخیره می شوند  
//است که باید به آرایش ار جی بی تبدیل شود.
    //BGR 2 RGB
for (int i = 0; i < imageSize; i+=3)
            {    
                char c = data[i];
                data[i] = data[i+2];
                data[i+2] = c;
            }


glGenTextures(1, &textureID);    // ساخت یک بافت اپن جی ال
 
glBindTexture(GL_TEXTURE_2D, textureID);// مقید سازی بافت ساخته شده جدید تمام توابع بعدی این بافت را تغییر می دهند
 
// دادن تصویر به اپن جی ال
glTexImage2D(GL_TEXTURE_2D, 0,GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data);
 glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTE  R,GL_LINEAR); // فیلتر سازی خطی 
 glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTE  R,GL_LINEAR); 
}
void init (void) {
    
    loadBMP_custom("NeHe.bmp");      // لود کردن تصویر از آدرس داده شده
glEnable(GL_TEXTURE_2D);                        // فعال کردن نگاشت بافت دو بعدی
    glShadeModel(GL_SMOOTH);                        // فعال کردن نرم کننده 
    glClearColor(0.0f, 0.0f, 0.0f, 0.5f);                   // مشخص کردن رنگ بک گراند
    glClearDepth(1.0f);                         // فعال کردن بافر عمق
    glEnable(GL_DEPTH_TEST);                        // فعال کردن تست عمق
    glDepthFunc(GL_LEQUAL);                         // مشخص کردن نوع تست عمق
    glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);          // ساخت پرسپکتیو 
glBlendFunc(GL_SRC_ALPHA,GL_ONE); // فعال کردن بلندینگ و مشخص کردن نوع ان
glEnable(GL_BLEND);
}
void display (void) {

glClearColor (0.0,0.0,0.0,1.0);
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);// پاک کردن بافر
glLoadIdentity();   // لود ماتریس همانی یا 1
gluLookAt (0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);//مشخص کردن موقعیت دوربین
glRotatef(angle, 1.0, 0.0, 0.0);//چرخش با زاویه آنگل
glRotatef(angle, 0.0, 1.0, 0.0);//چرخش با زاویه آنگل
glRotatef(angle, 0.0, 0.0, 1.0);//چرخش با زاویه آنگل

    glBegin(GL_QUADS);
        /*برای نگاشت صحیح یک بافت روی مکعب , شما باید مطمئن شوید که بالا سمت راست بافت به بالا سمت راست مکعب نگاشت میشود و به همین ترتیب گوشه های دیگر اگر گوشه ها با یکدیگر مچ نشوند ممکن است تصویری نمایش داده نشود یا تصویر بر عکس شود ویا...
اولین glTexCoord2f روی محور ایکس سمت چپ است 0.5f وسط بافت و 1.0f سمت راست بافت است .
بنابراین حالا ما می دانیم که گوشه بالا سمت چپ با 0.0f در محور x و 1.0f برای محور y در بافت و بالا سمت چپ مکعب دارای مختصات -1.0f برای x و 1.0f برای محور  y است و به همین ترتیب تا آخر*/
        glTexCoord2f(0.0f, 0.0f); //مشخص کردن مختصات بافت 
        glVertex3f(-1.0f, -1.0f,  1.0f);//مشخص کردن رأس اول مکعب
        glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f,  1.0f);
        glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f,  1.0f,  1.0f);
        glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f,  1.0f,  1.0f);
        // Back Face
        glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f);
        glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f,  1.0f, -1.0f);
        glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f,  1.0f, -1.0f);
        glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f);
        // Top Face
        glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f,  1.0f, -1.0f);
        glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f,  1.0f,  1.0f);
        glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f,  1.0f,  1.0f);
        glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f,  1.0f, -1.0f);
        // Bottom Face
        glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, -1.0f, -1.0f);
        glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, -1.0f, -1.0f);
        glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f,  1.0f);
        glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f,  1.0f);
        // Right face
        glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f);
        glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f,  1.0f, -1.0f);
        glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f,  1.0f,  1.0f);
        glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f,  1.0f);
        // Left Face
        glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f);
        glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f,  1.0f);
        glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f,  1.0f,  1.0f);
        glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f,  1.0f, -1.0f);
    glEnd();



glutSwapBuffers();
angle ++;

}

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);

}

int main (int argc, char **argv) {

glutInit (&argc, argv);

glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);

glutInitWindowSize (500, 500);

glutInitWindowPosition (100, 100);

glutCreateWindow ("A basic OpenGL Window");

init ();

glutDisplayFunc (display);

glutIdleFunc (display);

glutReshapeFunc (reshape);

glutMainLoop ();

return 0;

}

----------


## orache

اقا یک سوال داشتم من چجوری میتونم حرکت موس رو پیدا کنم ؟؟ و چجوری میتونم بگم وقتی موس  روی فلان ابجکت رفت فلان اتفاق بی افته 
در کل میخام این کار رو انجام بدم -> یک مربع 2 بعدی ترسیم کنم و وقتی موس روی اون مربع قرار گرفت و کلید چپ زده شد و موس به هرطرف رفت اون مربع هم به همون طرف بده 
کسی میتونه کمکم کنه ؟؟ 
ممنون

----------


## amin1softco

من والا چندتا مثال برای کار با مأوس گذاشتم قبلاً 
حالا نمی دونم این درسته یا نه ولی من خودم اگر بودم اول یک لیست پیوندی درست می کردم و اسمش را می گذاشتم لیست نمایش و بعد برای هر فرم می اومدم و یک بار این لیست را پیمایش می کردم و در هر گره مختصات آبجکت یا شکل را ذخیره می کردم مثلاً دو تا متغیر x,y + اینکه یک شرط که در اون فرم مختصات مأوس کجاست و یک فلگ مثلاً تعریف می کردم که با شرط بیاد و چک کنه اگر مختصات مأوس با مختصات این  آبجکت بر خورد داره اون فلاگ مقدارش عوض بشه  و اینجوری کل صحنه دستم بود 
برای همین مثالم این کفایت می کنه ولی چون یک مربع بیشتر نیست می تونید یک کلاس تعریف کنید مختصات این مربع در اون ذخیره بشه.....

----------


## orache

نه داداش ببین من باید یه جوری این کد رو بنویسم که بتونم تو کتابخونه ی خودم بذارمش و به عنوان مثال یککاربر بتونه با 1 خط کد همه چی رو تعریف کنه من دارم از دستورات جی ال یو تی استفاده میکنم (فعلا )  :لبخند گشاده!:

----------


## mehran788

> یکی از دوستان در مورد بافت ها سئوال پرسیده بود و در خواست یک مثال ساده از لود کردن یک فایل bmp توسط سی++ و قرار دادن بعنوان بافت را داشته بود من این کد را زدم که ضمیمه این پست است <br>
> برای اینکار ما ابتدا باید فایل را باز کنیم و هدر های فایل را بخونیم و اندازه طول و عرض فایل بیتمپ را بدست بیاریم و بعد از اون بوسیله توابع یک تکسچر ایجاد و مقید کنیم برای توضیحات مفصل تر از لینک های زیر استفاده کنید :
> http://nehe.gamedev.net/tutorial/texture_mapping/12038/
> http://www.opengl-tutorial.org/begin...textured-cube/
> 
> 
> 
> #include <iostream>
> #include <GL/gl.h>  //سر فایل که هسته اپن جی ال را به برنامه اضافه می کند
> ...




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

----------


## mehran788

حل شد  :لبخند گشاده!: 
#include "stdafx.h"
#include <gl/freeglut.h>
#include <iostream>
#include <gl/glut.h>

static bool p=true;
GLfloat rot = 0.0;

GLuint textureID; 
GLuint loadBMP_custom(const char * imagepath)
{
unsigned char header[54]; 
unsigned int dataPos;     
unsigned int width, height;
unsigned int imageSize;  
unsigned char * data;
FILE * file = fopen(imagepath,"rb");
if (!file)                       
{
	printf("Image could not be opened\n"); return 0;
}

if ( fread(header, 1, 54, file)!=54 )
{
    printf("Not a correct BMP file\n");
    return 0;
}

if ( header[0]!='B' || header[1]!='M' )
{
    printf("Not a correct BMP file\n");
    return 0;
}


dataPos    = *(int*)&(header[0x0A]);
imageSize  = *(int*)&(header[0x22]);
width      = *(int*)&(header[0x12]);
height     = *(int*)&(header[0x16]);


if (imageSize==0)    imageSize=width*height*3; 
if (dataPos==0)      dataPos=54; 


data = new unsigned char [imageSize];
 

fread(data,1,imageSize,file);
 

fclose(file);

for (int i = 0; i < imageSize; i+=3)
			{	
				char c = data[i];
				data[i] = data[i+2];
				data[i+2] = c;
			}


glGenTextures(1, &textureID);    
 
glBindTexture(GL_TEXTURE_2D, textureID);
 
// دادن تصویر به اپن جی ال
glTexImage2D(GL_TEXTURE_2D, 0,GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data);
 glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTE  R,GL_LINEAR); 
 glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTE  R,GL_LINEAR); 
}
void init (void) {
glEnable(GL_TEXTURE_2D);                      
    glShadeModel(GL_SMOOTH);                        
    glClearColor(0.0f, 0.0f, 0.0f, 0.5f);                 
    glClearDepth(1.0f);                
    glEnable(GL_DEPTH_TEST);                    
    glDepthFunc(GL_LEQUAL);                         
    glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);          
glBlendFunc(GL_SRC_ALPHA,GL_ONE); 
glEnable(GL_BLEND);
}
void display (void) {

glClearColor (0.0,0.0,0.0,1.0);
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity(); 
gluLookAt (0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
if (p==true)
{
	glPushMatrix();
	loadBMP_custom("nehe.bmp");
	glRotatef(rot, 0.0, 1.0, 0.0);
	glBegin(GL_QUADS);
		glTexCoord2f(0.0f, 0.0f);  glVertex3f(1.0f,-1.0f,  1.0f);
		glTexCoord2f(1.0f, 0.0f); glVertex3f( 3.0f, -1.0f,  1.0f);
		glTexCoord2f(1.0f, 1.0f); glVertex3f(2.0f,  0.0f,  1.0f);
		glTexCoord2f(0.0f, 1.0f); glVertex3f( 3.0f,  -1.0f,  1.0f);
	glEnd();
	glPopMatrix();
	glPushMatrix();
	loadBMP_custom("nehe1.bmp");
	glRotatef(rot,1.0,0.0,0.0);
	glTranslatef(-2,0,0);
	glutSolidTeapot(0.5);
	glPopMatrix();
}
else
{
	glPushMatrix();
	loadBMP_custom("nehe1.bmp");
	glRotatef(rot, 0.0, 1.0, 0.0);
	glBegin(GL_QUADS);
		glTexCoord2f(0.0f, 0.0f);  glVertex3f(1.0f, -1.0f,  1.0f);
		glTexCoord2f(1.0f, 0.0f); glVertex3f( 3.0f, -1.0f,  1.0f);
		glTexCoord2f(1.0f, 1.0f); glVertex3f(2.0f,  0.0f,  1.0f);
		glTexCoord2f(0.0f, 1.0f); glVertex3f( 3.0f,  -1.0f,  1.0f);
	glEnd();
	glPopMatrix();
	glPushMatrix();
	loadBMP_custom("nehe.bmp");
	glRotatef(rot,1.0,0.0,0.0);
	glTranslatef(-2,0,0);
	glutSolidTeapot(0.5);
	glPopMatrix();
}
glutSwapBuffers();

}
void idle()
{
	rot++;
	display();
}


void keyboard (unsigned char key, int x, int y)
{
	if (key=='a')
	{
		if (p==true)
			p=false;
		else
			p=true;
	}
}

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);

}

int main (int argc, char **argv) {

glutInit (&argc, argv);

glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);

glutInitWindowSize (1000, 600);

glutInitWindowPosition (100, 100);

glutCreateWindow ("Textured");

init ();

glutDisplayFunc (display);

glutIdleFunc (idle);

glutReshapeFunc (reshape);

glutKeyboardFunc(keyboard);

glutMainLoop ();

return 0;

}


بازم ممنون از جناب amin1softco

----------


## 3pid71

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


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


در مورد pick up کردن و حرکت دوربین هم دوستان قبلا سوال پرسیدن ولی جواب داده نشده ، کسی هست که توابع مربوط به اینارو توضیح بده.مثلا ما تو یه فضای 3 بعدی 8 تا نقطه داریم(رئوس یک مکعب مستطیل) و حالا میخوایم یکی از رئوس رو انتخاب کنیم و اونو حرکت بدیم + اینکه دوربین رو هم بتونیم حرکت بدیم

----------


## pswin.pooya

سلام برای انتخاب راه های زیادی وجود داره و بیشتر بسته به اینه که از کدوم ویرایش استفاده می کنید. اگر از ویرایش OpenGL 1.2 استفاده می کنید خود API یک دستورالعمل داره که توضیحاتش در لینک زیر موجوده:

http://www.glprogramming.com/red/chapter13.html

برای ویرایش های بالاتر بهتره یا از شیدرها استفاده بشه و یا اینکه از روش Ray Pickup که توضیحاتش در کتاب DirextX 9 Game Programming هست استفاده بشه.


لطفا سوالها رو در تاپیکهای جدا بپرسید

----------


## amin1softco

این فایل رفرنس های OpenGL2 است که می تونید با یک سرچ ساده بهش دست پیدا کنید فایل ضمیمه است . 

برای پیک کردن به بخش مثال های OpenGL یکسری بزنید فک کنم کارتون راه بندازد.
http://nehe.gamedev.net/tutorial/pic...sorting/16005/

----------


## Saraji

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

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

----------


## Saraji

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


توابع هر سه ی اینها به اسم Teapot Torus & Clone وجود داره که البته clone با استفاده از glucylinder که شعاع دایره ی بالایی رو صفر می دیم رسم می شه. سرچ شما رو به جواب می رسونه.

----------


## amin1softco

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


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

GLUquadricObj *quadratic;
quadratic = gluNewQuadric();
glRotatef(90.0f, 0.0f, 1.0f, 0.0f);
gluCylinder(quadratic,0.1f,0.1f,3.0f,32,32);


و سپس با توابع glPushMatrix glRotatef آن را در محور مورد نظر بچرخان شکل می شه محور مختصات.

----------


## 3pid71

> برای پیک کردن به بخش مثال های OpenGL یکسری بزنید فک کنم کارتون راه بندازد.
> http://nehe.gamedev.net/tutorial/pic...sorting/16005/


این لینکی که دادید باز نمیشه :/

----------


## amin1softco

ایران تحریم است . 1- فیلتر شکن 2- استفاده از کش گوگل 3- دانلود نسخه کامل آموزش های nehe 
و...

----------


## 3pid71

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

 #include<gl/glut.h>
float lastX = -1.0f;
float lastY = -1.0f;
float xdiff = 0.0f;
float ydiff = 0.0f;
bool mouseDown = FALSE;
void init()
{
	glClearColor(0,0,0,0);
	glMatrixMode(GL_PROJECTION);
	gluOrtho2D(0,2000,0,1000);
}
void display()
{
	glClear(GL_COLOR_BUFFER_BIT);
	glEnable(GL_POINT_SMOOTH);
	glPointSize(10); glBegin(GL_POINTS);
	glColor3f(1.0,0.0,0.4);
	glVertex2i(1000,500);
	glEnd();
	glFlush();
}
void moveDisplay(void)
{
	glTranslatef(xdiff,ydiff,0);
	glutPostRedisplay();
}
void mouse(int button, int state, int x, int y)
{
	if(button == GLUT_LEFT_BUTTON && state == GLUT_DOWN)
	mouseDown = TRUE;
	else
	mouseDown = FALSE;
}
void mouseMotion(int x, int y)
{ if (mouseDown)
                { if(lastX==-1)
				     lastX=x;
                  if(lastY==-1)
					 lastY=y;
				     xdiff=x-lastX;
					 ydiff=-y+lastY;
					 lastX=x;
					 lastY=y;
					 moveDisplay();
                }
else
{
	lastX=x;
	lastY=y;
}
}
int main(int argc,char **argv)
{ glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
  glutInitWindowSize(500,500);
  glutInitWindowPosition(200,200);
  glutCreateWindow("moving");
  init();
  glutDisplayFunc(display);
  glutMouseFunc(mouse);
  glutMotionFunc(mouseMotion);
  glutMainLoop();
  return 0;
}

----------


## amin1softco

من قبلاً یک برنامه نوشتم بهتره یک نگاهی بهش بندازید ...
الان با ویژوال 2012 دوباره کامپایلش کردم.

----------


## 3pid71

> من قبلاً یک برنامه نوشتم بهتره یک نگاهی بهش بندازید ...
> الان با ویژوال 2012 دوباره کامپایلش کردم.


 من برنامتونو run کردم ولی راستش نفهمیدم الان ربط این برنامه به سوال من چی بود.الان این توش picking داشت؟ شاید به خاطر اینکه کامپایلر من به#include <stdafx.h>  
error گرفت درست run نشد ولی توی برنامتونم نتونستم تابع مربوطه رو پیدا کنم

----------


## amin1softco

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


به روش پیکینگ OpenGL هم لینکی که پویا گذاشته نمونه برنامه داره .

----------


## 3pid71

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


اهان پس برای من درست اجرا نمی کرد.اون 5 تا گزینه ی کنار صفحه میومد ولی چیزی انتخاب نمیشه و صفحه همش پرپر میزنه.
آره منم همون روش پیکینگ مد نظرمه که میگم باهاش مشکل دارم :/ 
به هرحال ممنون

----------


## rs2013

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



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



عکس از محیط بازی
1.jpg

----------


## xkapitanx

با سلام.
من میخواستم کدی بنویسم که توش بشه یک میز کاری رو طراحی کرد که کشاب داشته باشه و بشه تو محیط با کلید ها حرکت کرد.
کسی چنین مثالی داره؟
مثالی که بشه مدلشو با میز عوض کرد و بجاش یک مدل تو مثلا 3ds max یا maya ساخت بعد با اون مدل عوضش کرد؟(اصلا میشه مدل ساخته شده به برنامه منتقل کرد؟)
بنده وارد نیستم زیاد.
خواهشا راهنمایی کنید که چطور میتونم این کار رو بکنم؟؟
خواهشا اگر کسی اسکریپتی با این base داره بهم بده من فقط مدلشو عوض کنم؟
ممنون میشم اگر توضیح بدید

----------


## ahmaduse

چرا من نمیتونم از opngl تو سی شارپ استفاده کنم؟ میشه یکی با شکل مراحل استفاده رو بگه؟
یا یک برنامه خیلی ساده بزارید با سی شارپ که من اینجا بازش کنم ببیم اسکلتش چطوره؟

----------


## pswin.pooya

لفطا سوالها رو توی تاپیک های جدا مطرح کنید

----------


## ahmaduse

دوستان من وقتی از Tao استفاده میکنم برای سی شارپ Tao گزینه Tao.Platform رو نداره باید چیکار کنم؟
چون بدون این ارور میده برنامه.
وقتی از tk استفاده میکنم اونوقت از کنترل simpleOpenGlControl1 نمیشه استفاده کرد.
دلیلش چیه؟؟

----------


## amin1softco

در کل بهترین زبان برای استعمال OpenGL به نظر من سی ++ است و سی شارپ زیاد بدرد بازی سازی نمی خوره با این حال TAO تا یاد دارم در ویندوز اکس پی بدون مشکل کار می کرد ولی در ویندوز های سون و 8 درست کار نمیداد و
ببین openTK داخل خودش مثال و سمپل داره می تونی بری یکسری به پوشش بزنی و نیازی هم به simpleOpenGLControl نداره روش استفاده از کنترلش  به صورت زیر است :
// Creates a 1.0-compatible GraphicsContext with GraphicsMode.Default
GameWindow window = new GameWindow();
 
// Creates a 3.0-compatible GraphicsContext with 32bpp color, 24bpp depth
// 8bpp stencil and 4x anti-aliasing.
GLControl control = new GLControl(new GraphicsMode(32, 24, 8, 4), 3, 0);
http://www.opentk.com/doc/graphics/graphicscontext

----------


## ahmaduse

> در کل بهترین زبان برای استعمال OpenGL به نظر من سی ++ است و سی شارپ زیاد بدرد بازی سازی نمی خوره با این حال TAO تا یاد دارم در ویندوز اکس پی بدون مشکل کار می کرد ولی در ویندوز های سون و 8 درست کار نمیداد و
> ببین openTK داخل خودش مثال و سمپل داره می تونی بری یکسری به پوشش بزنی و نیازی هم به simpleOpenGLControl نداره روش استفاده از کنترلش  به صورت زیر است :
> // Creates a 1.0-compatible GraphicsContext with GraphicsMode.Default
> GameWindow window = new GameWindow();
>  
> // Creates a 3.0-compatible GraphicsContext with 32bpp color, 24bpp depth
> // 8bpp stencil and 4x anti-aliasing.
> GLControl control = new GLControl(new GraphicsMode(32, 24, 8, 4), 3, 0);
> http://www.opentk.com/doc/graphics/graphicscontext


من میخوام روی فرم یک شکل ساده کشیده بشه و یک دکمه بزارم وقتی رو دکمه کلید شد شکل دو برابر بشه
بنابراین میخوام شکل رو فرم کشیده بشه میشه کمک کنین؟
شکلی که میخوام بکشم شکل کد opngl اش بصورت زیره :



glClear(GL_COLOR_BUFFER_BIT );
glLoadIdentity();
glColor3f(1.0f,1.0f,0.0f);
POINT p1,p2,p3,p4,p5;
p1.x=300;p1.y=200;
p2.x=260;p2.y=300;
p3.x=350;p3.y=240;
p4.x=250;p4.y=240;
p5.x=340;p5.y=300;
glBegin(GL_LINE_LOOP);
glVertex2i(p1.x,p1.y);
glVertex2i(p2.x,p2.y);
glVertex2i(p3.x,p3.y);
glVertex2i(p4.x,p4.y);
glVertex2i(p5.x,p5.y);
glEnd();
glutSwapBuffers();

----------


## amin1softco

سرچ کن عزیزم http://www.opentk.com/doc/chapter/2/glcontrol

----------


## mostafagsm

با عرض سلام و خسته نباشید خدمت دوستان عزیز
بچه ها موضوع شیوه ارائه من در دانشگاه Open GL هستش و ویژوال استودیو 2010 رو روی لپ تاپم نصب کردم ولی کدهای اوپن جی الم رو ران نمی کنه. میشه یکی به صورت کامل توضیح بده ک چجوری باید کتابخانه ها و ملزومات اوپن جی ال رو روی ویژوال استودیو 2010 و ویندوز 7 شصت و چهار بیتی نصب و برنامه هامو ران کنم.
با تشکر

----------


## mostafagsm

دوستان ب جز visual studio برنامه دیگری هست که بشه با زبان C++‎ کتابخانه OpenGL رو اجرا کرد؟
خواهش می کنم راهنمایی کنید 
مرسی

----------


## turn-off

سلام 
من میخوام توی opengl از فونتهای  فارسی استفاده کنم از کتابخونه ftgl
حالا نمیدونم ftgl رو چطوری به سیستم بشناسونمش 
میشه کمک کنیدلطفا خیلی سریع
به ایمیلم بفرستین

----------


## apolon005

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

#include<GL/glut.h>
void init() 
{ 
glClearColor(0.1,0.2,0.1,0); 
glutInitWindowPosition(200,60);
glutInitWindowSize(800,400); 
glMatrixMode(GL_PROJECTION); 
gluOrtho2D(0,100,0,200); 
} 
void display() 
{ 
glClear(GL_COLOR_BUFFER_BIT); 
glColor3f(1.0,0.0,0.0); 
for(int i=1; i<2000 ;i++) 
{ 
glBegin(GL_POINTS); 
glVertex2i(i,i*2); 
glEnd(); 
} 
glFlush(); 
} 
int main(int argc,char**argv) 
{ 
glutInit(&argc,argv); 
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
glutCreateWindow("Test"); 
init(); 
glutDisplayFunc(display); 
glutMainLoop(); 
return 0; 
}

----------


## amin1softco

ما اینجا پروژه شما را انجام نمی دهیم فقط راهنمایی می کنیم در مورد توضیح کد یکمی بالاتر کد مشابه توضیح داده شده این توابع کارشون قبلاً شرح داده شده فقط در این برنامه کد زیر کار نمایش خط را انجام میده 

for(int i=1; i<2000 ;i++) 
{ 
glBegin(GL_POINTS); 
glVertex2i(i,i*2); 

glEnd(); 
} 




که اصلاً کار جالبی نیست برای رسم خط به صورت نقطه چین یا خط چین پیشنهاد می شه از
glLineStipple(1, 0x3F07); glEnable(GL_LINE_STIPPLE);
استفاده کنید 


void lineTo(Point2 p1, Point2 p2) {
    glBegin(GL_LINES);
    glVertex2f((GLfloat) p1.getX(), (GLfloat) p1.getY());
    glVertex2f((GLfloat) p2.getX(), (GLfloat) p2.getY()); //draw the line
    glEnd();
}

برای تغییر زاویه خط یا امثالهم باید نقطه شروع و پایان را تغییر بدید در برنامه شما تابع خط y=2x رسم می شود چون همیشه در حلقه i و 2*i مقدار نقطه بعدی را مشخص می کنند  شما با تغییر به 3i می تونید زاویه را هم تغییر بدید...

----------


## samadblaj

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

----------


## amin1softco

قبلاً یک لینک دادم بازم یک لینک میدم تا عاقبت به خیر شی http://pages.cs.wisc.edu/~byrne/p3/Flag.cpp

----------


## samadblaj

سلام ببخشید پروژه رو جمع جور کردم از سایتی که معرفی کردید اما یکی از فایل های include   وجود نداره؟!#include "Flag.h"#include "Project3.h"#include "GlObject.h"#include "Camera.h"#include "Texture.h"#include #include #include #include #include #include #include

----------


## 3pid71

سلام بچه ها


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





void Mouse(int button, int state ,int X,int Y){
    
    if (button == GLUT_LEFT_BUTTON  && state==GLUT_DOWN){
        
        click=true;
        oldX=X;
        oldY=Y;


  
    }


    else if (button == GLUT_RIGHT_BUTTON  && state==GLUT_UP)
        click=false;


    else if (button == GLUT_RIGHT_BUTTON  && state==GLUT_DOWN){
        z_camera -= 20;


    }
    
    glutPostRedisplay();




}





void Motion(int X,int Y){
	if(click){
		printf("click\n");
		for(int i=0;i<n1;i=i+3){
			if((abs(vertices[i]-X)<3)&&(abs(vertices[i+1]-Y)<3)){
						printf("i=%d \n",i);
						printf("x=%d      y=%d \n",X,Y);
						printf("1=%f      2=%f \n",vertices[i], vertices[i+1]);
				        if(oldX==-1.0)
							oldX=X;
						if(oldY==-1.0)
							oldY=Y;
						diff_x=X-oldX;
						diff_y=-Y+oldY;
						vertices[i]=vertices[i]+diff_x;
						vertices[i+1]=vertices[i+1]+diff_y;
						glutPostRedisplay();
					}}}
	//oldX=X;
	//oldY=Y;
	
	
}







vertices =همون آرایه ای هست که مختصات رئوس رو توش ریختم 


به نظر شماها اشکال کارم کجاست؟برنامم ران میشه ولی با کلیک کردن هیچگونه تغییری توی شکلم ایجاد نمیشه :ناراحت:

----------


## amin1softco

@*3pid71* : کلاً وقتی کلیک می کنید چی در کنسول چاپ می شه اصلاً تشخیص میده به نظر من شما باید همین را در تابع display بنویسید 

@*alirezafaa* : همین عکس را تکسچر کن بنداز روی یک مستطیل ;)

----------


## turn-off

سلام
من میخوام توی opengl فارسی بنویسم 
با بیت مپم نمیخوام باشه
کسی میتونه کمکم کنه؟

----------


## amin1softco

دقیقاً می خواهی چیکار کنی ؟ freetype - FTGL استفاده کن بیتمپم نیست یا اینکه خودت یک کتابخانه بنویس که بتونه یک فایل فونت مثل ttf را بخونه و سپس پردازش روش انجام بده و ازش در برنامه استفاده کن

----------


## turn-off

> دقیقاً می خواهی چیکار کنی ؟ freetype - FTGL استفاده کن بیتمپم نیست یا اینکه خودت یک کتابخانه بنویس که بتونه یک فایل فونت مثل ttf را بخونه و سپس پردازش روش انجام بده و ازش در برنامه استفاده کن


دقیقا میخوام فارسی تایپ کنم که وقتی  فونتشو بزرگ کردم  کیفیتش تغییر نکنه .میشه ی مثال از ftgl یا free type برام بزارید

----------


## amin1softco

مثال بهمراه توضیحات : http://ftgl.sourceforge.net/docs/htm...-tutorial.html

----------


## turn-off

> مثال بهمراه توضیحات : http://ftgl.sourceforge.net/docs/htm...-tutorial.html


ااینا رو امتحان کردم نتونستم اگه خودتون امتحانش کردید میشه کدتونو بزارید .

----------


## 3pid71

> @*3pid71* : کلاً وقتی کلیک می کنید چی در کنسول چاپ می شه اصلاً تشخیص میده به نظر من شما باید همین را در تابع display بنویسید 
> 
> @)


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

----------


## amin1softco

منم یک سوال دارم : ما اگر بخواهیم یک برنامه مثل فوتوشاپ درست کنیم که کاربر بتونه بوسیله  نقطه ها (Bezier Curves) یک شکلی مثل شکل زیر درست کنه و بتونه داخلش را  رنگ کنه باید چیکار کنیم . :متفکر: tess.jpg

@*turn-off* : باشه پیدا کردم رو چشم .

@3پیده : خوب اون یکبار اجرا می شه !!

----------


## 3pid71

> @3پیده : خوب اون یکبار اجرا می شه !!


چرا یه بار؟هر بار که تابع اجرا بشه و به اون خط برسه اجرا میشه دیگه

----------


## 3pid71

یه چیزی متوجه شدم
.اون  x و y که تابع motion بهم میده نسبت به دستگاه مختصات ویندوز هست ولی اون چیزی که من رسم می کنم چون روش تبدیلای مختلف انجام شده و دوربین جا به جا شده و اینا،مختصاتاش فرق می کنه
الان مثلا مکان نقطه ی (1و0) موس با (1و0) مکعب هایی که رسم کردم باهم فرق می کنه.اونجوری که من متوجه شدم با دستور gluUnProject میشه این تبدیل مختصاتی رو انجام داد. ولی من هرجایی که کلیک می کنم مختصات صفر رو بهم برمیگردونه و بازم برنامه کار نمی کنه  :متفکر:

----------


## amin1softco

شما داری 3 بعدی کار می کنید فک کنم خود اپن جی ال تابع پیکینگ داره براش ....

----------


## turn-off

از کجا میشه تشخیص داد یه عکس یا متنی که توی opengl گذاشتیم وکتور هست ؟

----------


## amin1softco

بزرگش کن اگر کیفیتش را از دست داد پیکسلی است اگر نه وکتوری است

----------


## turn-off

من یه عکس آوردم توی opengl 
شما ببینید وکتور هست یا نه

----------


## amin1softco

عکس BMP وکتور نیست و بیشتر تکسچر هایی که استفاده می شوند بیتمپ هستند .........

این مثلثی کردن اپن جی الم داستانیه ها 
Untitled.png

----------


## turn-off

من پیدا نکردم ک گفتین 2-3 تا عکس لود شده
کد این عکستونو میشه بذارین؟

----------


## 3pid71

> شما داری 3 بعدی کار می کنید فک کنم خود اپن جی ال تابع پیکینگ داره براش ....


بله یه تابع picking داره ولی اون برای وقتیه که چند تا جسم مختلف داشته باشی و به هرکودوم یه ID اختصاص بدی ولی من یه مش دارم که تعداد نقاطش خیلی زیاده و با دستور glDraw اونو رسم کردم و نمی تونم به هر کودوم از رئوس یه ID اختصاص بدم

کسی نمی تونه راهنماییم کنه؟ :/

----------


## amin1softco

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

----------


## amin1softco

*turn-off* : ابزار های سایت زیر را بررسی کن
http://www.opengl-tutorial.org/misce...ul-tools-links

----------


## turn-off

> *turn-off* : ابزار های سایت زیر را بررسی کن
> http://www.opengl-tutorial.org/misce...ul-tools-links


خیلی ممنون
یه راه حلی که تو بیشتر سایتا دیدم استفاده از openvg بود
شما میدونین چیه؟
بیشتر جاهام گفته بودش که باید معادلات ریاضی به کار ببریم

----------


## turn-off

3pid71  :http://www.daneshju.ir/forum/1507/t27228-6.html
شاید این سایت بتونه کمکت کنه
پروژه ای که شکل رو میتونه با کلید کیبورد خم و یا راست کنه

----------


## turn-off

_سلام 
من چند تا شی توی opengl دارم
اگه بخوام درگشون کنم باید چکار کنم؟

_

----------


## amin1softco

عزیزم شما یک سرچی بزنی رو نت کدشو پیدا می کنید ولی به هر حال چیزی که من پیدا کردم
https://forum.libcinder.org/#topic/23286000000285018
این در محیط سه بعدی است ...

+http://www.lighthouse3d.com/opengl/picking/

----------


## turn-off

> عزیزم شما یک سرچی بزنی رو نت کدشو پیدا می کنید ولی به هر حال چیزی که من پیدا کردم
> https://forum.libcinder.org/#topic/23286000000285018
> این در محیط سه بعدی است ...
> 
> +http://www.lighthouse3d.com/opengl/picking/


مرسی  :تشویق: 
http://www.youtube.com/watch?v=XgrrsPigBWw
اینو پیدا کردم 
به نظرم کار جالبیه

----------


## turn-off

ببخشید من انقد سوال میپرسم
من میخوام متن و عکس بذارم توی opengl 
میخوام منو و نوار ابزار و پنل بذارم 
به نظر شما از win32 استفاده کنم بهتر و راحت تره یا mfc?

----------


## pswin.pooya

> به نظر شما از win32 استفاده کنم بهتر و راحت تره یا mfc?


هیچ کدوم.برای ui از Qt استفاده کنید.

----------


## turn-off

> هیچ کدوم.برای ui از Qt استفاده کنید.


کار با qt واسه من که تا حالا کار نکردم سخت نیست؟

----------


## turn-off

میخوام چند تا شی که روی opengl دارم یکیشونو درگ کنم
کسی میتونه کمک کنه؟

----------


## turn-off

من طبق توصیه اقا پویا رفتم سمت qt
تا حالا با هاش کار نکردم 
سوالم اینه توی qt میشه از ftgl استفاده کرد ؟

----------


## mehdijafari39

سلام دوستان..میشه منو کمک کنید.. :افسرده: 
یه برنامه ی اماده میخام که هم خیلی ساده باشه هم متحرک باشه 
واسه پروژه گرافیم میخام(GUI) هیچی هم ازش بلد نیستم :گریه: ...اک میشه لینک ی برنامه رو به ایمیلم بزنید..مرسی...ممنون 
atefehahmadi5@gmail

----------


## rezaaasa

سلام خدمت دوستان من میخوام یه چهره انسان طراحی کنم با open gl کسی مثالی,راهنمایی سراغ داره؟ممنون.

----------


## rezaaasa

> سلام خدمت دوستان من میخوام یه چهره انسان طراحی کنم با open gl کسی مثالی,راهنمایی سراغ داره؟ممنون.


کسی نی به ما کمک کنه؟

----------


## mg_ho2003

*چاپ مستطیل وفونت در opengl*با سلام در ++C با کمک opengl یک مستطیل چاپ کردم و فونت را با کمک تابع glbitmap-character جدا چاپ کردم حالا میخوام این 2 تا با هم در یک صفحه چاپ شود ولی بعد از ترکیب هر 2تا کد باهم فقط یکی چاپ میشود با هم در یک صفحه قرار نمیگیرد لطفا راهنمایی فرمایید .

----------


## amin1softco

مشکل در روش ترکیب است ...

----------


## rezaaasa

> سلام خدمت دوستان من میخوام یه چهره انسان طراحی کنم با open gl کسی مثالی,راهنمایی سراغ داره؟ممنون.


دوستان کسی نی کمکی به ما بکنه؟

----------


## mg_ho2003

> *چاپ مستطیل وفونت در opengl*
> 
> با سلام در ++C با کمک opengl یک مستطیل چاپ کردم و فونت را با کمک تابع glbitmap-character جدا چاپ کردم حالا میخوام این 2 تا با هم در یک صفحه چاپ شود ولی بعد از ترکیب هر 2تا کد باهم فقط یکی چاپ میشود با هم در یک صفحه قرار نمیگیرد لطفا راهنمایی فرمایید .



سلام

amin1softco   جان  چطوربایدترکیب کنم

----------


## amin1softco

احتمالاً تابع clear را فراخوانی کردی ....

----------


## fareshteh

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

----------


## Mahya1993

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

----------


## amin1softco

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

----------


## Mahya1993

سلام:)
از پاسخ دیروزتون ممنون
4تا خواهش وسوال دیگه ازتون دارم
یکی این ک میشه لطفا کد منو بررسی کنید و اشکالاتشو بگیرید
دوم این که اون قسمت کد ک کامنت کردم عمل نمیکنه
البته خیلی هم مطمعن نیستم ک درست باشه.برای کم و زیاد کردن سرعت نوشتم.
سوم این که هرچقد سعی کردم نتونستم کاری کنم ک وقتی ازصفحه خارج شد دوباره برگرده از اول و این روند هی ادامه پیدا کنه
چهارم این ک اگه تابع
    (glutIdleFunc(Display
رو توی main فراخوانی کنم
ماشین هم به طور کامل از تصویر میره بیرون
اما اگه فراخوانی نکنم یکم از ماشین میمونه توصفحه.اصلا این تابع چه کاری میکنه و لازمه ک باشه؟
خیلی خیلی ممنون میشم تو این موارد هم راهنماییم کنید.

----------


## Mahya1993

#include<windows.h>
#include<GL/glut.h>
#include <math.h>
#include <time.h>


void init()
{
    glClearColor(0,0,0,0);
    glMatrixMode(GL_PROJECTION);
    gluOrtho2D(0,200,0,200);
}
GLint i=0,j=30;
GLdouble k=0;
void Display()
{
    for (k=0 ; k<20 ; k++){
    static float fElect1 = 0.0;
    glRotatef(fElect1, 0.0, 1.0, 0.0);
    Sleep(200);
    glTranslatef(k, 0.0, 0.0);
    glClear(GL_COLOR_BUFFER_BIT);
    glColor3f(1.0,0.0,0.0);
    glBegin(GL_QUADS);
    glVertex2i(i,j);
    glVertex2i(i+15,j+30);
    glVertex2i(i+45,j+30);
    glVertex2i(i+60,j);
    glEnd();
    glFlush();
    glutSwapBuffers();
    glEnable(GL_POINT_SMOOTH);
    glPointSize(35);
    glBegin(GL_POINTS);
    glColor3f(1,1,1);
    glVertex2i(i+20,j);
    glColor3f(1,1,1);
    glVertex2i(i+40,j);
    glEnd();
    glFlush();


}
}
//void keyboard(unsigned char key, int x, int y)
//{
//    switch (key) {
//    case '1':
//    Sleep(180);
//    glutIdleFunc(Display);
//
//    break;
//
//    case '2':
//    Sleep(290);
//    glutIdleFunc(Display);
//
//    break;
//
//    case '3':
//        exit(1);
//        break;
//        case 'X':
//        exit(2);
//
//
//    default:
//    break;
//    }
//
//
//}




int main(int argc,char **argv)
{
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);


    glutInitWindowSize(500,500);
    glutInitWindowPosition(200,200);


    glutCreateWindow("Moving Car");
    init();


    glutDisplayFunc(Display);
//    glutKeyboardFunc(keyboard);
    glutMainLoop();


    return 0;
}

----------


## amin1softco

اینو ببین شاید رستگار شدی 

#include <windows.h>

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


void init()
{
    glClearColor(0, 0, 0, 0);
    glMatrixMode(GL_PROJECTION);
    gluOrtho2D(0, 200, 0, 200);
}
GLint i = 0, j = 30,GLcounter=0;

GLdouble k = 3;
void Display()
{
    //for (k = 0; k<20; k++){
    GLcounter++;
    if (GLcounter > 50) {
        k = -k;
        GLcounter = 0;
    }
        static float fElect1 = 0.0;
        glRotatef(fElect1, 0.0, 1.0, 0.0);
        Sleep(100);
        glTranslatef(k, 0.0, 0.0);
        glClear(GL_COLOR_BUFFER_BIT);
        glColor3f(1.0, 0.0, 0.0);
        glBegin(GL_QUADS);
        glVertex2i(i, j);
        glVertex2i(i + 15, j + 30);
        glVertex2i(i + 45, j + 30);
        glVertex2i(i + 60, j);
        glEnd();
        
        glEnable(GL_POINT_SMOOTH);
        glPointSize(35);
        glBegin(GL_POINTS);
        glColor3f(1, 1, 1);
        glVertex2i(i + 20, j);
        glColor3f(1, 1, 1);
        glVertex2i(i + 40, j);
        glEnd();
        glFlush();
        glutSwapBuffers();


    //}
}
void keyboard(unsigned char key, int x, int y)
{
    switch (key) {
    case '1':
    Sleep(180);
    if (k < 0) k = -k;
    glutPostRedisplay();
    

    break;

    case '2':
    Sleep(290);
    if (k > 0) k = -k;
    glutPostRedisplay();

    break;

    case '3':
        exit(1);
        break;
        case 'X':
        exit(2);


    default:
    break;
    }


}




int main(int argc, char **argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);


    glutInitWindowSize(500, 500);
    glutInitWindowPosition(200, 200);


    glutCreateWindow("Moving Car");
    init();

    
glutDisplayFunc(Display);
    glutKeyboardFunc(keyboard);
    glutIdleFunc(Display);
    glutMainLoop();


    return 0;
}

----------


## fareshteh

یعنی سوال من  جواب نداشت؟؟؟؟؟؟؟؟؟؟؟؟ :گریه:

----------


## amin1softco

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


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

----------


## s-i-s-i

سلام بچه ها
من یه پروژه با opengl دارم کسی هست که بهم کمک کنه و بگه چه کاری انجام میده؟
واسه 8 تیر 93 میخوام خواهش میکنم جوابم رو بدید
ممنون

----------


## amirpcp30

سلام دوستان
ممنون از آموزشتون
من چند تا نقطه دادم که به هم متصل شه با GL_line_loop درسته اما وقتی با polygon میزنم شکلی که دارم اضلاعش کمتر میشه و اون جزئیات قبلی رو نداره - میخواستم بپرسم کدی هست مثل lines loop باشه اما داخلش هم رنگ کنه؟
 این کد رو ببینید:
اگه line loop باشه خیلی با پولیگانش فرق میکنه الان loop هست میتونید پولیگان کنید منظورمو متوجه شید

#include<stdlib.h>
#include<GL\glut.h>


void pir(double x , double y)
{
    glBegin(GL_LINE_LOOP);
glVertex2d(2895,2235);
glVertex2d(2880,2220);
glVertex2d(2865,2205);
glVertex2d(2865,2190);
glVertex2d(2850,2175);
glVertex2d(2835,2160);
glVertex2d(2820,2115);
glVertex2d(2805,2040);
glVertex2d(2790,2010);
glVertex2d(2775,1965);
glVertex2d(2760,1920);
glVertex2d(2745,1890);
glVertex2d(2715,1860);
glVertex2d(2685,1815);
glVertex2d(2700,1770);
glVertex2d(2670,1725);
glVertex2d(2655,1695);
glVertex2d(2640,1650);
glVertex2d(2625,1590);
glVertex2d(2610,1545);
glVertex2d(2625,1515);
glVertex2d(2610,1425);
glVertex2d(2610,1380);
glVertex2d(2610,1290);
glVertex2d(2625,1245);
glVertex2d(2640,1170);
glVertex2d(2655,1080);
glVertex2d(2655,1020);
glVertex2d(2685,945);
glVertex2d(2700,885);
glVertex2d(2715,810);
glVertex2d(2730,780);
glVertex2d(2745,720);
glVertex2d(2760,660);
glVertex2d(2775,600);
glVertex2d(2790,480);
glVertex2d(2805,360);
glVertex2d(2820,300);
glVertex2d(2835,210);
glVertex2d(2850,60);
glVertex2d(2850,0);
glVertex2d(3390,0);
glVertex2d(3660,0);
glVertex2d(4830,0);
glVertex2d(5100,0);
glVertex2d(5160,0);
glVertex2d(5175,30);
glVertex2d(5190,75);
glVertex2d(5205,90);
glVertex2d(5220,135);
glVertex2d(5235,180);
glVertex2d(5250,210);
glVertex2d(5265,255);
glVertex2d(5280,315);
glVertex2d(5295,360);
glVertex2d(5310,420);
glVertex2d(5325,465);
glVertex2d(5340,525);
glVertex2d(5355,570);
glVertex2d(5370,615);
glVertex2d(5385,660);
glVertex2d(5400,705);
glVertex2d(5415,750);
glVertex2d(5445,825);
glVertex2d(5445,885);
glVertex2d(5460,945);
glVertex2d(5475,1020);
glVertex2d(5490,1080);
glVertex2d(5505,1155);
glVertex2d(5520,1200);
glVertex2d(5535,1290);
glVertex2d(5550,1440);
glVertex2d(5550,1515);
glVertex2d(5535,1590);
glVertex2d(5520,1620);
glVertex2d(5505,1665);
glVertex2d(5490,1710);
glVertex2d(5490,1740);
glVertex2d(5490,1815);
glVertex2d(5475,1860);
glVertex2d(5460,1890);
glVertex2d(5445,1905);
glVertex2d(5175,1920);
glVertex2d(4800,1920);
glVertex2d(3345,1920);
glVertex2d(3165,2175);
glVertex2d(2940,2250);
glVertex2d(2910,2265);
glVertex2d(2895,2235);


glEnd();
}




void display(void)
{
    glClear(GL_COLOR_BUFFER_BIT);

    glColor3ub(180,54,65);
pir(0,0);


    glFlush();
}



void main(int argc,char** argv)
{
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
    glutInitWindowSize(402.75,450);
    glutInitWindowPosition(100,100);
    glutCreateWindow("Amir.S");
    glClearColor(1,1,1,0);
    glMatrixMode(GL_PROJECTION);
    gluOrtho2D(0,8130,0,9000);
    glutDisplayFunc(display);
    glutMainLoop();
}  


اگه از کد glEnable(GL_CULL_FACE); در بعضی از همین کدهایی که خراب میشوند استفاده کنم قبل از پولیگان دقیقا چیزهای اضافه ای که میکشه رو بهم نشون میده ولی من دقیقا برعکس رو میخوام یعنی چیزهای اضافه نباشه فقط خودش باشه
اگه راهنمایی کنید ممنونتون میشم
با سپاس

----------


## raaamin

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

----------


## behzadkhan

> با سلام و خسته نباشید
> ممنون از مطالب مفیدتون .
> من یه مشکل اساسی با برنامه 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

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

با تشکر

----------


## raaamin

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

----------


## behzadkhan

با سلام

مشکل برطرف شد.

با تشکر

----------


## hilda.f

این کدهارو ببینید
یکم کدنویسیش کلک رشتی داره اما مهم خروجیه :)
مشکلاتش:
رندوم رو به صورت سراسری میخوام تعریف کنم که دو تا تابع ازش استفاده کنن اما مشکل دار میشه
میخوام هروقت موس رفت رو دایره که به صورت رندوم ایجاد میشه رنگش عوض شه که خیلی دیر این اتفاق میفته
لطفا راهنماییم کنید.خیلی وقت ندارم :)
#include <stdlib.h>
#include <GL\glut.h>
#include<math.h>
bool flag=0;
int counter=0;
int i=rand()%5+1;
void init (void)
{
   glClearColor (0.0, 0.0, 0.0, 0.0);
   glMatrixMode(GL_PROJECTION);
   gluOrtho2D(0.0, 200.0, 0.0, 150.0);
}
//namayeshe moraba'a ha
void Display(void)
{ 

    GLint a[4][2]={{15,140},{65,140},{65,90},{15,90}};
    GLint b[4][2]={{75,140},{125,140},{125,90},{75,90}};
    GLint c[4][2]={{135,140},{185,140},{185,90},{135,90}};
    GLint d[4][2]={{50,75},{100,75},{100,25},{50,25}};
    GLint e[4][2]={{110,75},{160,75},{160,25},{110,25}};




  glBegin(GL_LINE_LOOP);
    glColor3f(0.0, 2.0, 0.0);
    glVertex2iv(a[0]);
    glVertex2iv (a[1]);
    glVertex2iv (a[2]);
    glVertex2iv (a[3]);
  glEnd();

    glBegin(GL_LINE_LOOP);
    glColor3f(0.0, 2.0, 0.0);
    glVertex2iv(b[0]);
    glVertex2iv (b[1]);
    glVertex2iv (b[2]);
    glVertex2iv (b[3]);
  glEnd();

   glBegin(GL_LINE_LOOP);
    glColor3f(0.0, 2.0, 0.0);
    glVertex2iv(c[0]);
    glVertex2iv (c[1]);
    glVertex2iv (c[2]);
    glVertex2iv (c[3]);
  glEnd();

     glBegin(GL_LINE_LOOP);
    glColor3f(0.0, 2.0, 0.0);
    glVertex2iv(d[0]);
    glVertex2iv (d[1]);
    glVertex2iv (d[2]);
    glVertex2iv (d[3]);
  glEnd();


    glBegin(GL_LINE_LOOP);
    glColor3f(0.0, 2.0, 0.0);
    glVertex2iv(e[0]);
    glVertex2iv (e[1]);
    glVertex2iv (e[2]);
    glVertex2iv (e[3]);
  glEnd();

    glFlush();
glutSwapBuffers();
}


//penhan shodan dayere ha
void hide(int value)
{   

    glClear(GL_COLOR_BUFFER_BIT ); 

}

//emtiaz bandi
void end(int value)
{
    if(counter>5)
    {
    glLoadIdentity(); 
    glClear(GL_COLOR_BUFFER_BIT );
    }

    //else if(counter<5)
    //{
 //   glLoadIdentity(); 
    //glClear(GL_COLOR_BUFFER_BIT );
    //}

}

//namayeshe randome dayere ha
void timer_function( int value)
{
   
    
    
     if(i==1)
     {
        glClear(GL_COLOR_BUFFER_BIT);
        if (flag) glColor3f(0, 1, 0); 
        else glColor3f(1, 1, 1);
        glPushMatrix(); 
        glTranslatef(40,115.0,0);
        GLUquadricObj *circle = gluNewQuadric ();
        gluQuadricDrawStyle (circle, GLU_FILL);
        gluDisk (circle,0,25,20000,1);              
        gluDeleteQuadric(circle);   
        glPopMatrix();
        glutSwapBuffers();    
     }

    else if(i==2)
    {
        glClear(GL_COLOR_BUFFER_BIT);
        if (flag) glColor3f(0, 1, 0); 
        else glColor3f(1, 1, 1);
        glPushMatrix(); 
        glTranslatef(100,115.0,0.0);
        GLUquadricObj *circle = gluNewQuadric ();
        gluQuadricDrawStyle (circle, GLU_FILL);
        gluDisk (circle,0,25,20000,1);              
        gluDeleteQuadric(circle);   
        glPopMatrix();
        glutSwapBuffers(); 
    }


    else if(i==3)
    {
        glClear(GL_COLOR_BUFFER_BIT);
        if (flag) glColor3f(0, 1, 0); 
        else glColor3f(1, 1, 1);
        glPushMatrix(); 
        glTranslatef(160,115,0.0);
        GLUquadricObj *circle = gluNewQuadric ();
        gluQuadricDrawStyle (circle, GLU_FILL);
        gluDisk (circle,0,25,20000,1);              
        gluDeleteQuadric(circle);   
        glPopMatrix();
        glutSwapBuffers();     
    }
    


    else if(i==4)
    {
          glClear(GL_COLOR_BUFFER_BIT);
          if (flag) glColor3f(0, 1, 0); 
          else glColor3f(1, 1, 1);
          glPushMatrix(); 
          glTranslatef(75,50,0.0);
          GLUquadricObj *circle = gluNewQuadric ();
          gluQuadricDrawStyle (circle, GLU_FILL);
          gluDisk (circle,0,25,20000,1);              
          gluDeleteQuadric(circle);   
          glPopMatrix();
          glutSwapBuffers();     
       }
        


    else if(i==5)
      {
          glClear(GL_COLOR_BUFFER_BIT);
          if (flag) glColor3f(0, 1, 0); 
          else glColor3f(1, 1, 1);
          glPushMatrix(); 
          glTranslatef(135,50,0.0);
          GLUquadricObj *circle = gluNewQuadric ();
          gluQuadricDrawStyle (circle, GLU_FILL);
          gluDisk (circle,0,25,20000,1);              
          gluDeleteQuadric(circle);   
          glPopMatrix();
          glutSwapBuffers();    
        }        
    
                glutTimerFunc(100,hide,0);
                glutTimerFunc(100,timer_function,0);
}


//taghire range dayere ha
 void myMotionFunc(  int x, int y )
 { 
     switch(i)
     {
 case(1):
     {
        if(sqrt(double(pow(float(abs(40-x)),2)+pow(float(abs(115-y)),2)))>100) flag=0;
        else {flag=1; counter++;}
     }
        break;
 case(2):
     {
        if(sqrt(double(pow(float(abs(100-x)),2)+pow(float(abs(115-y)),2)))>100) flag=0;
        else {flag=1; counter++;}
     }
        break;

 case(3):
     {
        if(sqrt(double(pow(float(abs(160-x)),2)+pow(float(abs(115-y)),2)))>100) flag=0;
        else {flag=1; counter++;}
     }
        break;

 case(4):
     {
        if(sqrt(double(pow(float(abs(75-x)),2)+pow(float(abs(50-y)),2)))>100) flag=0;
        else {flag=1; counter++;}
     }
        break;

 case(5):
     {
        if(sqrt(double(pow(float(abs(135-x)),2)+pow(float(abs(50-y)),2)))>100) flag=0;
        else {flag=1; counter++;}
     }
        break;


     }

 }




 //mohasebeye emtiaz
//void myMouse(int button, int state, int x, int y)
//{      
//    
//    if(button == GLUT_LEFT_BUTTON && state == GLUT_DOWN)
//    {
//         if(flag)
//         counter++;
//        
//    }
//    glutPostRedisplay();
//}


int main(int argc, char** argv)
{
   glutInit(&argc, argv);
   glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);
   glutInitWindowSize (400, 300);
   glutInitWindowPosition (500, 500);
   glutCreateWindow ("Dash");
   init ();
   glutDisplayFunc (Display);
   glutIdleFunc (Display);
   glutTimerFunc(100,timer_function,0);
   glutTimerFunc(40000,end,0);
   //glutMouseFunc(myMouse);
   glutPassiveMotionFunc (myMotionFunc);
   glutMainLoop();

}

----------


## hilda.f

تاپیک جداگونه میزنم کسی نیست.تو تاپیک موجود پست میزنم بازم کسی نیست

یکی هم تو رسیدن به رستگاری کمکم کنه ممنون میشم
لطفا

----------


## peperojj

سلام من به نقاط برای یه شکل پیچیده احتیاج دارم ترجیحا 3 بعدی خیلی لازم دارم 
ممنون

----------


## TAMIGI

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

#include <iostream>
#include <gl/glut.h>
using namespace std;
GLfloat verts[4][2] = { 0.3, -0.4, 0.5, 0.5, -0.5, 0.5, -0.7, -0.3 };
GLfloat colors[4][3] = { 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1 };
GLenum mode = GL_POINTS;
void init()
{
    gluOrtho2D(-3, 3, -3, 3);
    glClearColor(0.5, 0.5, 0.5, 1.0);

}
void display()
{

    glClear(GL_COLOR_BUFFER_BIT);
    glBegin(mode);
    for (int i = 0; i < 4; i++)
    {
        glColor3fv(colors[i]);
        glVertex2fv(verts[i]);
    }
    glEnd();
    glFlush();
}
void keyboard(unsigned char key, int x, int y)
{
    switch (key)
    {
    case '0':
        mode = GL_POINTS;
        break;
    case '1':
        mode = GL_LINES;
        break;
    case '2':
        mode = GL_TRIANGLES;
        break;
    case '3':
        mode = GL_QUADS;
        break;
    case '4':
        mode = GL_LINE_LOOP;
        break;
    }
    glutPostRedisplay();
}
void main(int argc, char** argv)
{
    glutInit(&argc, argv);
    glutInitWindowSize(700, 400);
    glutInitWindowPosition(100, 200);
    glutCreateWindow("First Open Gl to menu");
    init();
    glutDisplayFunc(display);
    glutKeyboardFunc(keyboard);
    glutMainLoop();

}

----------


## TAMIGI

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

----------


## PareParvaz77

سلام ....میشه این برنامه رو به من توضیح بدین؟؟؟
ممنون میشم

#include <windows.h>  
#include <gl/Gl.h>
#include <gl/glut.h>

int flag=0;
int rx,ry;
int xw,yw,selector=4,selector2=3;
float rr,gg,bb,ff=4.0;

//<<<<<<<<<<<<<<<<<<<<<<<< myDisplay >>>>>>>>>>>>>>>>>
void myDisplay(void)
{

    glColor3f(0.670f, 0.776f, 0.878f);
    glRectf(0,0,xw,40);

    if(ry<=40)
    {    if(rx>=10 && rx<=30)
            {
            selector=1;
            rr=1;
            gg=0;
            bb=0;
            }
        if(rx>=40 && rx<=60)
            {
            selector=2;
            rr=0;
            gg=1;
            bb=0;
            }
        if(rx>=70 && rx<=90)
            {
            selector=3;
            rr=0;
            gg=0;
            bb=1;
            }
        if(rx>=100 && rx<=120)
            {
            selector=4;
            rr=0;
            gg=0;
            bb=0;
            }
        if(rx>=155 && rx<=172)
            {
            selector2=1;
            ff=8;
            }
        if(rx>=173 && rx<=189)
            {
            selector2=2;
            ff=6;
            }
        if(rx>=189 && rx<=203)
            {
            selector2=3;
            ff=4;
            }
        if(rx>=204 && rx<=215)
            {
            selector2=4;
            ff=2;
            }
    }


    if(selector==1)
        {
        glColor3f(0.70f, 0.70f, 0.70f);   
        glRectf(5,5,35,35);    
        }
    if(selector==2)
        {
        glColor3f(0.70f, 0.70f, 0.70f);
        glRectf(35,5,65,35);    
        }
    if(selector==3)
        {
        glColor3f(0.70f, 0.70f, 0.70f);
        glRectf(65,5,95,35);    
        }
    if(selector==4)
        {
        glColor3f(0.70f, 0.70f, 0.70f);
        glRectf(95,5,125,35);    
        }
    if(selector2==1)
        {
        glColor3f(0.70f, 0.70f, 0.70f);
        glRectf(155,11,172,29);    
        }
    if(selector2==2)
        {
        glColor3f(0.70f, 0.70f, 0.70f);
        glRectf(173,11,189,29);    
        }
    if(selector2==3)
        {
        glColor3f(0.70f, 0.70f, 0.70f);
        glRectf(189,11,203,29);    
        }
    if(selector2==4)
        {
        glColor3f(0.70f, 0.70f, 0.70f);
        glRectf(203,11,215,29);    
        }


    glColor3f(1.0f, 0.0f, 0.0f); 
    glRectf(10,10,30,30);

    glColor3f(0.0f, 1.0f, 0.0f);
    glRectf(40,10,60,30);

    glColor3f(0.0f, 0.0f, 1.0f);
    glRectf(70,10,90,30);

    glColor3f(0.0f, 0.0f, 0.0f);
    glRectf(100,10,120,30);

    glRectf(150,0,151,40);  

    glRectf(160,16,168,24); 
    glRectf(178,17,184,23);
    glRectf(194,18,198,22);
    glRectf(208,19,210,21);

    glColor3f(rr, gg, bb);
    glPointSize(ff);


    if (flag==1 && ry>40)
    {
        glBegin(GL_POINTS);
        glVertex2i(rx, ry);        
        glEnd();    
    }
    glFlush();                       
}

void myMouse(int button, int state, int x, int y)
{
   if(button == GLUT_LEFT_BUTTON && state == GLUT_DOWN)
   {
       flag=1;
       rx=x;
       ry=yw-y;
   }
   glutPostRedisplay();
}

void myMouseMotion(int x, int y)
{
       flag=1;
       rx=x;
       ry=yw-y;
   glutPostRedisplay();
}


void myKeyboard(unsigned char ch, int x, int y)
{

    switch (ch)
    {
        case 'e':
            exit (-1);

        case 'a':
            flag=0;
            glClear(GL_COLOR_BUFFER_BIT);     // clear the screen 
            break;
    }

   glutPostRedisplay();
}



void ChangeSize(GLsizei w, GLsizei h)
    {

    yw=h;
    xw=w;



    glClearColor(1.0,1.0,1.0,0.0);      
   // glColor3f(0.0f, 0.0f, 0.0f);        

    glClear(GL_COLOR_BUFFER_BIT);    
    glMatrixMode(GL_PROJECTION); 

    glLoadIdentity();

    glViewport(0,0,w,h);

    gluOrtho2D(0.0, w, 0.0, h);

    }



//<<<<<<<<<<<<<<<<<<<<<<<< main >>>>>>>>>>>>>>>>>>>>>>
void main(int argc, char** argv)
{

    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); 

    glutInitWindowSize(640,480);     

    glutCreateWindow("board"); 

    glutDisplayFunc(myDisplay);    

    glutReshapeFunc(ChangeSize);    

    glutMouseFunc(myMouse);

    glutKeyboardFunc(myKeyboard);

    glutMotionFunc (myMouseMotion);

    glutMainLoop();            
}

----------


## reza hafezi

سلام کسی کد رسم مثلث و حرکت دادن آن را دارد

----------

