View Full Version : آموزش: آموزش OpenGL
amin1softco
جمعه 21 اسفند 1388, 19:26 عصر
با سلام خدمت همه ی دوستان گل خودم
من از امروز قصد دارم در ایام عید کتاب گرافیک کامپیوتری را که این ترم امتحان دارم را هر بخشش رو خلاصه کنم و بنویسم اینجا تا دوستان اول استفاده کنند بعد اگه کج فهمی درش وجود داره یا فوت کوزه گری داره برای ما باز گو کنند و یک ایجاد انگیزه ایی بشه برای من تا کتاب رو کامل مطالعه کنم به هر حال فردا اولین خلاصه را قرار می دم:قلب: البته اگه تشویقم کنید:تشویق:
amin1softco
جمعه 21 اسفند 1388, 20:29 عصر
چگونه یک پروژه 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.
http://www.mrmoen.com/wordpress/wp-content/uploads/2008/04/newproj.png
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 این تغییرات را اعمال کنید.
http://www.mrmoen.com/wordpress/wp-content/uploads/2008/04/linkerinput.png
حالا پروژه برای کد نویسی 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);
}
این کد برای تست بود نه آموزش و کاری به کتاب نداشت.
منبع (http://www.mrmoen.com/2008/03/30/opengl-with-visual-c-express-edition/)
یک نکته خیلی مهم درسته در این مثال از کتابخانه 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 به روایت تصویر
(http://web.eecs.umich.edu/%7Esugih/courses/eecs487/glut-howto/vstudio-figs.html)آموزش کامل مفهومی به صورت فیلم 10 دقیقه ایی 7مگ از اینجا دانلود (http://s3.picofile.com/file/7400251284/glut.zip.html) کنید.
(http://web.eecs.umich.edu/%7Esugih/courses/eecs487/glut-howto/vstudio-figs.html)
pswin.pooya
جمعه 21 اسفند 1388, 21:27 عصر
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
یک شنبه 23 اسفند 1388, 09:16 صبح
خلاصه فصل اول کتاب ((مروری بر گرافیک رایانه ایی))
نکات :
برای تولید یک تصویر واقع گرایانه از صحنه ایی طبیعی یک برنامه ی گرافیکی باید اثرات بازتابش و شکست نور واقعی را از اشیای طبیعی شبیه سازی کند . بنابر این گرایش فعلی در گرافیک کامپیوتری در آمیختن تقریبهای بهبود یافته ی اصول فیزیک با الگوریتمهای گرافیک رایانه ای است که برای شبیه سازی تعاملات پیچیده بین اشیاء و محیط نوری بکار می رود.
البته بیشتر افراد با این مبحث آشنایی دارند و من زیاد توضیح نمی دهم
**مروری بر گرافیک رایانه ایی**
الف: نمودار ها :
یکی از کاربرد گرافیگ کامپیوتری در رسم نمودار ها است . که می توانند در n بعد ترسیم شوند.
http://www.jpowered.com/php-scripts/pie-chart/images/pie-chart-small.pnghttp://www.jpowered.com/graph_chart_collection/graph-images/bar-chart-vertical.gif
ب : طراحی به کمک کامپیوتر:
طراحی به کمک کامپیوتر CAD و ترسیم و طراحی به کمک کامپیوتر CADD نامیده می شود. و در طراحی انیمیشن , شبکه های مخابراتی , ترسیمات الکترونیکی ,نقشه های ساختمانی , وسایل نقلیه , هواپیما ها , کشتیها , سفینه ها ی فایی , رایانه ها , نساجی , محصولات خانگی و... بطور وسیع مورد استفاده قرار می گیرد.
ج: محیط های واقعیت مجازی :
یکی از مفاهیم آن کنترل از راه دور است برای مثال یک کابین خلبان با تمام جزئیات ایجاد می شود و خلبان بدون اینکه سوار بر هواپیمای واقعی باشد آن را کنترل می کند. یا در یک مکان که احتمال خطر زیاد است مثل معادن یک لودر شبیه سازی شده بوسیله کارفرما از خارج آن کنترل می شود.
د : بصری سازی :
همیشه تصاویر شهودی راحت تر از داده های عددی درک می شوند برای مثال یک ماتریس عددی از مشخصات سطح زمین قابل درک نیست اما وقتی این داده ها به تصویر کشیده می شوند خیلی راحت تر درک می شوند. این فرایند تبدیل داده ی عددی به تصویر را بصری سازی می نامند.
ه : آموزش و کار آموزی :
منظور همان شبیه سازی وسایل سنگین است برای مثال برای آموزش خلبانی یک کابین خلبان ایجاد می شود با همه امکانات و کامپیوتر محیط پرواز را به صورت واقعی شبیه سازی می کند. بدون اینکه هواپیمایی وجود داشته باشد.
و : هنر رایانه ای :
یعنی محیط بوم و قلمو بوسیله ابزار های دیجیتالی شبیه سازی شود و نقاش بتواند همان اثرات واقعی را با حرکت دادن قلمو بر روی صفحه مانیتور یا تبلت پیاده سازی کند.
ز : سرگرمی :
به دو بخش تقسیم می شود یکی قسمت ساخت فیلم و دیگری قسمت ساخت بازی است در قسمت ساخت فیلم به چندین صورت مورد استفاده قرار می گیرد:
1-استفاده از شخصیت های گرافیکی در کنار شخصیت های واقعی
2- ویرایش شخصیت های واقعی وایجاد افکت ها سینمایی
3- ساخت تمام فیلم به صورت گرافیکی
قسمت ساخت بازی یعنی ایجاد محیطی که با کاربر تعامل دارد .
ح : پردازش تصویر :
تغییر یا تفسیر تصاویر موجود مثل عکس ها و اسکنها تلویزیونی را پردازش تصویر می گویند.
تفاوت بین پردازش تصویر و گرافیک رایانه ایی این است که در پردازش تصویر روش هایی برای بهبود کیفیت , تحلیل و شناسایی الگو های بینایی برای کاربرد های روبوتیک به کار می رود در حالی که در گرافیک رایانه ایی یک تصویر خلق می شود.
ت : فاصلهای گرافیکی کاربر
منظور همان Graphic user interface می باشد که یک مثال معروف آن ویندوز و داس است در داس این محیط گرافیکی نبود ولی در ویندوز این محیط گرافیکی شد
ک : خلاصه :
این بخش کوچکی از استفاده از گرافیک کامپیوتری بود.
amin1softco
یک شنبه 23 اسفند 1388, 11:02 صبح
خلاصه ی فصل دوم ((مروری بر سیستم های گرافیکی))
1-دستگاه های نمایش پویش ویدئویی :
دستگاه خروجی مبنا در بیشتر سیستم ها مانیتور یا همان صفحه نمایش است که به چند نوع تقسیم بندی می شود:
الف- لامپ های خلأ (CRT) تک رنگ :
لامپ های خلأ بر اساس خاصیت مهم عنصر فسفر کار می کنند.
وقتی به یک اتم فسفر بار الکترونی القاء شود و آرایش الکترونی این اتم در حالت برانگیخته باشد این اتم با ساطع کردن نوری ناپایدار در محدوده دید مرئی انسان به آرایش الکترونی پایدار می رسد. ولی هرچه تعداد الکترون های القاء شده بیشتر باشد درخشندگی نور الکترون ها بیشتر است و بلعکس اثر نور منتشر شده در حد 10 - 60 میکروثانیه است و به سرعت از بین می رود.
در لامپ های خلا از این خاصیت استفاده می کنند و با یک تفنگ الکترونی که دارای سیستم آند متمرکز کننده , آند شتاب دهنده , شبکه کنترل , سیم پیچ گرمایی و کاتد است اشعه ی الکترونی را به سمت صفحه آغشته به فسفر هدایت می کند در بین راه این اشعه باید یا از پیچه های منحرف کننده عبور کند یا ازصفحات منحرف کننده الکترواستاتیکی و در نهایت برخورد با اتم فسفر و ساطع شدن فوتون .
http://hostintruder.files.wordpress.com/2008/06/crt.jpg
تصویر نمونه با منحرف کننده الکترو استاتیکی
برای اینکه تصویر پایدار بماند دو راه وجود دارد :
اول توزیع بار داخل 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)
http://www.yourdictionary.com/images/computer/RASTSCAN.GIF
اساس کار این پویش شبیه تلویزیون های CRT است و در این پویش اشعه ی الکترونی صفحه ی نمایش را سطر به سطر , با شروع از بالا ترین سطر جارو می کند هر سطر را یک خط پویش
می نامیم.
فریم به کل ناحیه صفحه مانیتور اطلاق می شود.
فریم بافر ناحیه ایی از حافظه است که تمام مشخصات مورد نیاز برای رسم یک تصویر کامل روی مانیتور در آن قرار می گیرد.
پیکسل به هر نقطه نوری که بتواند بوسیله اشعه ی الکترونی روشن شود پیکسل یا پل نامیدهخ می شود.
نسبت ظاهری برابر با تعداد ستون های پیکسلی بر تعداد خط های پویش قابل نمایش توسط سیستم تعریف می شود. نمونه 4:3 یا 16:9
دامنه ی رنگها یا سطوح خاکستری به الف ) نوع فسفر به کار رفته در CRT ب) به تعداد بیت های قابل دسترسی برای هر پیکسل در فریم بافر بستگی دارد.
در سیستم سیاه و سفید یک بیت برای نماش هر پیکسل لازم است ولی امروزه برای هر پیکسل رنگی 32 بیت یا 24 بیت در نظر گرفته می شود.
عمق ناحیه بافر یا صفحه بیت ها به تعداد بیت ها به ازای هر پیکسل اطلاق می شود.
نقش بیتی :فریم بافر با یک بیت بر پیکسل و دودویی اطلاق می شود
نقش پیکسلی : یک فرم بافر با بیش از یک پیکسل دارای الگوی رنگ چند گانه را گوییم
درهم ریسی : برای اینکه سرعت نمایش یک تصویر را افزایش دهیم تصویر را در دو گذر نمایش می دهیم در گذر اول اشعه ی الکترونی خط پویش را از بالا به پایین و یک در میان جاروب می کند سپس اشعه ی الکترونی بعد از بازگشت عمودی , خط های پویش با قیمانده را جارو می کند. و باعث یک دید کلی از تصویر در زمانی معادل با نصف حالت معمو می شود.
نمایش پویش تصادفی
در این حالت اشعه ی الکترونی فقط به قسمت هایی هدایت می شود که باید تصویر رسم شود و تصویر به پاره خط هایی مجزا تقسیم بندی می شود و به این علت به آنها پویش برداری نیز می گویند. نرخ رفرش به تعداد خط ها بستگی دارد که باید ترسیم شوند تصویر به صورت مجموعه ایی از دستورات ترسیم خط در قسمتی به نام فهرست نمایش فایل یا فایل بردار ذخیره می شود.
نرخ رفرش بالا باعث سوخته شدن فسفر ها می شود و با عث ایجاد وقفه در نمایش تصویر می گردد.
نکته این سیستم برای حالت تک رنگ است یعنی یا بیت ها روشن هستند یا خاموش و قسمتی از پیکسل ها روشن می شوند. و بقیه بدون تغییر می مانند.
صفحه نمایش های رنگی
تصاویر رنگی با استفاده از ترکیب فسفر هایی که نورهای متفاوتی منتشر می کنند ایجاد می شوند
روش نفوذ اشعه : در این روش از دو لایه فسفر با رن های قرمز وسبز استفاده می شد که اشعه ایی با الکترون های کند به لایه قرمز خارجی برخورد می کرد و سپس برعکس الکترون ها به صورت سریع به لایه سبز داخلی نفوذ و آن را تحریک می کردند رنگ صفحه نمای را در این حالت می توان بوسیله ی ولتاژ شتاب دهنده کنترل کرد .
چون روش پر هزینه و بی کیفیتی بود کنار گذاشته شد.
روش ماسک سایه ایی:
در این روش هر پیکسل از سه فسفر با رنگ های (قرمز - سبز - آبی ) تشکیل شده است که بوسیله ی سه تفنگ مجزا به سمت صفحه شتاب داده می شوند و هر سه در قسمت ماسک سایه به شکل مثلثی در می آیند و این اشعه ها به گونه ایی هستند که فقط فسفر مربوط به خود را می توانند روشن کنند . این روش در بیشتر تلویزیون ها رنگی و مانیتور ها استفاده می شود.
http://upload.wikimedia.org/wikipedia/commons/thumb/9/9b/CRT_color_enhanced.png/250px-CRT_color_enhanced.png
1- قسمت سه تفنگ الکترونی برای فسفر های قرمز و سبز و آبی
2- شعاع الکترونی
3- سیم پیچ متمرکز کننده
4. سیم پیچ منحرف کننده
5. اتصال آند
6. لایه ماسک سایه برای تفکیک شعاع های نوری قرمز و سبز و آبی
7. صفحه نمایش با لایه های فسفر قرمز و سبز و آبی
8. تصویر بسته از صفحه نمایش که رنگ ها به صورت مجزا قابل رویت هستند.
تغییرات رنگ را می توان با تغییر تراز شدت الکترونی هر سه تفنگ بدست آورد که با 24 بیت 256 تراز شدت مجزا برای هر تفنگ داریم . که به آن سیستم تمام رنگی می گویند. که انتخاب حدود 17 میلیون رنگ را برای هر پیکسل فراهم می کند.
صفحات نمایش تخت
اصطلاح صفحه نمایش تخت به مجموعه ایی از دستگاه های ویدئویی اطلاق می شود که در مقایسه با یک CRT وزن , حجم و مصرف انرژی کمتری دارند. که به دوگروه نمایش های پخشی و نا پخشی تقسیم بندی می شوند.
پخشگر ها دستگاه هایی هستند که انرژی الکتریکی را به نور تبدیل می کنند. مثال : صفحات پلاسما , الکترو لومینانس , فیلم نازک , دیود های پخش گر نور , CRT های تخت
نا پخشگر ها دستگاه هایی هستند که نور خورشید یا منابع دیگر را با استفاده از اثرات نوری به الگوهای گرافیکی تبدیل می کنند. مثل : صفحه نمایش کریستال مایع LCD
صفحات پلاسما : که نمایشهای تخلیه گاز نیز نامیده می شوند معمولا با پر کردن فضای بین دو ورق شیشه ایی با مخلوطی از گازها که گاز نئون نیز معمولا یکی از آنهاست ساخته می شود یک سری نوار های رسانای عمودی در یکی از ورق های شیشه ایی و یک سری نوارهای افقی در ورق دیگر قرار داده می شود.
http://upload.wikimedia.org/wikipedia/commons/thumb/5/5d/Plasma-display-composition.svg/400px-Plasma-display-composition.svg.png
ولتاژ احتراق اعمال شده بر یک جفت از رسانا های افقی و عمودی باعث می شود که گاز واقع در محاقی دو رسانا به پلاسمای تابانی از الکترون ها و یون ها تبدیل شود و جدایی بین پیکسل ها بوسیله ی میدان الکتریکی رسانا ها امکان پذیر است.
ساخت صفحات نمایش الکترو لومینانس فیلم نازک مشابه صفحات پلاسما است با این تفاوت که فضای بین ورق های شیشه ای به جای گاز از یک فسفر مثل سولفید روی آغشته به منگنز پر می شود. زمانی که ولتاژ نسبتا بالایی به یکی از زوج الکترود ها ی متقاطع اعمال شود فسفر واقع در ناحیه تلاقی الکترود ها رسانا می شود و سپس انرژی الکتریکی بوسیله اتم های منگنز جذب می شود و متعاقب آن نقطه ایی نورانی آزاد می شود. این صفحات نسبت به پلاسما به برق بیشتر نیاز دارند و رنگ خوبی نیز تولید نمی کنند.
دیود پخش نور LED: در آن ماتریسی از دیود های آرایش یافته برای تشکیل مواضع پیکسل ها ی صفحه ی نمایش به کار می رود .
نمایش های کریستال مایع :
در این سیستم که از نوع غیر پخشی است یک تصویر با عبور دادن نور قطبی شده از منبع نور محیط یا از منبع نور داخلی از میان مواد کریشتال مایع تشکیل می دهداین مواد می توانند به گونه ایی ردیف بندی شوند که باعث عبور نور یا مانع عبور آن شوند.
هر چند کریستال مایع به آرایش کریستالی از ملکول ها دلالت دارد ولی مثل مایعی روان است صفحات نمایش تخت معمولا از ترکیب کریستال مایع نخ کشی شده استفاده می کنند این کریستال ها گرایش به نگهداری محوری بلند از ملکولهای میله مانند هم ردیف دارند.
انواع مختلفی از این مواد در طبیعت وجود دارند اما آن دسته از آنها که با ولتاژ تغییر می کنند درLCD ها به کار می روند. در این LCD ها مولکولهای کریستال می چرخند و تغییر زاویه می دهند . بر اثراین خصلت بر اثر وصل کردن ولتاژ به کریستال جهت دو قطبی های کریستال هم جهت با میدان الکتریکی ناشی از ولتاژ می شوند . بر طبق این حالت اگر دو تکه شیشه پلاروید یا قطبشگر را روی هم قرار دهیم میتوانیم با تغییر جهت مولکولهای کریستال بکار رفته در بین آنها تصاویری سیاه و سفید(بی رنگ) تشکیل داد. اما در مورد صفحات پلاروید ، اگر دو تکه شیشه پلاروید را روی هم قرار دهیم و یکی را 90 درجه بچرخانیم می بینیم که صفحه تیره می شود (نوری از بین این دو صفحه عبور نمی کند) ، خوب همانطور که خواندیم اگر دو صفحه پلاروید را بر روی هم قرار دهیم (و در حالتی قرار دهی که نور از بینشان عبور کند) واز مقداری کریستال در بین آنها استفاده کنیم با تغییر ولتاژاعملی به کریستال جهت مولکولها تغییر می کند و نوری که از شیشه پلاروید اول عبور می کند 90 درجه تغییر جهت می دهد و به صفحه دوم برخورد می کند با توجه به خاصیت توضیح داده شده نور از صفحه دوم عبور نمی کند و تصویری تیره بوجود می آید.
در LCD ها نوری بوجود نمی آید بلکه نور موجود در محیط تغییر داده می شود. به همین خاطر است که LCD ها را در تاریکی نمی توان استفاده کرد. به خاطر این خصلت که خود مولد نور نیستند مصرف کمتری نسبت به لامپها و دیودها دارند.
دو ورقه ی شیشه ای ماده ی کریستال مایع را ساندویچ وار احاطه کرده اند هر کدام از این ورقه های شیشه ایی قطبی کننده ی نوری واقه در وضعیت 90 درجه نسبت به همدیگر را شامل اند.سطر هایی از رسانا های شفاف به صورت افقی در یک ورق شیشه ای و ستونهایی از رسانا ها ی عمودی در ورق شیشه ایی دیگر قرار گرفته اند محل تلاقی دو رسانا پیکسلی را تعریف ی کند . معمولا ملکولها به حالت روشن نشان داده می شوند ,
http://qxwujoey.tripod.com/lcdworks.gifhttp://upload.wikimedia.org/wikipedia/commons/thumb/3/3d/LCD_RGB_subpixel.jpg/300px-LCD_RGB_subpixel.jpg
نور قطبی شده ذر زمان عبور از میان ماده پیچ خورده و از میان قطبی کننده مقابل عبور خواهد کرد به این ترتیب نور بطرف ناظر تابیده شده و پیکسل روشن می شود.
برای خاموش کردن یک پیکسل ولتاژی به محل تلاقی دو رسانا اعمال می شود تا ملکول ها هم ردیف شده و نور دیگر پیچ نخورد این نوع دستگاه سفحه تخت ماتریس منفعل LCD نامیده می شود.
روش دیگر برای ساخت LCD ها قرار دادن ترانزیستور در مکان هر پیکسل با استفاده از فناوری ترانزیستور فیلم نازک است.این صفحات نمای ماتریس فعال نامیده می شود.
دستگاه های دید سه بعدی
این فناوری به کمک بازتاب تصویر مانیتور معمولی از یک آینه نوسان پذیر و قابل تنظیم ایجاد می شود. نوسان آینه باعث تغییر فاصله ی کانونی آن می شوداین نوسانات با نمایش جسم بر روی مانیتور به گونه ایی هماهنگ می شود که هر نقطه از سطح جسم از طریق آینه به نقطه ایی در فضا منعکس می شود که متناظر با نقطه دید مزبور از موقعیت دید مشخص شده است.
سیستمهای واقعیت مجاز ی و برجسته نما
روش دیگر برای نمایش اجسام سه بعدی نمایش دید های بر جسته نما از جسم است این روش تصویر سه بعدی واقعی تولید نمی کند اما با ارائه ی دیدی متفاوت به هر چشم بیننده جلوه ای سه بعدی تولید می کند که در آن به نظر می رسد صحنه ها دارای عمق اند.
یکی از روش های تولید تصویر بر جسته نما در سیستم راستر نمایش هر دید در دور های رفرش متوالی است.صفحه مانیتور توسط عینک های خاص نگریسته می شود.عدسی های عینک به گونه ای ساخته ده اند که مشابه یک شاتر به صورت هماهنگ سریع و یک در میان یکی از دید ها را بلوکه می کنند.
روش دیگر خلق واقعیت مجازی استفاده از پروژکتور ها برای تولید صحنه در آرایه ایی از دیوار هاست که در آن ناظر با استفاده از شیشه های بر جسته نما و دستکشهای داده ایی با یک نمایش مجازی تعلمل بر قرار می کند.
اتمام قسمت 1
2- دستگاه های پویش راستری
در سیسم های راستری از چند واحد پردازشگر استفاده می شود .
http://up.iranblog.com/37262/1268688223.gif
قسمت کنترلگر ویدئویی کار های متنوعی انجام می دهد از جمله تعیین وضعیت اشعه ی الکترونی (موقعیت پیکسل ها و شدت آنها) سازگار کردن صفحه نمایش با RAM سیستم اعمال افکت بر روی گروهی از پیکسل ها (مثلا مانیتور رنگی تصویر را به حالت سیاه و سفید نمایش دهد یا قسمتی از صفحه را بزرگ یا کوچک میکند) و امکان ارتباط با دوربین فیلم برداری و غیره را فراهم می کند.
پردازشگر نمایش پویش راستری : هدف آن آزاد سازی CPU کامپیوتر از انجام کار های گرافیکی است.
تبدیل پویش : رقمی کردن تصویر داده شده در برنامه ای کاربردی به مجموعه ایی از مقادیر شدت برای پیکسلها جهت ذخیره سازی در فرم بافر است.
این مباحث چون زیاد اهمیتی نداره توضیح نمی دم.
4- دستگاه های دید و ایستگاه های کاری گرافیکی
5- دستگاه های ورودی
6- دستگاه های نسخه چاپی
7- شبکه های گرافیکی
8- گرافیک در اینترنت
اتمام حذفیات
9- نرم افزار های گرافیکی
کلا نرم افزار های گرافیکی را به صورت زیر طبقه بندی می کنیم :
الف ) بسته های تک منظوره : احتیاج به برنامه نویسی ندارند و کاربر با منو ها و ... کار می کند. مثل فوتوشاپ و غیره
ب ) بسته های برنامه نویسی عمومی : احتیاج به برنامه نویسی با توابع این بسته وجود دارد. مثل GL, OpenGL , VRML , java 2D , java 3D
نمایش سیستم مختصات
برای تولید یک تصویر توسط یک بسته برنامه نویسی نخست باید توصیفات هندسی اشیای مورد نمایش را ارائه دهیم این توصیفات , مکانها و شکلها ی اشیاء را مشخص می کنند برای مثال یک جعبه را میتوان با گوشه های رئوس آن مشخص کرد و یک کره را می توان با موقعیت شعاع و مرکز آن تعریف کرد به جز چند مورد استثنایی بسته های گرافیکی عمومی مستلزم این هستند که توصیفات مزبور در یک سیستم متخصات دکارتی استاندارد و راستگرد تعیین شوند اگر مقادیر مختصات برای یک تصویر در سیستم مختصات دیگر (کروی هزلولی و غیره) داده شدهخ باشند باید آنها را قبل از دادن به بسته ی گرافیکی به سیستم مختصات دکارتی تبدیل کرد یک بسته گرافیکی خاص منظوره که برای کاربرد های ویژه ایی طراحی شده باشد می تواند استفاده از سیستم مختصات دیگری را که برای این کاربرد ها مناسب ترند فراهم سازد.
معمولا در فرآیند تولید و نمایش یک صحنه از چند سیستم مختصات دکارتی مختلف استفاده می شود نخست شکل های اشیای انفرادی مثل درختان یا مبلمان داخل صحنه را می توانیم در سیستم مختصات جداگانه ای برای هر شی تعریف کنیم این سیستم مختصات را سیستم مختصات مدل یا گاهی سیستم مختصات محلی می نامند.
بعد از اینکه شکل های اشیای انفرادی مشخص شدند یک صحنه را می توان با قرار دادن اشیای در مکان های مناسب در یک سیستم مختصات صحنه به نام سیستم مختصات جهانی ساخت (مدل سازی کرد) .
مواضع سیستم مختصات جهانی نخست به مختصات دیدی که متناظر است با دیدی که میخواهیم از موقعیت یا جهت دیدی یک دوربین فرضی از صحنه داشته بایم تبدیل می شوند سپس سیستم سپس مواضع مختصات جسم به یک پروجکشن دو بعدی از صحنه متناظر با آنچه بر روی دستگاه خروجی خواهیم دید تبدیل می شوند بعد صحنه در سیستم مختصات نرمالیزه که در آن مقدار هر مختصه , بسته به سیستم , در دامنه -1 تا 1 یا 0 تا 1 قرار دارد ذخیره می شود مختصات نرمالیزه را مختصات دستگاه نرمالیزه نیز می گویند . زیرا استفاده از این نمایش یک بسته ی گرافیکی را از دامنه ی مختصه برای هر دستگاه خروجی تعیین شده مستقل می سازد همچنین لازم است تا سطوح مرئی را مشخص کرده و قسمت های بیرونی تصویررا نسبت به مرز های دیدی که می خواهیم بر روی دستگاه نمایش نشان دهیم حذف می کنیم سر انجام تصویر برای نمایش داده شدن به رفرش بافر یک دستگاه راستر تبدیل پویش می شود سیستم مختصات برای دستگاه نمایش معمولا مختصات دستگاه یا در حالت یک صفحه نمایش ویدئویی , مختصات صفحه نمایش نامیده می شود اغلب مختصات نرمالیزه و مختصات صفحه نمایش هر دو در سیستم مختصات چپ گرد تعیین می شوند به گونه ای که افزایش فواصل مثبت از صفحه ی xy را می توان مشابه دور تر شدن از موقعیت دید تعبیر کرد.
http://up.iranblog.com/37262/1268725174.gif
نمایش تبدیل مختصات ها
انواع توابع گرافیکی :
مبنای خروجی گرافیکی : خروجی هایی مانند حروف , اشکال هندسی مثل نقطه خط پاره خط قطعه منحنیها سطوح پر شده با رنگ (چند ضلعی ها) و شکل های تعریف شده توسط آرایه ایی از نقاط رنگ را شامل می شود.
ویژگی ها : خواص خروجی های مبنا را مشخص می کند.
تبدیلات هندسی : اندازه , موقعیت , وجهت جسم ر در یک صحنه را مشخص می کند.
تبدیلات مدل سازی : برای ساخت صحنه ایی که تک تک اجسام آن در سیستم مختصات محلی خود توصیف شده باشند.
تبدیلات دید : برای انتخاب یک دید از صحنه کاربرد دارند.
توابع ورودی : کنترل و پردازش جریان داده ورودی از دستگاه های ورودی را بر عهده دارند.
توابع عملیات کنترل : به توابعی اطلاق می شود که وظایف آماده سازی و مقدار اولیه داده به پارامتر ها را بر عهده دارند.
استاندارد های نرم افزاری
وقتی یک بسته گرافیکی ایجاد می شود مهمترین هدف حمل بری است. یعنی بتوان برنامه نوشته شده را با هر نوع سخت افزار و سیستم عاملی اجرا کرد.
بر همین اساس در سال 1984 اولین بسته استاندارد شده GKS بوسیله ISOو ANSI منتشر شد. و در ابتدا یک بسته گرافیکی دو بعدی بود که به محیط سه بعدی نیز گسترش یافت. در همین زمان یک بسه گرافیکی با نام GL که در شرکتهای SGI (silicon graphoc inc) 0 طراحی شده بود محبوبیت خاصی پیدا کرد و به صورت بالفعل به یک استاندارد تبدیل شد.
در اوایل سال 1990 , OpenGL به عنوان نسخه ایی مستقل از سخت افزار GL معرفی شد و در حال حاضر این بسته بوسیله OpenGL Architecture Review Board که کنسرسیومی شاخص از بسیاری از سازمانها و کمپانی های گرافیکی است نگهداری و به روز می شود.
بسته های گرافیکی دیگر
بسته های گرافیکی مختلفی وجود دارند که برای اهداف مختلفی طراحی شده اند برای اطلاعات بیشتر به این لینک (http://en.wikipedia.org/wiki/Category:Graphics_libraries) مراجعه کنید مثال : open invertor که یک سری روتینها شی گرای برای توصیف صحنه را با استفاده از OpenGL در دسترس قرار می دهد. java2D , java3D, VMRL نموه های دیگر بسته های گرافیکی هستند.
pswin.pooya
یک شنبه 23 اسفند 1388, 14:48 عصر
به نظر من اگر واقعا میخوای تاپیک رو ادامه بدی بهتره یه سر فصل برای مطالب آموزشی تهیه کنی و بعدش ...
2. توضیح در مورد مفاهیم گرافیک میتونه مفید باشه اما نه برای یه API گرافیکی. چون شما تنها آموزش OpenGL رو مد نظر گرفتن بهتره کار رو با آموزش توابع و مفاهیم مربوطه ادامه بدین. مفاهیم اولیه گرافیک مثل نحوه عملکرد و ... تنها میتونه به درد درسهایی مثل گرافیک یک بخوره.
amin1softco
یک شنبه 23 اسفند 1388, 15:51 عصر
دوست من ,
من در پست اول هدفم رو ذکر کردم و این مباحثی که الان قرار می دم دقیقا با کتاب دارم پیش می رم و از فردا یا پس فردا وارد قسمت کد نویسی 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 */
خروجی :
http://s2.picofile.com/file/7329208595/Ubuntu_opengl.png
+ (http://salemsayed.me/?p=164)
amin1softco
دوشنبه 24 اسفند 1388, 10:57 صبح
چگونه برنامه های OpenGL را با dev اجرا کنیم:
چون به طور پیش فرض در این برنامه هدر glut وجود نداره ما باید پکیجش رو نصب کنیم برای این کار مراحل زیر را دنبال کنید:
http://up.iranblog.com/37262/1268722048.jpg1- آپدیت پکیج ها
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
سه شنبه 25 اسفند 1388, 08:47 صبح
مقدمه ایی بر 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 حلقه برای دریافت پارامتر های ورودی و...
http://up.iranblog.com/37262/1268789531.jpg
سر فایل glu شامل روتین ها و توابعی برای تشکیل ماتریس های پروجکشن و دید , توصیف اشیای پیچیده با تقریب های خطی , نمایش منحنی ها و رویه ها ی درجه 2 و بی اسپلاینها توسط تقریب خطی پردازش عملیات رندر سازی رویه می باشد.
برای مشاهده لیست تمام توابع gl و glu به این لینک مراجعه کنید:
http://msdn.microsoft.com/en-us/library/dd374211(VS.85).aspx (http://msdn.microsoft.com/en-us/library/dd374211%28VS.85%29.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
چهارشنبه 26 اسفند 1388, 08:15 صبح
فصل سوم
این فصل بیشتر در مورد الگوریتم های ترسیم در سیستم راستر مثل 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();
لیست کامل:
http://up.iranblog.com/2161/1269733512.jpg
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 (mk:@MSITStore:D:%5CUsers%5Camin%5CDocuments%5CDow nloads%5Cogl%20man.CHM::/glArrayElement.3G.html), glMaterial, and glEdgeFlag (mk:@MSITStore:D:%5CUsers%5Camin%5CDocuments%5CDow nloads%5Cogl%20man.CHM::/glEdgeFlag.3G.html). Also, it is acceptable to use glCallList (mk:@MSITStore:D:%5CUsers%5Camin%5CDocuments%5CDow nloads%5Cogl%20man.CHM::/glCallList.3G.html) or glCallLists (mk:@MSITStore:D:%5CUsers%5Camin%5CDocuments%5CDow nloads%5Cogl%20man.CHM::/glCallLists.3G.html) 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
جمعه 28 اسفند 1388, 00:30 صبح
رسم یک دایره به روش های مختلف :
می دونید که دایره در توابع هسته 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
یک شنبه 01 فروردین 1389, 15:29 عصر
چگونه با 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;
}
http://up.iranblog.com/2161/1269258550.jpg
ولی باز چند محدودیت در استفاده از این تابع ها وجود داره اول که فقط چند فونت خاص رو پشتیبانی می کنه و این یک عیب خیلی بزرگه و مشکل بعدی قابلیت فارسی نویسی وجو نداره برای رفع این مشکل ها چند راه وجود داره اولیش اینه که از ویندوز کمک بگیریم یعنی نوشته رو بوسیله GDI+ تبدیل به یک عکس کنیم و در برنامه لود کنیم و راه دیگه اینه که از کتابخانه های مربوط به این کار استفاده کنیم.
ولی دوستان عرب زبان ما یک کتابخانه طراحی کردند که من خودم تست کردم با visual C++2008 کار میده خیلی جالبه
نمونش با فونت هما :
http://up.iranblog.com/2161/1269219392.jpg
چندتا برنامه هم مربوط به یک فردی به نام nehe که حتما ببینید جالبه
اینا لینکاشه ضمیمه هم همین برنامه عربیست :
Lesson 13 - Bitmap Fonts (http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=13)
Lesson 14 - Outline Fonts (http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=14)
Lesson 15 - Texture-Mapped Outline Fonts (http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=15)
amin1softco
دوشنبه 02 فروردین 1389, 11:30 صبح
چگونه یک مدل را بوسیله 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 (http://www.3dcodingtutorial.com/Working-with-3D-models/Importing-the-model-in-C++%E2%80%8E%E2%80%8E.html)
اینو بگم که راه های زیادی برای انجام چنین کاری وجود داره بهتره لینک زیر رو چک کنید و توضیحات سایت رسمی OpenGL را مشاهده کنید:
http://www.opengl.org/resources/faq/technical/miscellaneous.htm
اولیش پلی ترانسه هر وقت دانلود کردم نتیجشو می گم......
نتیجه آقا خیلی این پلی ترانس کارش بیسته شما از هر نرم افزار طراحی معروف استفاده کنید این براش یک پلاگین ایجاد کرده و بوسیله اون پلاگین شما می تونید خروجی سی پلا پلاس ازش بگیرین خیلی خیلی عالیه یعنی انیمیشن با مکس میشه درست کرد تبدیلش می کنه براتون به کد OpenGL خیلی کار رو آسون کرده ................
http://up.iranblog.com/2161/1269415429.jpg
اینم لینک دانلود دمو
http://www.okino.com/download/demos/okino_nugraf_and_polytrans_full_demo.exe
اینم برای پلاگینش
http://www.okino.com/download/demos/okino_plugins_superinstaller_demo.exe
خیلی جالبه یعنی یک قدرتی محسوب میشه برای OpenGL :تشویق:
amin1softco
سه شنبه 03 فروردین 1389, 12:48 عصر
تشخیص برخورد
برای اینکار در هسته 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;
}
منبع (http://barnamenevis.biz/forum/www.swiftless.com/tutorials/opengl/opengltuts.html)
amin1softco
چهارشنبه 04 فروردین 1389, 13:20 عصر
چگونه از 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
http://up.iranblog.com/2161/1269437744.jpg
برای مثال کد زیر را تست کنید:
#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
جمعه 06 فروردین 1389, 14:06 عصر
ورودی صفحه کلید با 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
جمعه 06 فروردین 1389, 20:17 عصر
برای فونت میتونی از کتابخونه FTGL هم استفاده کنی که همه زبونها رو ساپورت میکنه.
amin1softco
شنبه 07 فروردین 1389, 00:58 صبح
برای فونت میتونی از کتابخونه FTGL هم استفاده کنی که همه زبونها رو ساپورت میکنه.
خوب شما می تونی یک مثال اینجا بزاری که از کتابخانه FTGL استفاده کنه و یک متن فارسی را بنویسه.....
pswin.pooya
شنبه 07 فروردین 1389, 02:55 صبح
مثالهای FTGL همراه سورسش برای ویژوال استادیو و ... هستن. علاوه بر این شما می تونید از ویکی اون هم استفاده کنید:
http://sourceforge.net/apps/mediawiki/ftgl/index.php?title=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
شنبه 07 فروردین 1389, 11:29 صبح
مثالهای FTGL همراه سورسش برای ویژوال استادیو و ... هستن. علاوه بر این شما می تونید از ویکی اون هم استفاده کنید:
http://sourceforge.net/apps/mediawiki/ftgl/index.php?title=Main_Page
من تست نکردم ولی ممکنه که FTGL با OpenGL 3.x و OpenGL 4.x به خاطر نداشتن پایپ لاین fixed سازگار نباشه و هیچی نشون نده توی این حالت میتونید از شیدرهای زیر برای نمایش استفاده کنید:
شیدر ورتکس:
varying vec2 Texcoord;
void main( void )
{
gl_Position = ftransform();
Texcoord = gl_MultiTexCoord0.xy;
}شیدر فرگمنت:
uniform sampler2D baseMap;
varying vec2 Texcoord;
void main( void )
{
gl_FragColor = texture2D( baseMap, Texcoord );
}البته این برای GLSL با هسته 110 هستش که استاندارد OpenGL 3.x حداقل 130 هستش. ولی بازهم به درستی کامپایل میشه فقط ممکنه که یه مقدار کارایی پایین تر داشته باشه. به هر حال FTGL هم سریعا با OpenGL 3.x+ سازگار میشه.
والا من هر کاری می کنم 500 اکتسرنال ارور به کتابخونه هاش می گیره شما اگه بتونی تحت ویژوال 2008یک نمونه درست کنی بزاری اینجا مشکل ما هم حل بشه
http://www.opengl.org/resources/features/fontsurvey/
pswin.pooya
شنبه 07 فروردین 1389, 14:01 عصر
اول باید کتابخونش رو کامپایل کنی و بعد از اون مثالها رو.
amin1softco
شنبه 07 فروردین 1389, 14:19 عصر
ببین این کتابخونه هاش که کامپایل شده با چند تا برنامه که خودش برای تست گذاشته هر کدوم رو صلاح دونستی پروژه 2008 کن بزار ما هم استفاد ه کنیم:تشویق:
mg_mahyar
یک شنبه 08 فروردین 1389, 05:01 صبح
سلام منم چند تا کتاب گزاشتم خواستید استفاده کنید
www.perspolisnews.info
amin1softco
یک شنبه 08 فروردین 1389, 09:21 صبح
سلام منم چند تا کتاب گزاشتم خواستید استفاده کنید
www.perspolisnews.info (http://www.perspolisnews.info)
به نظر من برای شروع رد بوک خوبه می تونید خیلی ز این کتاب ها رو از آدرس زیر در یافت کنید:
http://opengl.persiangig.com/page.html (http://www.google.com/url?sa=D&q=http://opengl.persiangig.com/page.html&usg=AFQjCNHy4x9PiZHGVqGBlyTJ8-lu42RpQA)
اینم لیست خفن :
http://gigle.ws/programming%20opengl%20collection.462504.html
اما کتاب به تنهایی فایده نداره حتما برنامه ها رو اجرا کنید:تشویق:
pswin.pooya
یک شنبه 08 فروردین 1389, 09:23 صبح
به راحتی میتونید کتابهای معتبر OpenGL رو از آدرس زیر داونلود کنید:
http://opengl.persiangig.com/
amin1softco
یک شنبه 08 فروردین 1389, 09:25 صبح
کاشکی یکمی دقت می کردی و پست می دادی یا حداقل پست قبلی رو مطالعه می کردی
zuck_619
یک شنبه 08 فروردین 1389, 13:56 عصر
سلام به همه . عیدتون مبارک ... من میخوام یک برنامه بنویسم که یک دایره کوچک رو روی محیط دایره بزرگ حرکت بده . اگه میشه کمک کنید ...
amin1softco
یک شنبه 08 فروردین 1389, 19:32 عصر
دوست من شما برای رسم نقطه روی دایره از این کد استفاده کن
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
یک شنبه 08 فروردین 1389, 20:37 عصر
منم سرگرم شدم نوشتمش البته با دایره بوسیله نقطه میانی این صورتی دورش می چرخه:
http://up.iranblog.com/2161/1269821575.jpg
#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
یک شنبه 08 فروردین 1389, 22:55 عصر
آقا دمتون گرم.
خیلی با حال بود.
میشه یه توضیح هم بدین.
خوبی ذاکر؟
zuck_619
یک شنبه 08 فروردین 1389, 23:32 عصر
خیلی ممنون ...
amin1softco
یک شنبه 08 فروردین 1389, 23:53 عصر
ببین چون رسم دایره سخته ما یک پیکسل بزرگ را به عنوان دایره که حرکت می کنه در نظر کرفتیم و ازاونجا که پیکسل بزرگ به صورت چهار گوشه ما با دستورات صاف کردن (نرم کردن) گوشه ها تبدیلش کردیم به یک دایره این دو خط
glEnable (GL_POINT_SMOOTH);
glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
بعد بوسیله glutIdleFunc(dis);این تابع به glut دستور میدیم که تابع dis رو در اولین زمان ممکن بعدی اجرا کنه و حالت انیمیشن به خاطر این تابعه و خط i+=0.1; که مقدار i را در هر بار فرا خوانی افزایش میده ...
اگه بازم گنگ بگید تا سطر به سطر توضیح بدم
zuck_619
دوشنبه 09 فروردین 1389, 09:57 صبح
روش نقطه میانی رو یکم توضیح بده
amin1softco
دوشنبه 09 فروردین 1389, 10:55 صبح
ببین چون صفحه مانیتور از یک سری پیکسل تشکیل شده برای تشخیص اینکه کدام پیکسل ها ترسیم شوند از الگوریتم ها مختلفی استفاده می شه یکی از اونها نقطه میانی هست که در این الگوریتم ما تنها یکی از اوکتانت های دایره را ترسیم می کنیم و با استفاده که از خاصیت قرینه بودن دایره در حین رسم در یک پیکسل با دستورات آخری در اکتانت ها دیگه هم رسمش می کنیم.
http://up.iranblog.com/2161/1269847980.gif
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) هست حالا برای تعیین اینکه کدوم پیکسل انتخاب بشه از فرمول نقطه میانی استفاده می کنیم که شعاع دایره را از فرمول اصلیش کم می کنیم معادله حاصل علامتش تعیین می کنه که پیکسل بعدی باید کجا رسم بشه الگوریتم کاملش اینه:
http://up.iranblog.com/2161/1269888290.gif
نکته 5/4~1
zuck_619
دوشنبه 09 فروردین 1389, 15:42 عصر
خیلی ممنون از توضیحات . فقط میخواستم بدونم :
1 . نقش circleMidpoint چیه ؟
2. اگه بخوا دایره در جهت عقربه ساعت بچرخه کجارو باید عوض کرد ؟
amin1softco
دوشنبه 09 فروردین 1389, 19:18 عصر
یک دایره رو در مختصات x ,y صفحه با شعاع مشخص شده بوسیله نقاط رسم می کنه همین الگوریتم نقطه میانی را پیاده سازی می کنه ... قبلا گفتم برای رسم یک دایره روش های خیلی زیادی OpenGL موجوده یک روش دیگه که میشه سوال رو باهاش حل کرد این جوریه
glPushMatrix();
glTranslated ( 100 , 75 , 0 ) ;
glColor3f(0.0, 1.0, 1.0);
glutWireSphere ( 50.0 , 100 , 100 ) ;
glPopMatrix();
برای معکوس شدن حرکت نقطه باید i را از 360 شروع کنیم و هر مرحله کمترش کنیم اون شرطه رو هم باید عوض کرد یک راه دیگه هم این کده که کاملا با اون یکی متفاوته:
http://up.iranblog.com/2161/1269920179.jpg
#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
سه شنبه 10 فروردین 1389, 09:56 صبح
مرسی ، ولی این راهها که میگید باسه یه تازه کار سخته فهمیدنش . بازم ممنون . بهتر اولیو بفهمم بعد برم سراغ دومی ...
کارایی void circlePlotPoints (scrPt, scrPt); تو چیه ؟
amin1softco
سه شنبه 10 فروردین 1389, 12:29 عصر
والا من نمی دونم چطوری بگم
دایره به مکان هندسی نقاطی از صفحه اطلاق می شود که از یک نقطه واحد در صفحه به یک فاصله باشند خوب حالا ما می خواهیم چه کار کنیم ما اصلا کاری به دایره ندارم می خواهیم یک پیکسل رو روی محیط این دایره حرکت بدیم پس باید هر مرحله مختصات این پیکسل رو بر اساس مختصات دایره تعیین کنیم
چون فرمول یک دایره در حالت قطبی اینه
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
سه شنبه 10 فروردین 1389, 14:54 عصر
به نظر من برای شروع رد بوک خوبه می تونید خیلی ز این کتاب ها رو از آدرس زیر در یافت کنید:
http://opengl.persiangig.com/page.html (http://www.google.com/url?sa=D&q=http://opengl.persiangig.com/page.html&usg=AFQjCNHy4x9PiZHGVqGBlyTJ8-lu42RpQA)
اینم لیست خفن :
http://gigle.ws/programming%20opengl%20collection.462504.html
اما کتاب به تنهایی فایده نداره حتما برنامه ها رو اجرا کنید:تشویق:
»ا ما فارسی هست
zuck_619
سه شنبه 10 فروردین 1389, 17:19 عصر
چرا ناراحت میشی . سوال کردن که عیب نیست . سوال من اینه که اینجا scrPt مقداردهی نشده و چیزی رسم نمیکنه . مگه یک شی نیست ؟؟؟
amin1softco
سه شنبه 10 فروردین 1389, 19:51 عصر
چرا ناراحت میشی . سوال کردن که عیب نیست . سوال من اینه که اینجا 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
سه شنبه 10 فروردین 1389, 21:36 عصر
دشمنت شرمنده . شما بزرگ مایی ، رو چشه ما جا داری ...
مشکل حل شد . ممنون
moh.mon
چهارشنبه 11 فروردین 1389, 10:22 صبح
سلام آقای amin1softco (http://barnamenevis.org/forum/member.php?u=46176) .
بخشید ولی اگه میشه خط به خط یه توضیحی بدین. یه چیزایی فهمیدم ولی خوب بازم مشکل دارم.
ممنون.
:اشتباه:
mandbigS
چهارشنبه 11 فروردین 1389, 11:09 صبح
:بامزه: سلام ... خوبی ذاکر ؟ اون عکسی که گذاشتی کپی رایت داره ها ... دقت کنی امضام زیرشه ...
راستش دوستان منم نفهمیدم ... اگه یکی از دوستان لطف کنه توضیح خط به خط بده ممنون میشم ...
ولی دستتتون دد نکنه ... خدایی عالی شده ...
amin1softco
چهارشنبه 11 فروردین 1389, 11:14 صبح
سورس اولی یا سورس دومی؟!!!!!!!
zuck_619
چهارشنبه 11 فروردین 1389, 11:16 صبح
دوست من خودتو درگیر نکن . من براشون توضیح میدم . شما به کارایه خودت برس . کجاش مشکل دارین دوستان ؟ تک تک بپرسین !!!
mandbigS
چهارشنبه 11 فروردین 1389, 11:28 صبح
مشکل اول من اینجاس که اصلا رو ویژوالم اجرا نمیشه ... توی سورس اول ارور میده که یه کتابخونه یادت رفته ...
متن ارور :
fatal error C1010: unexpected end of file while looking for precompiled header. Did you forget to add '#include "stdafx.h"' to your source?
mandbigS
چهارشنبه 11 فروردین 1389, 11:40 صبح
خب مشکل قبلیم اینطوری حل شد : ( میذارم تا دوستانم استفاده کنن )
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
چهارشنبه 11 فروردین 1389, 11:56 صبح
خب دوستان حالا یه مشکل دیگه :
error C2065: 'M_PI' : undeclared identifier
از کجاست ؟ البته من با include math امتحان کردم نشد با include cmath نوشتم که شامل math هم میشه ... بازم ارور بالارو داد ... حتی از define _USE_MATH_DEFINES هم استفاده کردم نشد ...
amin1softco
چهارشنبه 11 فروردین 1389, 11:57 صبح
من برای کامپایل شدنش تو صفحات اولیه توضیح دادم که 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
چهارشنبه 11 فروردین 1389, 12:00 عصر
کلاغ عزیز . این همون عدد پی که باید اول برنامه تعریفش کنی . بعد include ها
#define M_PI 3.141592653589
zuck_619
چهارشنبه 11 فروردین 1389, 12:12 عصر
آقا خیلی ممنمون . خدایی حال میدی .
mandbigS
چهارشنبه 11 فروردین 1389, 12:32 عصر
حاجی خیلی ممنون ولی من مشکلم حل نشد ... به M-Pi گیر میده ... ولی بازم دمت گرم
mandbigS
چهارشنبه 11 فروردین 1389, 13:09 عصر
یه خورده تو فرومای C++ گشتم حل شد ... وافعا ممنون ... :تشویق:
amin1softco
چهارشنبه 11 فروردین 1389, 14:08 عصر
اینم توضیح تابع دوم
#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
چهارشنبه 11 فروردین 1389, 15:46 عصر
دستت درد نکنه . کلاغ مشکلت چی بود ؟
moh.mon
چهارشنبه 11 فروردین 1389, 17:16 عصر
سلام دوستان.
اول از امین آقا به خاطر فروم پر باری که را انداخته تشکر می کنم.
و همچنین از دوستان دیگه که این همه علاقه از خودشون نشون میدن.
میخواستم چند تا تمرین گرافیک برامون قرار بدین تا بیشتر با برنامه نویسی opengl آشنا شیم.
در ضمن از ذوک و کلاغ هم تشکر میکنم.
amin1softco
پنج شنبه 12 فروردین 1389, 02:37 صبح
من والا خودم مثل شما تازه کارم اما میشه با همین برنامه مثال های زیادی ایجاد کرد مثلا
1- برنامه ایی بنویسید که در آن 2 دایره کوچک روی محیط یک دایره بزرگتر در خلاف جهت همدیگر حرکت کنند.
2- برنامه ایی بنویسید که با فشردن کلید up صفحه کلید سرعت چرخش دایره های برنامه مثال قبل را زاید و با کلید down سرعت آنرا کم کند.
3- برنامه ایی بنویسید که در آن یک دایره رو محیط دایره دیگر گردش کرده و این مجموعه نیز دور یک دایره بزرگ تر حرکت کنند.
mandbigS
پنج شنبه 12 فروردین 1389, 21:39 عصر
واقعا از تلاش های دوستان امین ، ذوووووووک و موه موم تشکر دارم ... واقعا تلاش دوستان برای یادگیری جای تقدیر داره خدایی ...
به امید موفقیت تک تکتون :چشمک:
mandbigS
پنج شنبه 12 فروردین 1389, 22:09 عصر
من اولیو نوشتم ... البته مطمئنا آماتور هستش ... :لبخند:
#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
پنج شنبه 12 فروردین 1389, 22:30 عصر
من والا خودم مثل شما تازه کارم اما میشه با همین برنامه مثال های زیادی ایجاد کرد مثلا
1- برنامه ایی بنویسید که در آن 2 دایره کوچک روی محیط یک دایره بزرگتر در خلاف جهت همدیگر حرکت کنند.
2- برنامه ایی بنویسید که با فشردن کلید up صفحه کلید سرعت چرخش دایره های برنامه مثال قبل را زاید و با کلید down سرعت آنرا کم کند.
3- برنامه ایی بنویسید که در آن یک دایره رو محیط دایره دیگر گردش کرده و این مجموعه نیز دور یک دایره بزرگ تر حرکت کنند.
اولی که کلاغ عزیز لطف کردن نوشتن. (البته زیاد هم سخت نبود :چشمک:)
ولی اگه میشه یکم دومی رو بیشتر توضیح بدین.
چه طوری باید از کاربر داده بگیریم؟
mandbigS
پنج شنبه 12 فروردین 1389, 22:57 عصر
آره دیگه من تقلب کردم سریع نوشتم ... دادا جون فکر می کنم باید مثل C# از KeyEventArgs استفاده کنیم ولی نمی دونم تو C++ چطوریه ...
amin1softco
جمعه 13 فروردین 1389, 00:06 صبح
من در چند پست قبلی کیبورد را توضیح دادم یک نگاهی بندازید باید از تابع کلید های خاص استفاده کنیم...
mandbigS
جمعه 13 فروردین 1389, 00:11 صبح
داداشی یه سوال ... میشه بگی چطوری کدهاو با اون شکل تو پست های خودت میاری ؟ یاد مام بدی ممنون می شیم ...:گریه:
amin1softco
جمعه 13 فروردین 1389, 00:15 صبح
داداشی یه سوال ... میشه بگی چطوری کدهاو با اون شکل تو پست های خودت میاری ؟ یاد مام بدی ممنون می شیم ...:گریه:
برای کار با کیبرد این پست را ببینید
http://barnamenevis.org/forum/showpost.php?p=938687&postcount=16
برای نوشتن کد به این صورت کدتون رو بیت تگ ها
قرار بدید
mandbigS
جمعه 13 فروردین 1389, 00:38 صبح
من خیلی تلاش کردم ولی جواب نداد ... داداشی میشه بگی چطوری باید ارتباط بین تابع keyboard و display رو برقرار کنیم ؟
amin1softco
جمعه 13 فروردین 1389, 01:02 صبح
من خیلی تلاش کردم ولی جواب نداد ... داداشی میشه بگی چطوری باید ارتباط بین تابع 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
جمعه 13 فروردین 1389, 01:18 صبح
#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
جمعه 13 فروردین 1389, 01:38 صبح
این راهش نیست عزیز
باید یک متغیر سوم تعریف کنی....
در ضمن در کدی که شما نوشتی همیشه به مقدار i اضافه میشه در هر دو حالت....
mandbigS
جمعه 13 فروردین 1389, 10:34 صبح
درستش کردم ... کافیه اینو بنویسیم تو بالایی ...
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
جمعه 13 فروردین 1389, 11:24 صبح
برای من که درست کار نمی کنه !!!!!!!!!!!!!!!!!!!!!؟
mandbigS
جمعه 13 فروردین 1389, 12:34 عصر
برا من کار کرد ... فایل اجرایی رو می ذارم ...
amin1softco
جمعه 13 فروردین 1389, 12:54 عصر
برا من کار کرد ... فایل اجرایی رو می ذارم ...
خیلی باحالی پسر ...:تشویق:
منظورم این بود که جواب سوال این نیست یعنی یک دایره ثابت وجود داره شما وقتی کلید up رو فشار می دی شروع به حرکت کنه و هرچقدر بیشتر کلید رو بگیری بیشتر سرعت می گیرهحالا باید کلید down رو وقتی فشار می دیم سرعتش رو کم کنه تا جایی که بایسته و دوباره بر عکس حرکت کنه؟
mandbigS
جمعه 13 فروردین 1389, 14:12 عصر
خب داداشی برای ان کار میشه به جای i+=1 از i+=i استفاده کرد که بتونیم به گلوله شتاب بدیم اما اینم نمیشه کنترل کرد ... خیلی سریع پیشرفت می کنه و بعد از چند ثانیه دیگه نمیشه دیدش ... پس من با i+=i/100 به گلوله هل شتاب دادم ... ببین داداشی منظورت اینه ... فایل اجرایی رو گذاشتم ...
amin1softco
جمعه 13 فروردین 1389, 14:18 عصر
ببین این راهش نیست تو پست قبلی گفتم یک متغیر دیگه کم داره....
mandbigS
جمعه 13 فروردین 1389, 14:21 عصر
ای خدا ... داداشی چیستان شدا ... میشه خودت رو کنی ببینیم چیه ... مرسی :گریه:
amin1softco
جمعه 13 فروردین 1389, 14:54 عصر
ببین اینقدر سخت نیست که فکر می کنی
#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
جمعه 13 فروردین 1389, 15:05 عصر
آهان ... ایول ... کلیت کارو توضیح میدین ؟ منظور این متغیرا چطوری کار میکنن ؟ چطوری پر میشن ؟ چطوری به هم مربوط هستن ؟
در ضمن داداشی سومیم راهنمایی کن تا شب بنویسیم بره پی کارش ... راهنمایی تپلا ... من خیلی اونو علاقه دارم بنویسم ... :متفکر::متفکر::متفکر:
amin1softco
جمعه 13 فروردین 1389, 15:16 عصر
خوب اینکه خیلی واضحه ما یک i داریم که مقدارش برحسب m تغییر می کنه وقتی که ما با کلید ها مقدار m را کم و زیاد کنیم چون مقدار i بوسیله m تعیین می شه پس در نتیجه سرعت چرخش کم و زیاد می شه ....
mandbigS
جمعه 13 فروردین 1389, 15:28 عصر
در ضمن داداشی سومیم راهنمایی کن تا شب بنویسیم بره پی کارش ... راهنمایی تپلا ... من خیلی اونو علاقه دارم بنویسم ... :متفکر::متفکر::متفکر:
داداشی اینم یه راهنمایی بکن کارشو بسازیم ...
amin1softco
جمعه 13 فروردین 1389, 15:47 عصر
اینم مثل بقیه است فقط دوتا دایره و یک نقطه بیشتر باید روی کاربرد این دقت کنی glPushMatrix();
mandbigS
جمعه 13 فروردین 1389, 20:13 عصر
عزیز جان من از ظهر هزار تا چیز بلکه امتحان کردم و نشد ... سیزدهمونم با برنامه در شد :لبخند: ... دادا رو کن ببینیم چجوریه ... نمی دونم چرا با C++ و OpenGL اصلا راحت نیستم ... C# خیلی بهتره به نظرم ...
amin1softco
جمعه 13 فروردین 1389, 20:22 عصر
ببین شما با سی شارپ بنویس قبولت داریم...............:چشمک: با وی بی هم نوشتی مسئله ایی نیست
mandbigS
جمعه 13 فروردین 1389, 20:26 عصر
خب با C# هم بنویسم باز OpenGl داره دیگه ... ولی ای کاش یه سری پروژه آماده ساده بود تا آدم از روش یاد می گرفت ... چشم بسته که نمی شه نوشت داداشی ... اگه آدرسی چیزی تو نت داری که از اینا داره رو کن ... این آخرین تمرینم بزار که ما تو کفیم ...:کف:
amin1softco
جمعه 13 فروردین 1389, 20:49 عصر
راستش اینو خودم تا الان ننوشتم اما برای تمرین یک کتاب به نام رد بوک Red book تمرینای خیلی خیلی ساده داره یک نگاه به تمریناش بنداز
pswin.pooya
جمعه 13 فروردین 1389, 21:50 عصر
اینم کد همون دو تا دایره با تنظیم سرعت :
#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
جمعه 13 فروردین 1389, 22:30 عصر
نمی دونم پویا جون تو چرا به ما که می رسی دقت نمی کنی اینو که جواب دادیم سوال سوم الان مسئله است ؟http://barnamenevis.org/forum/showpost.php?p=943377&postcount=77
الان مسئله اینه
3- برنامه ایی بنویسید که در آن یک دایره رو محیط دایره دیگر گردش کرده و این مجموعه نیز دور یک دایره بزرگ تر حرکت کنند.
mandbigS
جمعه 13 فروردین 1389, 22:52 عصر
اینم کد همون دو تا دایره با تنظیم سرعت :
فکر کنم دنبال این بودین بازم اگر چیزی رو جا انداخته باشم بگین.
دمت جیز بابا ... دمت جیز ... اما مسئله اونیه که دوستمون گفتن ... :گیج:
amin1softco
جمعه 13 فروردین 1389, 23:36 عصر
اینم جواب مسئله ی سوم
http://up.iranblog.com/2162/1270318324.jpg
#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
شنبه 14 فروردین 1389, 00:01 صبح
سلام
شرمنده از اونجا که وقت ندارم. نمی تونم تاپیک ها طولانی رو بخونم و سعی میکنم تنها به مشکل رسیدگی کنم؟!!!!:چشمک:
اما در مورد این مسال: همه اینها مثالهای ساده 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
شنبه 14 فروردین 1389, 10:22 صبح
برنامه ایی بنویسید که شکل ضمیمه را پیاده سازی کند؟
mandbigS
شنبه 14 فروردین 1389, 12:38 عصر
سلام ... من اینو نوشتم ولی نمی دونم چطوری باید دایره رو نصف کنم ...
#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
شنبه 14 فروردین 1389, 14:19 عصر
ببین منم نمی دونم چطور باید دایره را نصف کرد ولی می شه دایره را با مختصات قطبیش رسم کرد.
فرض کن اصلا از این کد نمی تونیم استفاده کنیم
GLUquadricObj *circle = gluNewQuadric ();
gluQuadricDrawStyle (circle, GLU_SILHOUETTE);
gluDisk (circle,0,0.4,5000,1);
gluDeleteQuadric(circle);
البته میشه روشو با یک مربع سفید پوشش داد تا نصفش معلوم باشه ولی یک راه دیگه البته چند راه داره
mandbigS
شنبه 14 فروردین 1389, 14:50 عصر
همینو اگه بخوایم با یک مربع سفید بپوشونیم چه باید بکنبم ؟
amin1softco
شنبه 14 فروردین 1389, 16:29 عصر
از تابع زیر می شه استفاده کرد
glRectf ( x1 , y1 , x2 , y2 ) ;
mandbigS
شنبه 14 فروردین 1389, 18:14 عصر
#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;
}
http://www.novinupload.com/images/09475357279174566163.bmp
amin1softco
شنبه 14 فروردین 1389, 18:24 عصر
آخرش کار خودت رو کردی ها من منظورم این بود
http://www.novinupload.com/images/42228104504827399682.jpg
#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
شنبه 14 فروردین 1389, 18:36 عصر
آخرش کار خودت رو کردی ها من منظورم این بود ...
البته راههای مختلفی وجود داره ... :بامزه:
mandbigS
شنبه 14 فروردین 1389, 19:04 عصر
من اینو نوشتم می خوام بدونم اشکالش کجاست ... حدس میزنم تو خیلی حلقه میوفته اما نمی دونم چطور باید کنترل کرد ...
#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
شنبه 14 فروردین 1389, 19:27 عصر
اینم کامل اصلاح شد
http://www.novinupload.com/images/87226832178104817836.jpg
#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
شنبه 14 فروردین 1389, 20:20 عصر
#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
شنبه 14 فروردین 1389, 20:24 عصر
خوب حالا یک کاری کن که به ترتیب از اول صفحه هر خونه یک بار با یک رنگ دیگه چشمک بزنه و بره خونه بعدی؟
بعدشم مهره اسب رو طراحی کن؟
zuck_619
یک شنبه 15 فروردین 1389, 21:57 عصر
نمیکشه چرا ؟؟؟
#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
یک شنبه 15 فروردین 1389, 23:06 عصر
یادت رفته ماتریس پروجکشن رو ست کنی به صورت نرمال بر حسب 1 هست
glMatrixMode(GL_PROJECTION); //projection parameters
gluOrtho2D(0.0,75.0,0.0,75.0); //sets up WC extent
نتیجه کارت اینه
http://up.iranblog.com/Files/1bd67d6689d04dcab46e.jpg
حالا چطوری بعد بهش بدیم و سه بعدیش کنیم
mandbigS
دوشنبه 16 فروردین 1389, 10:04 صبح
یه سوال بعد دادن به اینه و یکی این که چطوری میشه توشو رنگ کرد ؟
amin1softco
دوشنبه 16 فروردین 1389, 11:23 صبح
برای اینکه داخلش رنگ بشه باید از
glBegin(GL_QUADS)
ya
glBegin(GL_POLYGON)
استفاده کنید برای بعد دادن خودتون روش فکر کنید و اون خط و نیم دایره رو هم در نظر بگیرید
pswin.pooya
دوشنبه 16 فروردین 1389, 14:53 عصر
میتونید به جای 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
دوشنبه 16 فروردین 1389, 15:27 عصر
آقا الان اسب رو داریم صفحه شطرنج رو هم دارم حالا چطوری می تونیم الگوریتم معروف اسب شطرنج رو پیاده کنیم که 64 خونه رو طی کنه بدون خانه های تکراری؟!!؟
mandbigS
دوشنبه 16 فروردین 1389, 21:28 عصر
میگم اول یه کار دیگه بکنیم ... اسب رو سه بعدی بکشیم ... بعدش ... به نظرم بیشتر رو موارد گرافیکی تاکید کنیم تا الگوریتمی ... البته این نظر منه ... ولی اگه موافق نبودین ادامه می دیم ...
amin1softco
دوشنبه 16 فروردین 1389, 22:26 عصر
اصولا برای ساخت مهره باید باید یک نرم افزار سه بعدی مثل مکس یک اسب بسازیم و خروجی ابجکت ازش بگیریم و با OpenGL لودش کنیم ولی به نظر من حالا بازی رو می نویسیم بعد دوباره گسترشش می دیم یعنی اول دو بعدی و بعدش سه بعدی البته یک کار دیگه هم می شه کرد البته اسب نمی شه اما خوب بدکی نیست میشه یک خط شبیه یک برش از سطح مهره اسب را برداشت و دور خودش دوران دادن ....
zuck_619
دوشنبه 16 فروردین 1389, 23:14 عصر
به نظر من یک طرح جدید باشه خیلی بهتره ... آدمو بیشتر جذب میکنه ، خلاقانه ترم هست
amin1softco
سه شنبه 17 فروردین 1389, 01:52 صبح
دوستان من این اسب شطرنج رو نوشتم ...
http://www.ecapic.ir/image/ECA-100406080951.jpg
#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
سه شنبه 17 فروردین 1389, 21:24 عصر
یه توضیحی در مورد ایت زیریا بده لطفا :
stdlib
ctime
srand
rand
amin1softco
سه شنبه 17 فروردین 1389, 22:32 عصر
stdlib برای تبدیل عدد به رشته ازش استفاده شده
ctime برای time(NULL)
srand برای تعیین هسته تابع راندوم
rand برای محاسبه اولین خانه تصادفی ازش استفاده شده
zuck_619
سه شنبه 17 فروردین 1389, 22:45 عصر
time(null) چه کارمیکنه ؟
sleep چیه قضیه اش ؟
amin1softco
سه شنبه 17 فروردین 1389, 23:08 عصر
time(null) چه کارمیکنه ؟
sleep چیه قضیه اش ؟
time(null) برای اینه که برنامه با اجرا های متفاوت خانه های متفاوتی رو انتخاب کنه و کلا اینا زیاد مهم نیست فقط یک خانه اولیه تصادفی ایجاد می کنند برای شروع حرکت اسب
sleep برای اینه ایجاد حالت نمایشه چون ممکنه تابع dis خیلی زود به زود فراخوانی بشه این کنترل می کنه که در 7 دهم ثانیه تا اجرای بعدی صبر کنه.....
zuck_619
چهارشنبه 18 فروردین 1389, 21:36 عصر
من تو نوشتن ساعت یه مشکل دارم :
چطوری میشه ساعت سیستم رو خوند و ازش استفاده کرد ؟
فکر کنم با getitmer یا gettimeofday ولی نمیدونم چطوری میشه ازش استفاده کرد ؟
amin1softco
چهارشنبه 18 فروردین 1389, 22:46 عصر
من تو نوشتن ساعت یه مشکل دارم :
چطوری میشه ساعت سیستم رو خوند و ازش استفاده کرد ؟
فکر کنم با 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
چهارشنبه 18 فروردین 1389, 22:58 عصر
یکم توضیح در مورد این کد میدی ؟ struct و tzset
amin1softco
چهارشنبه 18 فروردین 1389, 23:22 عصر
یکم توضیح در مورد این کد میدی ؟ 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
چهارشنبه 18 فروردین 1389, 23:47 عصر
چطوری میشه چند شکل خاص رو تو صفحه دوران داد ؟
در حالت عادی نقطه 0 و 0 مرکز تصویر . اما وقتی از gluOrtho2D استفاده میشه جاش عوض میشه ! اینو توضیح بدین لطفا
amin1softco
چهارشنبه 18 فروردین 1389, 23:59 عصر
چطوری میشه چند شکل خاص رو تو صفحه دوران داد ؟روش معمولش استفاده از glPushMatrix و glPopMatrix است. ولی می شه ماتریس های اصلی رو خودمون دستکاری کنیم و باز نویسی کنیم.
در حالت عادی نقطه 0 و 0 مرکز تصویر . اما وقتی از
gluOrtho2D
استفاده میشه جاش عوض میشه ! اینو توضیح بدین لطفا خوب شما وقتی می خواهید این تابع را تنظیم کنی جوری تنظیمش کن که مرکز صفحه باشه. یا با glTranslate مختصات رو جابه جا کن.
درثانی منم مثل خودتونم تازه کارم بهتره تو خود انجمن سوالاتون رو مطرح کنید تا دوستان ماهر تر جواب بدند.
zuck_619
پنج شنبه 19 فروردین 1389, 00:43 صبح
آقا ما اینو نوشتیم . ولی اجرا نشد . کلی مشکل داشت . دوستان کمک کنن لطفا :
#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
پنج شنبه 19 فروردین 1389, 01:21 صبح
چطوری میشه چند شکل خاص رو تو صفحه دوران داد ؟میتونی از 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
پنج شنبه 19 فروردین 1389, 11:50 صبح
والا به نظر من خیلی کار رو سخت کردی ... اصلاح شده کدت این می شه :
http://up.iranblog.com/Files/968e9687378746e19c01.jpg
#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
پنج شنبه 19 فروردین 1389, 14:37 عصر
اینم برای دوستان علاقمند به OpenGL :
یک سری مثال از کار با این بسته گرافیکی از سایت رسمی OpenGL
http://www.opengl.org/resources/code/samples/glut_examples/examples/examples.html
____________
دوستانی که دنبال یک رفرنس برای کار با توابع Opengl هستند از کتاب blueBook (http://www.4shared.com/get/258661190/b0b96833/OpenGL-The_Reference_Manual-Bl.html) استفاده کنند.
zuck_619
یک شنبه 29 فروردین 1389, 22:28 عصر
سلام دوستان . بعد کلی غیبت اومدم باز . من توضیحاتی در مورد بافر ها و ماتریسها تو openGL میخوام . برای کار با دستورات دچار مشکل شدم . ...
amin1softco
یک شنبه 29 فروردین 1389, 23:19 عصر
والا قضیه این ماتریس ها هم واسه خودش کلاسی داره ولی در کل یک سرچی بزنی خیلی کتاب خفن پیدا می کنی به نظر من همیشه استفاده از کد های آماه بهتره ....
sanaz88
چهارشنبه 01 اردیبهشت 1389, 12:01 عصر
فصل سوم
این فصل بیشتر در مورد الگوریتم های ترسیم در سیستم راستر مثل 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();
لیست کامل:
http://up.iranblog.com/2161/1269733512.jpg
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 (mk:@MSITStore:D:%5CUsers%5Camin%5CDocuments%5CDow nloads%5Cogl%20man.CHM::/glArrayElement.3G.html), glMaterial, and glEdgeFlag (mk:@MSITStore:D:%5CUsers%5Camin%5CDocuments%5CDow nloads%5Cogl%20man.CHM::/glEdgeFlag.3G.html). Also, it is acceptable to use glCallList (mk:@MSITStore:D:%5CUsers%5Camin%5CDocuments%5CDow nloads%5Cogl%20man.CHM::/glCallList.3G.html) or glCallLists (mk:@MSITStore:D:%5CUsers%5Camin%5CDocuments%5CDow nloads%5Cogl%20man.CHM::/glCallLists.3G.html) 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).
ممنونم از راهنماييتون. امكانش هست تابعهاي بيشتري در اختيارمون قرار بدين
sanaz88
چهارشنبه 01 اردیبهشت 1389, 12:03 عصر
امكانش هست تابعهاي بيشتري ازopengl كه بصورت gl_ هستند دراختيارمون قرار بدين
pswin.pooya
چهارشنبه 01 اردیبهشت 1389, 20:07 عصر
میتونید به کتاب قرمز و یا super bible مراجعه کنید:
http://opengl.persiangig.com/page.html
amin1softco
پنج شنبه 02 اردیبهشت 1389, 20:24 عصر
امكانش هست تابعهاي بيشتري ازopengl كه بصورت gl_ هستند دراختيارمون قرار بدين
ببنید من خودم برای کار خودم یک فایلی درست کردم با فرمت chm که تمام توابع رو توضیح داده اینجا گذاشتم ازش استفاده کنید فقط نکته ایی که وجو داره وقتی می خواهین سرچ کنید یک * قبل و بعد عبارتتون اضافه کنید از اینجا (http://up.iranblog.com/Files/de1c345dab80471ba94e.zip)دریافتش کنید. در ضمن به نظر من رد بوک که آقا پویا گفتندم خیلی چیزه خوبیه یا بلو بوک
aminsharifloo
پنج شنبه 06 خرداد 1389, 23:58 عصر
با سلام
من می خوام گیم snake رو با opengl بنویسم میشه کمکم کنید
sajjadgameactor
دوشنبه 10 خرداد 1389, 09:31 صبح
چرا تاپیک خوابیده بی صبرانه منتظر ادامه هستیم
alip30c
پنج شنبه 13 خرداد 1389, 03:57 صبح
لطفا ادامه بدین
خیلی مفید بود
pswin.pooya
جمعه 21 خرداد 1389, 17:40 عصر
:افسرده::افسرده::افسرده:از دوستان کسی نیست که جوابم رو بده ؟ :افسرده::افسرده::افسرده:
این رسما درخواست پروژه آخر ترم هستش! که مخالف قوانین سایت هست.
mchatavi
جمعه 21 خرداد 1389, 23:03 عصر
این رسما درخواست پروژه آخر ترم هستش! که مخالف قوانین سایت هست.
دوست عزیز من اصلأ دانشجو نیستم که برای پروژه ی پایان ترم بخوامش .
OpenGL رو بصورت آزاد مطالعه می کنم اما برنامه نویسیم خوب نیست .
به این مسال برخورد کردم توی یکی از جزواتی که از اینترنت گرفته بودم.
خوشم اومد و اینجا مطرح کردم.
از دوستایی که بلدن می خوام که حلش کنن.
ممنون
armintirand
شنبه 22 خرداد 1389, 18:42 عصر
فکر نکنم کسی کمکت کنه چون open gl یکی از مباحثی هست که کسانی که چیزی بلدند با سختی خیلی زیاد تونستن اونو یاد بگیرن وبه خود اونا هم کسی کمک نکرده البته اگه اشتباه نکنم این مطلب تو مقدمه یک مقاله که از سایت gamedev دان کرده بودم بیان شده بود.البته قصد توهین به کسی نداشتم ولی منظورم اینه که خودت باید سرهم کنی. برای یادگیری هم اگه تو ویندوز میخوای از اون استفاده کنی بهتره قبل از یادگیری opengl کمی API های ویندوز رو یاد بگیری. برای لینوکس هم به نظرم باید دوستان با سوادتر از من بگن.
tavakolian
شنبه 22 خرداد 1389, 20:12 عصر
سلام و خسته نباشد
آقا ممنون آموزش عالی بود
باز از این کار ها انجام بده
pswin.pooya
پنج شنبه 27 خرداد 1389, 00:40 صبح
آقایون
حاضرم برای حلش پول هم بدم
جواب این سوال برام خیلی مهم شده
بلد نیستم اما واسه رو کم کنیه که مهم شده برام
لطفأ کمکم کنید
مشکلت کجای برنامه هستش؟ توی رسم دایره و یا چرخوندن اون؟
mchatavi
جمعه 28 خرداد 1389, 11:05 صبح
من یه تازه کارم
رسم دایره رو بلدم.یعنی یاد گرفتم
اما اینکه دایره رو بوسیله یه خطی نامرئی که زاویه بدم به یه گوشه ی صفحه مانیتور برخورد کنه و طبق همون زاویه قرینه بشه و به سمت دیگه ی صفحه ی مانیتور برخورد کنه و ...
این یکم برام تفهیمش سخته.
حالا اگه حل کردنش براتون امکان نداره یه منبعی کتابی چیزی معرفی کنید که بتونم این سوال و مسأله های مشابه رو پیدا و حلش کنم
منتظر حل سوال و یا راهنمایی شما هستم
با سپاس
pswin.pooya
جمعه 28 خرداد 1389, 12:32 عصر
جابجا کردن اشکال رو توی فضا با تبدلات اتجام میدن. تبدیلات از س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
جمعه 28 خرداد 1389, 16:45 عصر
آقای pswin.pooya با تشکر از مطالب خوبی که ارسال کردی
واقعأ ممنونم
چیزای خوبی بود که به دردم می خوره
اما یه سوال دیگه دارم
توی مثالی که زده بودم قراره دایره ای که رسم کردم طبق یه زاویه ای که با یکی از محورها داده میشه ، حرکت کنه و وقتی به اتنهای صفحه رسید دوباره بر اساس همون زاویه اما مخالف محور قبلی به حرکتش ادامه بده . طوری که دایره به 4طرف مانیتور برخورد کنه و بطور متوالی
یه راهنمایی در این مورد انجام بدین ممنون میشم
pswin.pooya
جمعه 28 خرداد 1389, 18:06 عصر
توی مثالی که زده بودم قراره دایره ای که رسم کردم طبق یه زاویه ای که با یکی از محورها داده میشه ، حرکت کنه و وقتی به اتنهای صفحه رسید دوباره بر اساس همون زاویه اما مخالف محور قبلی به حرکتش ادامه بده . طوری که دایره به 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!
چهارشنبه 02 تیر 1389, 00:05 صبح
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
جمعه 18 تیر 1389, 00:28 صبح
salam man 1 barnamey paint neveshtam, kheili kam dar rabeteh ba ijad menue v nahvehy karbordesh midonam age mishe komakam konid
amin1softco
جمعه 18 تیر 1389, 17:40 عصر
به نظر من بهتر قید توابع glut را بزنید برای منو اما اگر هنوز اسرار دارید می تونید یک تصویر از کلید ها درست کنید و بعد وقتی مختصات ماوس روی اونجا ها قرار گرفت یک تابع را اجرا کنید یعنی منو و اینها رو خودتون بسازید glx وجود داره
http://sourceforge.net/projects/glui/
http://www.lighthouse3d.com/opengl/glut/index.php?9
mchatavi
شنبه 19 تیر 1389, 11:27 صبح
سلام
آقای amin1softco
میشه ID تونو داشته باشم؟
برای یه کاری
ممنون
amin1softco
شنبه 19 تیر 1389, 17:41 عصر
منبع (http://www.geeks3d.com/20090105/tutorial-how-to-load-and-display-an-image-with-devil-and-opengl/) : همین جا بگم اگه انگلیسیتون خوبه منبع رو بخونید چون من ترجمم یکمی مورد داره:چشمک:
آموزش لود کردن و نمایش یک فایل تصویری بوسیله کتابخانه دویل و اپن جی ال(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)
فایل ضمیمه (http://www.geeks3d.com/wp-content/plugins/download-monitor/download.php?id=27) حجمش بالا بود.
pswin.pooya
شنبه 19 تیر 1389, 18:02 عصر
سلام
قبل از اینکه بخواین از 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
یک شنبه 20 تیر 1389, 12:50 عصر
آموزش به کار گیری openGL در زبان ها برنامه نویسی دیگر
متناسب با هر زبان یک فرم ورک تدارک دیده شده پس بهتره بعد از انتخاب زبانی که می خواهید باهاش برنامه بنویسید یک سری به اینجا بزنید :
http://www.opengl.org/resources/bindings/
خوب من فکر می کردم به راحتی می تونم از اپن جی ال در سی شارپ استفاده کنم ولی بعد از یکمی سرچ و اینها به این نتیجه رسیدم که برای بکار بردن اپن جی ال در سی شارپ چند راه وجود داره :
1-فرم ورک csgl (http://csgl.sourceforge.net/) هست که قدیمی شده و tao (http://homepage.ntlworld.com/herring1/taoopengl.html) که توسعه یافته همونه
2- فرم ورک OpenTK (http://opentk.sourceforge.net/) بهترین راه به نظر من و آپدیت آپدیت.
3- SharpGL (http://www.codeproject.com/KB/openGL/sharpgl.aspx)
دوستان اگه راه بهتری سراغ دارند دریغ نکنند.:بوس:
در آخر یک نتیجه دیگه هم بدست آوردم و اون این بود که آدم بره سراغ دایرکس که تو سی شارپ خیلی راحت (البته نه در اون حد) برنامه بنویسه البته سه بعدی.
ehp_kz6597
شنبه 08 آبان 1389, 16:29 عصر
سلام
برای نصب 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 رو میذارم اینجا یه نگاه کنین ببینین این چی میگه
دیگه دارم قاطی میکنمhttp://www.ashiyane.org/forums/images/smilies/22.gifhttp://www.ashiyane.org/forums/images/smilies/69.gifhttp://www.ashiyane.org/forums/images/smilies/52.gif :عصبانی++:
لطفا کمک کنین
با تشکر
pswin.pooya
یک شنبه 09 آبان 1389, 01:42 صبح
مشکل از opengl.h هستش. نه glut.h اول از همه opengl.h رو حذف کنید و سعی کنید برنامه رو کامپایل کنید. اگر نشدش کتابخونه glew.h رو بگیرید و از هدر اون به جای opengl.h استفاده کنید. من خودم هم بارها به این مشکل داخل ویژوال استادیو برخوردم و راه حل بهتری پیدا نکردم.
ehp_kz6597
یک شنبه 09 آبان 1389, 06:53 صبح
از کمکتون خیلی ممنون
1- سرچ کردم opengl.h اصلا ندارم
2- glew-1.5.6-win32 رو گرفتم و نصب کردم خدا رو شکر فعلا داره کار میکنه
واقعا ازتون سپاسگذارم :تشویق: http://l.yimg.com/us.yimg.com/i/mesg/emoticons7/77.gif
:گریه: بودم :لبخند: شدم
باز هم ممنون
smh1988
دوشنبه 10 آبان 1389, 03:03 صبح
یه سوال دارم .
http://www.barnamenevis.org/forum/showthread.php?t=245673
amin1softco
پنج شنبه 13 آبان 1389, 19:00 عصر
دوستاني كه گرافيك دارند و دنبال سورس كد هاي تايپ شده كتاب مي گردند به اين لينك ها مراجعه كنند:
این صفحه را مرور کنید
http://www.cs.ukzn.ac.za/~satya/COMP712/ (http://www.google.com/url?sa=D&q=http://www.cs.ukzn.ac.za/%7Esatya/COMP712/&usg=AFQjCNHViZfYSX4dsummFHxq3s58LvR-VA)
اینم لینک اصلی کد های کتاب
http://www.cs.ukzn.ac.za/~satya/COMP712/PROGS/Code.zip (http://www.google.com/url?sa=D&q=http://www.cs.ukzn.ac.za/%7Esatya/COMP712/PROGS/Code.zip&usg=AFQjCNHPICVwvlqbkqkU2K6rL709UKxGlw)
اینم لینک اون جزوه انگلیسیه که می تونید باهاش غلطای کتابو پیدا و تصحیح
کنید
http://www.cs.ukzn.ac.za/~satya/COMP712/GRAPHICS_notes.pdf (http://www.google.com/url?sa=D&q=http://www.cs.ukzn.ac.za/%7Esatya/COMP712/GRAPHICS_notes.pdf&usg=AFQjCNFIJwhd7_RshvmmG6doWQoBrCqkIg)
اسلاید هاي كتاب رو اینجا دیدم جالب بود
http://www.cs.virginia.edu/~gfx/Courses/2004/Intro.Spring.04/ (http://www.google.com/url?sa=D&q=http://www.cs.virginia.edu/%7Egfx/Courses/2004/Intro.Spring.04/&usg=AFQjCNGXHiH_ahMKhj1WFpJGLElqjtppkA)
...........................
آموزش خارج از كتاب
http://nehe.gamedev.net/ (http://www.google.com/url?sa=D&q=http://nehe.gamedev.net/&usg=AFQjCNFakL_I0dvufKQ8Ad-z19x3ZYpdNQ)
sarakh
دوشنبه 29 آذر 1389, 21:41 عصر
سلام
برای کار با opengl در visual c++6 و visual c++2008 آیا کدهاشون با هم فرق داره؟؟؟؟؟؟
آیا می تونم از کدهای visual c++6 در visual c++2008 استفاده کنم؟؟؟؟؟؟؟؟؟؟؟
sarakh
دوشنبه 29 آذر 1389, 21:43 عصر
می تونم توی این تاپیک در مورد گرافیک در visual c++6 سوال بپرسم.
منتظر جواب هستم.
ممنون
pswin.pooya
دوشنبه 29 آذر 1389, 21:49 عصر
برای کار با opengl در visual c++6 و visual c++2008 آیا کدهاشون با هم فرق داره؟؟؟؟؟؟
نه
آیا می تونم از کدهای visual c++6 در visual c++2008 استفاده کنم؟؟؟؟؟؟؟؟؟؟؟
بستگی داره اما توی 90 درصد موارد میشه
می تونم توی این تاپیک در مورد گرافیک در visual c++6 سوال بپرسم.
تاپیک جدا باز کنی بهتره
oghyanoos
چهارشنبه 15 دی 1389, 19:32 عصر
سلام میشه لطف کنید برنامه کامل ساعت درopen gl برام بذارین.
amin1softco
دوشنبه 20 دی 1389, 13:06 عصر
مگه برنامش کامل نیست؟؟؟؟؟؟؟؟ تازه این پست خلاف قوانین سایته .......
sadaf.2006
شنبه 23 مهر 1390, 19:08 عصر
سلام
مرسی از سایتتون
میشه بگین چطور میشه تو opengl یه دایره یا هر شکل با زدن یه کلید پرش کنه؟لطفا راهنماییم کنین
amin1softco
دوشنبه 25 مهر 1390, 15:13 عصر
خیلی ممنون از سایتشون :لبخند: مارو قاطی 4 تایی ها نکنید....
ببنید این opengl و برنامه نویسی کلاً هنوز اونقدر هوشمند نیست یعنی برای انجام هر کاری باید قبلش اونو تشریح کنید مثلاً وقتی می خواهید یک توپ پرتاب بشه باید حرکت پرتابی رو پیاده سازی کنید یعنی بوسیله فرمول های فیزیک مسیرش رو معین کنید و اونو در مسیرش حرکت بدین و یک کتابخانه است به اسم physics که بیشتر این چیزا رو شبیه سازی می کنه مثلاً برای جاذبه زمین (http://www.codecolony.de/Tokamak/)
بقیشو بزرگان باید جواب بدند
farzad_fb25
جمعه 14 بهمن 1390, 09:30 صبح
سلام
من به نحوه چرخش اشیا در OpenGL نیاز دارم
در برنامه من یک شی وجود داره که باید حرکن کنه
یعنی وقتی کلید جلو رو زدم بره جلو
وقتی کلید عقب رو زدم عقب بره
و وقتی کلید راست رو زدم باید به چپ بچرخه ( نه اینکه بره چپ بلکه مثل وقتی که موس رو به چپ می برم و صفحه می چرخه وقتی هم که دکمه چپ رو میزنم باید به جپ بچرخه)
و برای دکمه راست هم همینطور
ممنون میشم راهنمایی بفرمایید
amin1softco
جمعه 14 بهمن 1390, 09:53 صبح
این همه ما این دایره ها رو دور هم چرخونیدم والا ... دو راه داره یا خودت بری ماتریس ها رو تغییر بدی بصورت دستی یا باید از توابع :
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
یک شنبه 21 اسفند 1390, 11:54 صبح
سلام
برای نصب 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 رو میذارم اینجا یه نگاه کنین ببینین این چی میگه
دیگه دارم قاطی میکنمhttp://www.ashiyane.org/forums/images/smilies/22.gifhttp://www.ashiyane.org/forums/images/smilies/69.gifhttp://www.ashiyane.org/forums/images/smilies/52.gif :عصبانی++:
لطفا کمک کنین
با تشکر
منم همین بدبختی رو دارم
این دفعه میزنم خودمو میکشم:عصبانی++:
همون اول مربع قرمز برای تست برنامه ارور میده
همه ی مراحلشم رفتم
قبلا اون اجرا میشد،بقیه اجرا نمیشد
حالا خدا رو شکر هیچکدوم اجرا نمیشه:عصبانی:
چندین بارglut.dll وglut.lib دانلود کردم
دیگه خسته شدممممممممممممم:گریه:
a-t-e-f-e-h
یک شنبه 21 اسفند 1390, 12:34 عصر
خوب خدا رو شکر مصیبت قبلی حل شد:اشتباه::لبخند:
میشه بگید dev رو دیگه از کجا باید پیدا کنیم؟؟؟اصلا نمیدونم چی هست:ناراحت:
آخه pdf اموزشی که ازhttp://www.parsbook.org/?s=%D9%85%D9%82%D8%AF%D9%85%D9%87+%D8%A7%DB%8C+%D8 %A8%D8%B1+open+gl گرفتم اسمی از dev نیاورده و اصلا ازش استفاده نکرده
amin1softco
یک شنبه 21 اسفند 1390, 16:49 عصر
ببنید dev یک محیط برای برنامه نویسیه که با دلفی نوشته شده و با استفاده از کامپایلر gcc/g++ کار کامپایل برنامه رو انجام میده و کلاً حجمش کمه و سریع راه اندازی می شه و قابل استفاده است و فکر کنم جزو نرم افزار های آزاد محسوب بشه . آموزش پست اول فقط می خواست یک راهنما باشه برای کامپایلر هایه متنوع تر و نکته جالب این dev اینه که بیشتر library هایی که ما نیاز داریم را در اختیار ما قرار میده و شما حتی بدون طی این مراحل می تونید همون پکیج را در اینترنت سرچ کنید و دانلود کنید بدون کپی هیچ فایلی البته روش پست اول را الان فقط می تونید با استفاده از v-p-n انجام بدید.
mahsa_shk
دوشنبه 21 فروردین 1391, 17:22 عصر
چرا در برنامه استفاده از کلید های صفحه کلید، کلید F2 کار نمی کند؟ یعنی با فشردنش عمل مربوطه انجام نمی شه ولی F1, F3,F4 و بقیه مشکلی ندارند؟
amin1softco
دوشنبه 21 فروردین 1391, 22:00 عصر
مطمئنید؟! ما که 3 تا بیشتر تعریف نکردیم f1 , f2 ,f3 منم تست کردم کار می کرد . فک کنم کلید هایه تابعی لپتاپتون برایه کار دیگه ایی تنظیم شده یا یک برنامه روش عمل می کنه
soroushp
دوشنبه 21 فروردین 1391, 22:28 عصر
چرا در برنامه استفاده از کلید های صفحه کلید، کلید F2 کار نمی کند؟ یعنی با فشردنش عمل مربوطه انجام نمی شه ولی F1, F3,F4 و بقیه مشکلی ندارند؟
اگر سوالتون رو درست متوجه شده باشم جواب شما اینه که باید از تابع glutSpecialFunc برای استفاده از کلید های خاص مثله arrow key,f1,2,3,... استفاده کنید
saturn2200
دوشنبه 08 خرداد 1391, 00:01 صبح
سلام
دوستان من میخوام یه برنامهمه بنویسم که با اسفاده از الگوریتم 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
دوشنبه 08 خرداد 1391, 00:06 صبح
کد 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
دوشنبه 08 خرداد 1391, 09:08 صبح
خوب شما کد الگوریتم رو دارید فقط باید ازش استفاده کنید یعنی مختصات نقاط سازنده حرف اول و دوم رو پیدا کنید و با مختصات زیر جایگزین کنید
// 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
سه شنبه 09 خرداد 1391, 23:05 عصر
ببخشید میشه بصورت برنامه از اول با #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;
}
من میخوام با استفاده از این اکد یه حرف الفبا رو به یه حرف دیگه تبدیل کنم.
مثلا تبدیل توی عکس پایین رو ببینید
http://up.vatandownload.com/images/sesmzrlipegiz6w13xo5.png
کل مطلبی که من در این رابطه دارم از کتاب گرافیک کامپیوتری هست
متن این قسمت رو هم واستون میذارم
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.
http://up.vatandownload.com/images/xoqmk9z0703dwboyud5.png
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
چهارشنبه 10 خرداد 1391, 08:48 صبح
من منظور شما رو در همون پست اول درست فهمیده بودم شما همون کار رو انجام بدید که گفتم نتیجه می گیرید
برای اجرا هم می تونید از این برنامه و آموزشش استفاده کنید http://s3.picofile.com/file/7394041826/dev.zip.html
majnoon110
پنج شنبه 11 خرداد 1391, 11:22 صبح
سلام دوستان من در کار کردن با اوپن جی ال تازه کارم
الان میخوام برای پایان ترم یک پروژه درست کنم اما به مشکل برخوردم
کسی میتونه یک تابع بنویسه که مختصات x,y دو نقطه رو از کاربر دریافت کنه و براش یک خط رسم کنه
نحوه ی فراخوانی توابعی که ورودی دارن در داخل تابع main چطور هست؟
ممنون میشم اگر کمک کنید
saturn2200
جمعه 12 خرداد 1391, 10:12 صبح
من منظور شما رو در همون پست اول درست فهمیده بودم شما همون کار رو انجام بدید که گفتم نتیجه می گیرید
برای اجرا هم می تونید از این برنامه و آموزشش استفاده کنید http://s3.picofile.com/file/7394041826/dev.zip.html
سلام بازم شرمنده
من اجرای برنامه رو بلدم.
این tween که منم میخوام یه مقدار فرق داره باید بصورت انیمیشن این کار انجام بشه
http://up.vatandownload.com/images/4vdf7ejttbo67rj0gvpz.png
این نقاطی که روی عکس بالاست بصورت انیمیشن جابجا بشن روی نقاط متناظر .اینطوری حرف "ر" به حرف "ا" تبدیل میشه و یه فرم انیمیشن قشنگی هم داره.
این الگوریتم مثلا اگه دیده باشید توی فیلمها استفاده میشه .مثلا تصویر سفید برفی از زیبایی به زشتی و یا برعکس تبدیل میشه.
اگه بتونیم واسه یه polygon ساده اینکارو انجام بدیم واسه تصویرای پیچیده هم امکانش هست.
واسه راهنمایی تا همینجا هم خیلییی ممنون
خیلی کمکم کردین.
amin1softco
جمعه 12 خرداد 1391, 12:16 عصر
خوب عزیزم اینکه خیلی واضحه باید یک خطش رو حذف کنی این قطعه کد رو جایگزین کن جواب می گیری
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
شنبه 13 خرداد 1391, 13:01 عصر
سلام دوستان من در کار کردن با اوپن جی ال تازه کارم
الان میخوام برای پایان ترم یک پروژه درست کنم اما به مشکل برخوردم
کسی میتونه یک تابع بنویسه که مختصات x,y دو نقطه رو از کاربر دریافت کنه و براش یک خط رسم کنه
نحوه ی فراخوانی توابعی که ورودی دارن در داخل تابع main چطور هست؟
ممنون میشم اگر کمک کنید
ببنید شما باید بین glbegin دو تا نقطه مشخص کنید و پارامتر هاش رو از کاربر در یافت کنید.
http://barnamenevis.org/showthread.php?324969-%DB%8C%DA%A9-%D9%85%D8%B4%DA%A9%D9%84-%D8%AF%D8%B1-%D8%B1%D8%B3%D9%85-%DA%86%D9%86%D8%AF-%D8%B6%D9%84%D8%B9%DB%8C-%D8%A8%D9%87-%D9%88%D8%B3%DB%8C%D9%84%D9%87-open-gl&p=1429482#post1429482
saturn2200
شنبه 13 خرداد 1391, 23:36 عصر
خوب عزیزم اینکه خیلی واضحه باید یک خطش رو حذف کنی این قطعه کد رو جایگزین کن جواب می گیری
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 را هر چی بیشتر کنی انیمیشنش لطیف تره :دی
خیلییییی مرسی واقعا ایول داره:لبخند::تشویق:
من اینو نشون یه بچه ها امیر کبیر دادم نتونست درست کنه!!!:خجالت:
دیگه روم نمیشه سوال بپرسم
اما دلم نمیاد از اطلاعات شما استفاده نکنم.
اگه بخوام viewport ها رو حذف کنم امکانش هست؟چطوری میتونم اینکارو انجام بدم:لبخند:
و یه سوال مهمتر اگه بخوام شکل رو عوض کنم باید چیکار کنم؟
مثلا یه نیم دایره به یه مستطیل تبدیل بشه .باید چیکار کنم
amin1softco
یک شنبه 14 خرداد 1391, 13:10 عصر
خوب شاید دقت نکرده نیست ما صنعتی شریف تشریف داریم دقتمون بیشتره زبانم بدتر :دییییی
بله اگر حذف بشه glut از مقادیر پیش فرض خودش که سایز پنجره است استفاده می کنه توضیحاتش رو می تونید از این جا (http://www.talisman.org/opengl-1.1/Reference/glViewport.html) بخونید.
ببنید این شکل ها بسیله قطعه ی زیر ترسیم می شه :
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
دوشنبه 15 خرداد 1391, 17:38 عصر
نه دوست عزیز پروژه دانشجویی انجام نمی دیم ولی بازم باری اینکه متوجه بشی چی به چیه به این قطعه کد را جایگزین کن و نتیجه رو مشاهده کن
// 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
سه شنبه 16 خرداد 1391, 01:06 صبح
سلام
مطالب open gl که گذاشتی مفیده فایده واقع شد
یه سوال:
من تمام مراحل اجرای برنامه opengl با C++ , C# رو به طور دقیق انجام دادم و وقتی که یه کد نمونه (تست شده در جای دیگه) رو هم اجرا می کنم هیچ خطایی نمیده ولی توی فرم هم چیزی نمیکشه به نظر شما مشکل کار من کجاست؟:گریه:
amin1softco
سه شنبه 16 خرداد 1391, 09:42 صبح
سلام ما در مورد اجرای برنامه در سی شارپ فقط چندتا فرم ورک برای پیاده سازی معرفی کردیم نه بیشتر !! ولی ممکنه مشکل شما اینجا باشه که در سیستم های 64 بیتی باید glut32.dll را در پوشه syswow64 کپی کنید.
به هر حال این فیلم آموزشی می تونه کمکتون کنه http://s3.picofile.com/file/7400251284/glut.zip.html
poniosa
سه شنبه 16 خرداد 1391, 13:58 عصر
با سپاس و تشکر فراوان از amin عزیز :قلب:
من تمام پیش نیاز ها رو انجام دادم و موقع اجرا هیچ خطایی نمیگیرم ، پنجره کنسول C باز میشه و بعدش هم پنجره open gl ولی داخل open gl شکل رو ترسیم نمیکنه و این فرم کلا به صورت ترنسپارنت هست و وقتی که سایزشو تغییر میدم مشکی میشه، از صفحه نمایشم عکس گرفتم تا بیشتر در جریان قرار بگیری، خودم احتمال میدم تنظیمات گرافیکی سیستمم باشه و تمام سوراخ سمبه های win7 رو کاوش کردم ولی بی فایده، اگه راه حلی به نظرت میرسه بگی ممنون میشم.
بازم ممنون به خاطر فیلمی که گذاشتی و اینکه همیشه در دسترس و به فکر هستی ...:بوس:
http://up98.org/upload/server1/02/j/bttzjewj8u439mvwc5b.png
amin1softco
سه شنبه 16 خرداد 1391, 15:00 عصر
این مشکل دلایل متعددی داره که خیلی هاش مربوط به تنظیمات اشتباه توابع اولیه و گاهی هم مربوط تداخل گرافیک gdi ویندوز با wgl می شه که فکر نکنم ربطی به ما داشته باشه در آخر می رسیم به یک باگ glut (http://dev.haiku-os.org/ticket/3191) که اگر این باگ باشه با یک بافر مشکل دارید و باید با دو بافر تست کنید ببنید کد زیر درست کار میده یا نه :
//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
سه شنبه 16 خرداد 1391, 15:10 عصر
نه متاسفانه :ناراحت:
saturn2200
سه شنبه 16 خرداد 1391, 17:32 عصر
نه دوست عزیز پروژه دانشجویی انجام نمی دیم ولی بازم باری اینکه متوجه بشی چی به چیه به این قطعه کد را جایگزین کن و نتیجه رو مشاهده کن
// 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;
}
منم کاملاً تفریحی اپن جی ال کار می کنم ...
آقا ایول واقعا نمیدونم چطوری تشکر کنم
خوب اینطوری بهتر شد تازه یاد گرفتم چطوری شکل رو عوض کنم
مرسیییییییییییییییییییییی ییییییییییییییییییییییییی ییییییییییییییییییییییییی ییییییییییییییییییی:لبخند:
داشتم از زندگی نا امید میشدما
هنوزم آدمای با گذشت و باحالی تو این دنیا هست:تشویق:
من اولش فکر میکردم که مثلا A[0].set(0.2, 0.2) یه خط رسم میکنه بین دو تا نقطه به این مختصات حالا فهمیدم که نه آقا اینا همش نقطه بوده که در آخر به هم وصل شده حالا دیگه هر شکلی رو میتونم بکشم :لبخند:
amin1softco
سه شنبه 16 خرداد 1391, 19:46 عصر
نه متاسفانه :ناراحت:
می تونی نتیجه دستور زیر را بهم بگی :
#include <iostream>
using namespace std;
.
.
.
cout << "OpenGL Version : " << glGetString(GL_VERSION) << endl;
glutMainLoop(); //display all and wait
.
.
اگر ورژن openGL کارت گرافیکت بیشتر از 3 باشه فکر نکنم راهی داشته باشه باید باید یکجور دیگه کد بنویسیم :دیییییی
poniosa
چهارشنبه 17 خرداد 1391, 16:57 عصر
سلام من پنجره open gl رو به حالت FULLScreen بردم و مشکلم حل شد، فقط تو این حالت شکل رو ترسیم میکنه
بازم تشکر:قلب:
pswin.pooya
شنبه 20 خرداد 1391, 14:25 عصر
@poniosa (http://barnamenevis.org/member.php?256760-poniosa):
اگر از glut استفاده ميكني تابع idle رو ثبت نكردي يا اينكه بافر رو تعويض نمي كني.
اگر ورژن openGL کارت گرافیکت بیشتر از 3 باشه فکر نکنم راهی داشته باشه باید باید یکجور دیگه کد بنویسیم :دیییییی
چه ربطي داره. مال من 4.2 هست راحت دارم با ورژن 1.2 كار ميكنم.
amin1softco
شنبه 20 خرداد 1391, 14:36 عصر
@poniosa (http://barnamenevis.org/member.php?256760-poniosa):
اگر از glut استفاده ميكني تابع idle رو ثبت نكردي يا اينكه بافر رو تعويض نمي كني.
چه ربطي داره. مال من 4.2 هست راحت دارم با ورژن 1.2 كار ميكنم.
والا من بیشتر از 3 رو خودم تست نکردم فقط روی حساب پستی که خود شما (http://barnamenevis.org/showthread.php?209876-OpenGL-3.3-%D9%88-OpenGL-4.0) یکبار زده بودی این رو گفتم!!!
OpenGL و آینده:
به طور کل میشه گفتش که ما در آینده شاهد حذف بسیاری از دستورهای پیشین OpenGL خواهیم بود. (یا حداقل از کار افتادن اونها) که توی OpenGL 3.x به راحتی مشاهده میشد که یکی از پرکاربردترین دستورها یعنی glBegin کار نمی کرد. (مگر با فراهم کردن شرایط خاص و غیر استاندارد) اما حالا OpenGL تمام تمرکز خودش رو گذاشته روی دستورها و الحاقی هایی که باعث ارتباط بهتر و کاملتر با قسمت های قابل برنامه ریزی gpu هستش.
به هر حال آخرش بر می گرده به همون باگی که لینکش رو دادم. موفق باشید!!!
pswin.pooya
شنبه 20 خرداد 1391, 19:20 عصر
خب درسته كه دستورها حذف شدن. اما هنوز از دستورهاي پيشين پشتيباني ميشن. توي ويرايشهاي جديد OpenGL شما مي تونيد ويرايشي رو كه مي خواهيد استفاده كنيد رو مشخص كنيد. اينكار با مشخص كردن عدد minor و major ويرايش در هنگام ساخته شدن محتوا انجام مي گيره و يه كار اتوماتيك نيست كه خودش اون رو انجام بده. حالا بسته به ويرايشي كه انتخاب مي كنيد قابليتهاي قبلي رو حذف و قابليتهاي جديد رو اضافه ميكنه.
حتي تعداد از دستورهاي حذف شده هنوز هم توي ويرايشهاي جديد قابل استفاده هستند. اما استفاده از اونها پيشنهاد نميشه و پشتيباني از اونها به شدت به ويرايش درايور بستگي داره. مثلا VBO توي داريورهاي قديمي OpenGL 3 جواب ميداد اما توي ويرايشهاي جديد ديگه امكانش نيست. بهترين راه چك كردن پرفرمانس برنامه اينجور موارد استفاده از برنامه gDEBUGer هست. كه تمام اين موارد رو بهتون گزارش ميكه. خود من هم از طريق اين برنامه متوجه قضيه VBO شدم.
مورد ديگه در مورد GLUT هست كه glut به كمك glew (يا لود كردن دستي الحاقيها) ماكزيمم تا OpenGL 2.1 ساپورت ميده و براي وياريشهاي حداقل بالاتر بايد بريد سراغ SDL و يا اينكه از API خود سيستم عامل كمك بگيريد.
من هنوز هم حرفهاي خودم رو تاييد ميكنم. اين اتفاق مرتبا داره مي افته. در حقيقت ويرايشهاي جديد OpenGL سراغ نو آوري و ارتباط موثر هستند نه يك راه ساده براي كار. API به شدت و به سرعت داره تغيير ميكنه. در حقيقت الان هر دو تا API دايركت و OpenGL مثل هم عمل مي كنند و شما خيلي راحت امكان سوئيچ بين اونها رو داريد (برخلاف گذشته) و موارد خيلي كمي رو پيدا مي كنيد كه در اونها اختلاف داشته باشند. بيشترين دليل اين قضيه هم اينه كه OpenGL توي سالهاي اخير با معرفي سيستم ها و پلتفرمهاي جديد بشدت تجاري شده و برخلاف گذشته، حالا مثل دايركت بيشتر توجهش بجاي اينكه روي مسائل بنيادي گرافيك باشه روي نيازهاي بازار است.
amin1softco
شنبه 20 خرداد 1391, 21:41 عصر
دمت گرم پسر خیلی باحالی :چشمک:
ولی خوب قسمت اولش رو نمی دونستم ...
soroushp
پنج شنبه 25 خرداد 1391, 22:06 عصر
در مورد 3 تابع زیر توضیحی مختصر می خواستم یک مقدار روی تعریفه خودم شک دارم :
glEnable(GL_DEPTH_TEST)
glFrontFace(GL_CCW)
glEnable(GL_CULL_FACE)
تعریف خودم به ترتیب : اجسام پشت شی مورد نظر دیده نشود - برای تشخیص رو و پشت بودن جسم کاربرد دارد - تو و داخل جسم را حساب نکن
سوال دوم اینه که صدا گذاری در opengl با استفاده از fmod هست ؛ غیر از fmod هم داریم اسمش چی بود ؟
pswin.pooya
جمعه 26 خرداد 1391, 09:00 صبح
اجسام پشت شی مورد نظر دیده نشود
کاملا اشتباه. درسته یکی از کاربردهای بافر عمق (یعنی بیشترین کاربردش اینه) اما کلا برداشتت اشتباه هست. پیشنهاد میکنم یه کتاب OpenGL بخون
برای تشخیص رو و پشت بودن جسم کاربرد دارد - تو و داخل جسم را حساب نکن
باز هم کاملا اشتباه هست. هر رویه با توجه به ساعتگرد بودن و مخالف ساعتگرد بودن اون و با توجه به اینکه ضخامت صفر هم داره ، باز هم دارای یک رویه جلو و عقب هست. از اونجا که توی بیشتر موارد رویه های پشتی دیده نمیشن. میشه به OpenGL دستور داد که از پردازش بیخوده اونها جلوگیری کنه که کارها سریعتر پیش بره.
کلا OpenGL و گرافیک کامپیوتری سختر از این هست که بخوای با استباط خودت (برخلاق زبونهای C# و Visual basic و...) جلو بری. قبل از هر چیز باید و اما باید یه دید دقیق ریاضی و تئوری نسبت به این مسائل داشته باشی. وگرنه همش درجا میزنی. کتابهای زیادی برای معرفی دقیق OpenGL وگرافیک کامپیوتری وجود داره و من بشدت پیشنهاد می کنم اونها رو مطالعه کنی. یکسری از اونها رو میتونی توی لینک زیر پیدا کنی:
http://opengl.persiangig.com/page.html
سوال دوم اینه که صدا گذاری در opengl با استفاده از fmod هست
این موضوع اصلا ربطی به OpenGL نداره.
؛ غیر از fmod هم داریم اسمش چی بود
API سیستم عامل
Bass
ّOpenAL
...
mehdi64org
جمعه 02 تیر 1391, 16:05 عصر
سلام
دوستان من تازه کارم. اگه سوالام ابتدایی بود ببخشید:بامزه:
من بالاخره موفق شدم یک مکعب سه بعدی درست کنم
بعد با روتیت هم تونستم بچرخونمش. حالا هم یک منبع نور بهش اضافه کردم ولی باهاش یه چندتایی مشکل دارم!
اول اینکه وقتی روتیت میکنم به نظرم خود شکل نمیچرخه بلکه دوربین داره میچرخه ، چون مثلا شدت نور اگر گوشه بالا سمت راست زیاده ، وقتی که میچرخه شدت نور مثلا میاد پایین سمت راست شکل ،درحالی که منبع باید همون بالا باشه و شکل بچرخه!
بعد هم اینکه موقع طراحی ، من هر ضلعی از مکعبو یه رنگی دادم مثلا یک ضلعش آبی یک ضلعش قرمز و... اما وقتی که منبع نور میزارم باید براش سه تا رنگ تعریف کنم در حالی که من میخوام همون رنگ خودش باشه و نور روش قرار بگیره مثل اون مثالی که توی صفحه اول یا دوم زدین که یک توپ فوتبال روش نور افتاده
امیدوارم خوب توضیح داده باشم
با تشکر فراوان:لبخندساده:
pswin.pooya
جمعه 02 تیر 1391, 18:41 عصر
اول اینکه وقتی روتیت میکنم به نظرم خود شکل نمیچرخه بلکه دوربین داره میچرخه ، چون مثلا شدت نور اگر گوشه بالا سمت راست زیاده ، وقتی که میچرخه شدت نور مثلا میاد پایین سمت راست شکل ،درحالی که منبع باید همون بالا باشه و شکل بچرخه!توي OpenGL با glRotate منابع نور هم ميچرخن. بايد از push و pop استفاده كني و هر شكل رو به صورت مجزا بچرخوني.
بعد هم اینکه موقع طراحی ، من هر ضلعی از مکعبو یه رنگی دادم مثلا یک ضلعش آبی یک ضلعش قرمز و... اما وقتی که منبع نور میزارم باید براش سه تا رنگ تعریف کنم در حالی که من میخوام همون رنگ خودش باشه و نور روش قرار بگیره مثل اون مثالی که توی صفحه اول یا دوم زدین که یک توپ فوتبال روش نور افتادهخب. اين سه تا رنگ (diffuse و ambient و specular) رو بترتيب به سفيد و خاكستري تيره و سفيد ست كن. و يا مي توني براي اينكه اجسام از رنگ خودشون به عنوان متريال استفاده كنند از دستور زير توي مقدار دهي اوليه برنامت استفاده كني:
glEnable(GL_COLOR_MATERIAL);
لينك زير يه مقاله خيلي خوب در مورد نورها در OpenGL هست كه ميتونه بهت كمك زيادي بكنه:
http://www.falloutsoftware.com/tutorials/gl/gl8.htm
majnoon110
شنبه 03 تیر 1391, 21:42 عصر
سلام بزرگواران
راستش من یک مشکلی پیدا کرده بودم
من با گرافیک دو بعدی اوپن جی ال کار میکنم و برای یک پروژه نیاز به کارهای ابتدایی با اون دارم
من میخوام یک صفحه ی متحرک ایجاد کنم.. هرکدوم از اشکال این صفحه که مثلا شامل یک ماشین و خونه و ... میشه رو توسط یک سری توابع پیاده سازی کردم
مثلا یک مستطیل رسم میکنم، بعد مربع روش میکشم، و بعد دایره روی این مربع رسم میکنم و به همین ترتیب تا کل صفحه رو رسم کنم
اما متاسفانه در همون قدم های اول چند تابع اول رو معمولا خوب انجام میده... اما وقتی به توابعی که در خط های بعد فراخوانی کردم میرسه، بعضیاشون رو رسم نمیکنه
گاهی هم مثلا نصفه نیمه رسمش میکنه...
مشکلم چطور حل میشه؟
این رو هم بگم من برای کشیدن دایره و مربع از نقطه استفاده میکنم ( و از توابع خود اوپن جی ال استفاده نمیکنم، مثلا برای مربع توپر از تعدادی خط موازی استفاده میکنم)
آیا نیاز هست که کد هایی که نوشتم رو اینجا بیارم؟
خواهش میکنم راهنمایی کنید خیلی کارم گیره... من خیلی چیزا در این تاپیک یاد گرفتم
ازتون ممنونم
pswin.pooya
یک شنبه 04 تیر 1391, 00:44 صبح
گاهی هم مثلا نصفه نیمه رسمش میکنه...
به احتما 90% مربوط به بافر عمق هست. با غير فعال كردنش ميتوني كارهاتو انجام بدي.
این رو هم بگم من برای کشیدن دایره و مربع از نقطه استفاده میکنم ( و از توابع خود اوپن جی ال استفاده نمیکنم، مثلا برای مربع توپر از تعدادی خط موازی استفاده میکنم)
پيشنهاد ميكنم از معادل OpenGL استفاده كن. چون سرعتش خيلي خيلي بيشتر هست. تقريبا كندترين چيزي كه OpenGL ميكشه خط هست و تندترين اونها مثلث
majnoon110
یک شنبه 04 تیر 1391, 12:19 عصر
راستش این پروژه رو برای خودم میخواستم انجام بدم
درس اوپن جی ال هست
منظورت از بافر عمق چیه؟ چطوری باید غیر فعالش کنم؟ مشکلی پیش نمیاد؟
ممنونم بابت راهنماییت دوست بزرگوار
pswin.pooya
یک شنبه 04 تیر 1391, 16:07 عصر
منظورت از بافر عمق چیه؟ چطوری باید غیر فعالش کنم؟ مشکلی پیش نمیاد؟
توي بافر فريم چندتا بافر وجود داره كه از جمله اونها ميشه به بافر رنگ ( هموني كه رنگ فرگمنتها رو نگه ميداره). بافر عمق، استنثيل ، تجمع و ... اشاره كرد.
بافر عمق داخل صحنه هاي سه بعدي مقدار عمق هر فرگمنت رو نگه ميداره و بطور پيش فرض بررسي ميكنه كه ببينه فرگمنت جديد كه قرار روي فرگمنت قبلي بشينه داراي عمق كمتري نسبت به اون هست يا نه. اگر فرگمنت جديد عمق كمتر داشته باشه (به دوربين نزديكتر باشه) جايگزين فرگمنت قبلي ميشه و در غير اينصورت ناديده گرفته ميشه. اين بافر براي صحنه هاي سه بعدي ضروري هست اما دليل خاصي براي وجود اون داخل صحنه هاي دو بعدي نيست.
براي اينكه بافر عمق رو كنار بذاري بايد زمان ايجاد محتوا (پنجره) توي گزينه هاي مرتبط با اون حذف يا صفر كني. مثلا اگر از GLUT داري استفاده ميكني. زمان ست كردن مد نمايش بايد گزينه GLUT_DEPTH رو ننويسي:
glutInitDisplayMode( GLUT_RGBA | GLUT_DOUBLE );
و از دستور زير هم استفاده كني (بعد از ايجاد محتوا):
glDisable(GL_DEPTH_TEST_)
دستور glDisable براي غير فعال كردن ويژگي هاي OpenGL استفاده ميشه. كه توي اين مورد به OpenGL ميگيم تست عمق رو غير فعال كنه. اين شكلي اگر بافر عمقي هم وجود داشته باشي ديگه هيچ تستي براي عمق فرگمنت انجام نمي گيره.
يه كتاب فارسي توي لينك زير وجود داره كه مي تونيد از اون براي يادگيري استفاده كنيد. خيلي از مشكلاتون اين شكلي سريعتر حل ميشه:
opengl.persiangig.com
majnoon110
یک شنبه 04 تیر 1391, 23:24 عصر
دستت درد نکنه آقا
ظاهرا مشکل حل شد، واقعا ممنونم
اما یک مشکل دیگه هم دارم که امیدوارم بازم کمکم کنید
کتاب فارسی رو هم خوندم سریع اما راه حلی برای این نگفته بود مثل اینکه
من میخوام از تابعی مثل ( delay ) در visual ++c استفاده کنم
اما همچین تابعی نداره... برای ایجاد انیمیشن میخوام. و تاخیر در اجرای کد ها
تابعی برای این کار هست؟
ممنون میشم اگر کمکم کنید چون واقعا خیلی کارم گیر هست... در ضمن از push و pop ماتریکس هم نمیخوام استفاده کنم و با حلقه ی for میخوام انیمیشن بسازم
خیلی خیلی متشکرم، مخصوصا از توضیحات کامل و راهنمایی خوبتون دوست عزیز
pswin.pooya
دوشنبه 05 تیر 1391, 01:41 صبح
اما همچین تابعی نداره... برای ایجاد انیمیشن میخوام. و تاخیر در اجرای کد ها
تابعی برای این کار هست؟
براي تاخير ميتوني از دستور sleep استفاده كني كه به عنوان پارامتر ميلي ثانيه ميگيره. اما اين روش خوبي نيست. در حقيقت انيميشن. مخصوصا انيميشن روان داخل بازيها نسبتا پيچيده هست. براي اينكه يه انيميشن درست داشته باشي بايد ميزان fps رو محاسبه كني و طبق اون تصميم گيري كني. كه اين مساله خارج از حوصله اين تاپيك هست
majnoon110
سه شنبه 06 تیر 1391, 20:44 عصر
سلام مجدد
با تشکر مجدد از شما دوست بزرگوار بابت راهنمایی هاتون
آقا من با فایل سرآیند windows.h مشکل پیدا کردم
از c++ 2008 استفاده میکنم، چند تا فایل سرآیند رو داخل پروژه فرخوانی کردم مثل math,stsafx,conio.stdio,gl\glut
اما وقتی windows.h رو اضافه میکنم و برنامه رو اجرا میکنم، پنجره باز میشه اما داخلش هیچی نمایش داده نمیشه و نشانگر ماوس به شکل ساعت شنی در میاد!
یعنی داره سعی میکنه برنامه رو اجرا کنه اما نمیتونه!
واقعا از شما با مدیریت خوبتون تشکر میکنم.. همچنین از دوستان دیگه
pswin.pooya
چهارشنبه 07 تیر 1391, 00:10 صبح
با تشکر مجدد از شما دوست بزرگوار بابت راهنمایی هاتون
خيلي ممنون
از C++ 2008 استفاده میکنم، چند تا فایل سرآیند رو داخل پروژه فرخوانی کردم مثل math,stsafx,conio.stdio,gl\glut
اما وقتی windows.h رو اضافه میکنم و برنامه رو اجرا میکنم، پنجره باز میشه اما داخلش هیچی نمایش داده نمیشه و نشانگر ماوس به شکل ساعت شنی در میاد!
واقعا نمي دونم مشكل از چي ميتونه باشه. اما بعيد مي دونم از سرآيند windows.h باشه. شايد ميزان sleep رو زياد داديد.
saturn2200
جمعه 09 تیر 1391, 10:37 صبح
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
جمعه 09 تیر 1391, 14:46 عصر
دوست عزیز
این خط رو پاک کن //gluOrtho2D(0.0,200.0,0.0,150.0);
قبلاً توضیحاتش رو پویا داده من دیگه شرح نمی دم.
saturn2200
دوشنبه 12 تیر 1391, 11:55 صبح
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
دوشنبه 12 تیر 1391, 11:56 صبح
دوست عزیز
این خط رو پاک کن //gluOrtho2D(0.0,200.0,0.0,150.0);
قبلاً توضیحاتش رو پویا داده من دیگه شرح نمی دم.
mersiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii iiiii hal shod:قلب:
saturn2200
دوشنبه 12 تیر 1391, 15:58 عصر
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
دوشنبه 12 تیر 1391, 17:07 عصر
عزیزم تو می دونی چقدر پیامبران و اندیشمندان به اهمیت تفکر تأکید کردند چرا گوش نمی دی آخه :دییییی
ما گفتیم نقطه یابیه نه دیگه همش ببنید شما وقتی تابع رو فراخوانی می کنید با این پارامتر ها 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
دوشنبه 12 تیر 1391, 20:30 عصر
توي 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
دوشنبه 12 تیر 1391, 23:00 عصر
عزیزم تو می دونی چقدر پیامبران و اندیشمندان به اهمیت تفکر تأکید کردند چرا گوش نمی دی آخه :دییییی
ما گفتیم نقطه یابیه نه دیگه همش ببنید شما وقتی تابع رو فراخوانی می کنید با این پارامتر ها 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 ) ;
.
.
.
ahaaaaaaaaaan bale alan fahmidam mersiiiiiiiiiiiiiii
:لبخند:baba ma taze karim
gharare badan ha mohanes beshim
mbgame
شنبه 24 تیر 1391, 17:13 عصر
سلام خیلی ممنون از آموزش های که گزاشتید!
من 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
یک شنبه 01 مرداد 1391, 13:52 عصر
دوست داشتم دوستان حرفه ایی تر جواب بدند ولی خوب سرشون شلوغه.
سلام خیلی ممنون از آموزش های که گزاشتید!
خواهش می کنم گرچه این آموزش ها به نظر خودم خیلی جالب نیست یعنی نه از روی کتاب پیش رفتیم نه روی هدفی که داشتیم ولی خوب دیگه اگر خدا خواست دوباره آموزش ها رو اصلاح می کنیم.
من 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 برای همین سرعتش کمتره اطلاعات بیشتر (http://blogs.technet.com/b/askperf/archive/2009/10/05/windows-7-windows-server-2008-r2-console-host.aspx) که راه حلی به نظر من نمی رسه جز اینکه برید سراغ windows api یا چیزای دیگه مثل SDL
2.من پروژه ای نوشته بودم که از موس در محیط 3d استفاده میکرد و اجسام در عمق رو تشخیص میداد و از انجا که این کد را در console نوشته بودم و بعد از کامپایل افت سرعت شدیدی رو داشت ,مجبور شدم کد رو روی windows api کامپایل کنم و بعد از کامپایل تابع gluprespective دچار خطای 10% ی میشه ,یعنی اگر قبلا روی console میتونستم با موس یک sphere رو select کنم , حالا روی windows api باید تقریبا روی یک فاصله 10% نسبت به spere کلیک کنم تا sphere انتخاب بشه! مشکل کجاست؟
با تشکر!
به نظرم یک جایی در هنگام مشخص کردن ثابت های اولیه پروژه یک خطایی کردید که اینجا این اتفاق افتاده و گرنه نباید تفاوتی داشته باشه .
بازم خواهش می کنم!
pswin.pooya
سه شنبه 03 مرداد 1391, 13:06 عصر
سلام
1. شما از چه روشی برای picking استفاده می کنید؟
2. من توی ویندوز 7 مشکل شما رو ندارم. احتمالا شما درایور رو نصب نکرده باشید و یا اینکه درایور اشتباه نصب کرده باشید.
mjshaman
یک شنبه 21 آبان 1391, 00:40 صبح
سلام به عزیزان
من تا حالا با opengl کار نکردم و الآنم از اینجا چیزای خیلی زیادی یاد گرفتم که از همه ی عزیزان خیلی خیلی تشکر میکنم
من میخوام یه فوتبال سه بعدی طراحی کنم( مثل فوتبال بازی میکرو) اگه دوستان خاطرشون باشه و بازی کرده باشن
و برای شروع فقط میخوام بازیکنای توش حرکت کنن
الآن زمینو دروازه هارو کشیدم (خود opengl تابعی برای لود کردن عکس jpg نداره؟)، میخوام یه آبجکت برای بازیکناش بسازم که بعدا فقط یه مکان و رنگ بهش بدم تا بره سر جاش اما برای خود آدمکه مشکل دارم که چطوری سه بعدی بسازمش
ممنون میشم اگه راهنماییم کنید
mjshaman
یک شنبه 21 آبان 1391, 00:45 صبح
راستی من سی شارپم خیلی بهتر از سی پلاسمه اما چندجا خوندم که opengl روی سی شارپ جواب نمیده و دردسره و بهتره که با سی پلاس گرافیک بنویسم
میشه راهنماییم کنید چطور توی سی شارپ 3 بعدی بنویسم؟ من قبلا کمی با توابع گرافیک سی شارپ کار کردم اما واردش نشدم میشه توی این موردم راهنماییم کنید
بازم مرسی
shecarchi
یک شنبه 21 آبان 1391, 01:10 صبح
از کتابخانه openTK استفاده کن
amin1softco
دوشنبه 22 آبان 1391, 07:21 صبح
سلام به عزیزان
من تا حالا با opengl کار نکردم و الآنم از اینجا چیزای خیلی زیادی یاد گرفتم که از همه ی عزیزان خیلی خیلی تشکر میکنم
من میخوام یه فوتبال سه بعدی طراحی کنم( مثل فوتبال بازی میکرو) اگه دوستان خاطرشون باشه و بازی کرده باشن
و برای شروع فقط میخوام بازیکنای توش حرکت کنن
الآن زمینو دروازه هارو کشیدم (خود opengl تابعی برای لود کردن عکس jpg نداره؟)، میخوام یه آبجکت برای بازیکناش بسازم که بعدا فقط یه مکان و رنگ بهش بدم تا بره سر جاش اما برای خود آدمکه مشکل دارم که چطوری سه بعدی بسازمش
ممنون میشم اگه راهنماییم کنید
بهتره این کتاب (http://opengl.persiangig.com/Ebook/draftGRAPHIC.pdf)را یک نگاهی بندازید .
خداییش فوتبال میکرو سه بعدی بود ؟ جل الخالق
برای لود کردن عکس چیز خاصی نداره باید بوسیله devil هر نوع عکس را باز کنید و بوسیله gldrawpixel اونو ترسیم کنید یا با استفاده از texture برای یک سطح
برای بقیش من خودم از لیست پیوندی استفاده می کنم که مثلاً چیا باید رسم بشه و داخل یک حلقه این لیست را ترسیم می کنم بازکن را باید مثل یک درخت در نظر بگیری فک کنما....
راستی من سی شارپم خیلی بهتر از سی پلاسمه اما چندجا خوندم که opengl روی سی شارپ جواب نمیده و دردسره و بهتره که با سی پلاس گرافیک بنویسم
میشه راهنماییم کنید چطور توی سی شارپ 3 بعدی بنویسم؟ من قبلا کمی با توابع گرافیک سی شارپ کار کردم اما واردش نشدم میشه توی این موردم راهنماییم کنید
بازم مرسی
والا بهترین چیزی که من دیدم که با ویندوز سون مشکلی نداشت همون OpenTK بود ولی بهتره با همون سی کنار بیایید یکمی کار با رشته ها سخت تره و خیلی امکانات رو ندراه :دییی
lpeiatb
دوشنبه 22 آبان 1391, 21:17 عصر
دوستان ببخشید، یه سوال کاملا ابتدایی دارم
تازه شروع کارمون با 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
دوشنبه 22 آبان 1391, 22:45 عصر
جفتشون رو باید توی یک تابع بنویسی. نه جدا جدا. یا میتونی توی دو تا تابع جدا بنویسی و هر دو تابع رو از تابع اصلی صدا بزنی.
lpeiatb
سه شنبه 23 آبان 1391, 10:32 صبح
تشکر، روش دومی که گفتید رو نفهمیدم چون یخورده برنامه نویسی گرافیک عجیب غریبه، ولی هر دو رو توی یه تابع نوشتم جواب داد، خیلی ممنون
حقیقتش استاد یه خورده گنگ درس میده و کلا توضیحات کاملی نمیده که مثلا فلان کد مربوط به این میشه...
دوتا سوال دیگه هم دارم که مربوط به کنجکاوی خودم میشن، اگه جواب بدید ممنون میشم
میخواستم بدونم هر کدوم از این کد ها مربوط به چی میشن:
این کد رو گفتن پارامتر دوم و چهارمش تراکم صفحه رو مشخص میکنه، ولی نگفتن پارامتر اول و سوم چه کاری میکنن
(gluOrtho2D(0,300,0,300
Single تو این کد مربوط به چی میشه؟ وقتی گذاشتم رو double صفحه خروجی چیزی رو نشون نداد، توخالی شد
(glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB
ممنون که تحمل کردید
پیروز و پاینده باشید
amin1softco
چهارشنبه 24 آبان 1391, 08:29 صبح
بهتره اینا رو در گوگل سرچ کنی یا openGL manual را ببنی ..
gluOrtho2D
(ازچپ,
از راست ,
از بالا,
از پایین);
ترتیب پارامتر ها برای مشخص کردن محور مختصات !!!
GLUT_SINGLE : یعنی از یک بافر استفاده کند .
GLUT_DOUBLE : دوتا بافر یعنی قبل از رسم در صفحه اصلی در یک بافر دیگه ترسیم انجام بشود. برای حالت انیمیشن که پشت سر هم ترسیم انجام می شه بدرد می خوره .
برای اینه روی دابل کار کنه باید تنظیم کنی که هرچقدر بیکاره بیاد و این تابع نمایش را صدا بزنه ...
mjshaman
پنج شنبه 25 آبان 1391, 23:36 عصر
سلام مجدد
من مکعب چرخانو نوشتم و حالا میخوام کاری کنم که با زدن دکمه p توقف کنه و با دوباره زدنش ادامه بده، عزیزان نظری دارید که چطوری این کارو بکنم؟
با راهنمایی دوستمون بلدم که با زدن یک کلید تابعی رو فراخوانی کنم اما نمیدونم چطور مکعب رو نگه دارم و از همون موقعیت ادامه ش بدم، یه راهی که به ذهنم رسیده اینه که مختصاتشو(زاویه شو) ذخیره کنمو بعدا از همون زاویه چرخش رو ادامه بدم اما دنبال روش مهندسیشم چون این روش برای برنامه های با اشیاء زیاد به درد نمیخوره و دردسره
مثلا برای استاپ همون بازی فوتبال
مرسی از همفکری و راهنماییتون
amin1softco
جمعه 26 آبان 1391, 13:25 عصر
اولین روش یک متغیر بولی تعریف می کنیم به عنوان پرچم و متغیر سراسری است و مقدار پیش فرض بهش 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)
{
// 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
جمعه 26 آبان 1391, 20:05 عصر
شرمنده ی مرام و معرفتت، عزیز من هر چی فکر کردم و با کد بالا ور رفتم نتوستم بفهمم چطوری باهاش برنامه مو pause کنم و بعدش resume کنمش، میشه همین برنامه بالا رو براش این خصوصیتها رو بذاری
پیشاپیش مرسی
amin1softco
جمعه 26 آبان 1391, 21:40 عصر
بفرما عزیز دلم با فشردن کلید 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)
{
// 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
جمعه 26 آبان 1391, 23:06 عصر
دستت درد نکنه مهندس ان شاالله که خیر از جوونیت ببینی
mjshaman
دوشنبه 29 آبان 1391, 01:00 صبح
دوستان عزیز شرمنده که هی میام سوال میپرسم
من یه انیمیشن با opengl نوشتم که30 تا شکلک طبق یه آرایه ی a[30][900][2]i توی پنجره نمایش داده بشن، 30 تعداد شکلکها، 900 تعداد حالتها و 2 مختصات هر حالت به x,y هستن
طبق قواعد انیمیشن این 900 خط باید در 30 و نهایتا 40 ثانیه نمایش داده بشن اما خیلی بیشتر طول میکشه یعنی حدود 6دیقه و نیم و بدتر از اون اینه که در پایان حدود ده تا از شکلک هام پاک میشن و در حال اجرا هم به صورت چشمک زن ظاهر میشن، pls help me
من برای اجراش یه حلقه 900 تایی گذاشتم و توش اول صفحه رو پاک کردم و بعدش یه حلقه 30 تایی گذاشتم و توش شکلک رو با مختصات آرایه رسم کردم
amin1softco
دوشنبه 29 آبان 1391, 08:34 صبح
شما باید تعداد فرم هایی که در ثانیه رندر می شوند (FPS) را حساب کنید و طبق اون از روی بعضی از فرم ها بپرید برای اون مشکل پرش بهتر از
glutInitDisplayMode(GLUT_DOUBLE |GLUT_RGB);
استفاده کنید.
mjshaman
دوشنبه 29 آبان 1391, 23:46 عصر
عزیزجان، میشه یکم بیشتر توضیح بدی که باید دقیقا چطوری و کجا و با چه مقادیر ورودی با glutInitDisplayMode(GLUT_DOUBLE |GLUT_RGB); کار کنیم
مرسی
amin1softco
سه شنبه 30 آبان 1391, 08:15 صبح
عزیزجان، میشه یکم بیشتر توضیح بدی که باید دقیقا چطوری و کجا و با چه مقادیر ورودی با glutInitDisplayMode(GLUT_DOUBLE |GLUT_RGB); کار کنیم
مرسی
ببین بهتره یک کتابی چیزی مطالعه کنید . :متفکر:
اونم که جزو مقادیر اولیه است که حکم سازنده را برای GLUT داره و فقط همین خط را باید جایگزین کنید کار خاصی نباید انجام بدید برای اینکه متوجه صحبت هام بشید یک سورس خیلی ساده را ضمیمه کردم که fps را هم محاسبه می کنه و با یک عکس یک انیمیشن خیلی ساده ایجاد کرده امید وارم مفید واقع بشه...
mjshaman
سه شنبه 30 آبان 1391, 23:55 عصر
خیلی برام جالبه فیالی که گذاشتی
من سه چهارتا کتاب pdf خوندم که یکیشم اینجا معرفی شده بود اما همشون درباره ترسیم بودن و چیز خاصی درباره ی انمیشن و این مباحث نگفته بودن
میشه یه کتاب بهم معرفی کنید، البته زیادم عمیق و تخصصی نباشه که گیج کننده باشه
میدونم پرروییه اما اگه بشه کد رو (توابعی که استفاده کردی) و مخصوصا بخش محاصبه fps رو یه توضیحی بدی خیلی خوب میشه، مرسی
amin1softco
چهارشنبه 01 آذر 1391, 08:04 صبح
کتاب روی نت سرچ کن
Addison.Wesley.OpenGL.SuperBible.5th.Edition.Jul.2 010.rar
برای آموزشم سرچ کنید بهتر به جواب می رسید مثلاً (http://www.lighthouse3d.com/tutorials/glut-tutorial/animation/)
توضیح :
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
پنج شنبه 02 آذر 1391, 18:29 عصر
سلام
خسته نباشید مطالب مفیدی قرار دادین بسیاز تشکر
سوال: چگونه تو opengl وقتی شکلی رسم میکنیم با تغییر سایز صفحه این شکل ما هم تغییر سایز پیدا کنه به نسبت صفحه اصلی؟اگه میشه یه شبه کد بزارین
سوال بعدی:اینکه ما وقتی رو این شکل کلیک میکنیم یه کاری انجام میشه ولی وقتی صفحه را تغییر سایز دادیمش این محدوده انتخاب موس عوض میشه و روش دیگه کلیک نمیششه بلکه جایی دیگه کلیک میکنم میشه یعنی من محدوده انتخابه موسو ثابت تعریف کردم چطور پویاش کنم؟
pswin.pooya
پنج شنبه 02 آذر 1391, 18:44 عصر
سوال: چگونه تو 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/picking/index.php?openglway2
http://content.gpwiki.org/index.php/OpenGL:Tutorials:Picking
البته روشهای پیچیده تر و بهتری وجود دارن که سرعت بیشتری رو هم دارن. مثلا توی ویرایشهای OpenGL 2.0 به بعد بعضی ها از FBO استفاده می کنن و یا معمولا نرم افزاری حرفه ای از Ray picking استفاده می کنن:
http://schabby.de/picking-opengl-ray-tracing/
amin1softco
جمعه 03 آذر 1391, 00:09 صبح
در ادامه صحبت های دوست خوبم پویا باید عرض کنم وقتی شما پنجره را تغییر سایز میدید یک تابعی در 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
شنبه 04 آذر 1391, 02:59 صبح
سلام
یه سوال دیگه:
چطور میشه تو opengl یک شی و درگ کرد؟
pswin.pooya
شنبه 04 آذر 1391, 20:12 عصر
سلام
اگر منظورتون از درگ کردن یک شی خارجی باشه باید از API سیستم عامل استفاده کنید. لازمه بگم پنجره های GLUT انعطاف زیادی ندارن و فقط برای مبتدی ها مناسب هستند پیشنهاد میشه برای کار با OpenGL از API سیستم عامل یا حداقل SDL استفاده کنید.
اما اگر منظورتون درگ کردن داخل خود برنامه باشه که باید این روند رو با ماوس کنترل کنید. اصولا باید یک شی رو pick( انتخاب کنبد) و مکان رو به جایی که ماوس هست انتقال بدید و لحظه ای که ماوس رها شد از انتقال شی جلوگیری کنید.
mjshaman
شنبه 11 آذر 1391, 22:54 عصر
با سلام خدمت دوستان
من یه برنامه که تقریبا بیشتر انیمیشنه نوشتم( البته به کمک این بخش و کمک دوستان) که دوبعدیه
حالا میخوام سه بعدیشو بنویسم، میشه راهنمایی و کمکم کنید
برای سه بعدی کردن باید برنامه رو از اول بنویسم یا با یه سری تغییرات میشه سه بعدیش کرد؟
انیمیشنم چندتا آدمک هستن که روی زمین جرکت میکنن
آیا حرکت دوربین دور اشیا با سه بعدی فرق میکنه؟
amin1softco
یک شنبه 12 آذر 1391, 08:11 صبح
openGL خودش فرمت خاصی مثل دایرکس که .x هست نداره و باید از فرمت هایی مثل .obj استفاده کنید.
مراحل کار :
1- وارد یک نرم افزار سه بعدی ساز مثل 3Dmax یا maya یا blender یا ... شده بازیکن مورد نظر خودتون را طراحی می کنید .
2- بعد از طراحی باید با فرمت .obj یا هر فرمتی که توانایی لود کردنش را در openGL دارید ذخیره می کنید . برای مثال یک فایل obj به صورت متنی حاوی یک ماتریس 4 ستونه است که خانه اول برای ذخیره نوع و سه تای بعدی مختصاته فک کنم
3- فایل ذخیره شده را با کدی که نوشتید لود کنید .
به همین راحتی و خوشمزگی کارکتر شما در محیط gl لود خواهد شد برای مثال این کد (http://nccastaff.bournemouth.ac.uk/jmacey/RobTheBloke/www/source/ObjLoader.zip) را ببنید . با فشردن کلید L فایل لود می شه.
http://www.gamedev.net/topic/312335-obj-model-loading-in-detail/
atefe70
جمعه 17 آذر 1391, 13:23 عصر
خسته نباشید
من طبق اموزش های داده شده . دقیقا مراحل نصب رو انجام دادم . و وقتی یکی از کد های داده شده رو براش مینویسم و روی دکمه اجرا میزنم این خطا رو به من میده
علتش چیه و چیکار باید بکنم ؟؟
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
جمعه 17 آذر 1391, 14:24 عصر
این برنامه اگه درایورا نصفه و نیمه نصب باشه جواب نمیده یعنی ؟
amin1softco
جمعه 17 آذر 1391, 16:11 عصر
فایل مورد نظر را درست کپی کردید GL/glut.hنوشته که اینو پیدا نکرد باید درست کپی کنید .
atefe70
جمعه 17 آذر 1391, 21:25 عصر
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
یک شنبه 19 آذر 1391, 19:06 عصر
آقا من تازه میخوام شروع کنم
همون اول اون Compiler need ها رو که کپی میکنم انگار درست نیست همون پیغام اولی رو میده بازم.
من اونا رو تو program files x86 ریختم چون ویژوالم اونجا بود مشکلش از این میتونه باشه؟؟؟
amin1softco
یک شنبه 19 آذر 1391, 19:53 عصر
شما بایدglut32.dll را در syswow64 کپی کنید. و x86 درسته...
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.