سلام
یه سوال دیگه:
چطور میشه تو opengl یک شی و درگ کرد؟
Printable View
سلام
یه سوال دیگه:
چطور میشه تو opengl یک شی و درگ کرد؟
سلام
اگر منظورتون از درگ کردن یک شی خارجی باشه باید از API سیستم عامل استفاده کنید. لازمه بگم پنجره های GLUT انعطاف زیادی ندارن و فقط برای مبتدی ها مناسب هستند پیشنهاد میشه برای کار با OpenGL از API سیستم عامل یا حداقل SDL استفاده کنید.
اما اگر منظورتون درگ کردن داخل خود برنامه باشه که باید این روند رو با ماوس کنترل کنید. اصولا باید یک شی رو pick( انتخاب کنبد) و مکان رو به جایی که ماوس هست انتقال بدید و لحظه ای که ماوس رها شد از انتقال شی جلوگیری کنید.
با سلام خدمت دوستان
من یه برنامه که تقریبا بیشتر انیمیشنه نوشتم( البته به کمک این بخش و کمک دوستان) که دوبعدیه
حالا میخوام سه بعدیشو بنویسم، میشه راهنمایی و کمکم کنید
برای سه بعدی کردن باید برنامه رو از اول بنویسم یا با یه سری تغییرات میشه سه بعدیش کرد؟
انیمیشنم چندتا آدمک هستن که روی زمین جرکت میکنن
آیا حرکت دوربین دور اشیا با سه بعدی فرق میکنه؟
openGL خودش فرمت خاصی مثل دایرکس که .x هست نداره و باید از فرمت هایی مثل .obj استفاده کنید.
مراحل کار :
1- وارد یک نرم افزار سه بعدی ساز مثل 3Dmax یا maya یا blender یا ... شده بازیکن مورد نظر خودتون را طراحی می کنید .
2- بعد از طراحی باید با فرمت .obj یا هر فرمتی که توانایی لود کردنش را در openGL دارید ذخیره می کنید . برای مثال یک فایل obj به صورت متنی حاوی یک ماتریس 4 ستونه است که خانه اول برای ذخیره نوع و سه تای بعدی مختصاته فک کنم
3- فایل ذخیره شده را با کدی که نوشتید لود کنید .
به همین راحتی و خوشمزگی کارکتر شما در محیط gl لود خواهد شد برای مثال این کد را ببنید . با فشردن کلید L فایل لود می شه.
http://www.gamedev.net/topic/312335-...ing-in-detail/
خسته نباشید
من طبق اموزش های داده شده . دقیقا مراحل نصب رو انجام دادم . و وقتی یکی از کد های داده شده رو براش مینویسم و روی دکمه اجرا میزنم این خطا رو به من میده
علتش چیه و چیکار باید بکنم ؟؟
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
ممنون اگه راهنمایی کنید .
سپاس
این برنامه اگه درایورا نصفه و نیمه نصب باشه جواب نمیده یعنی ؟
فایل مورد نظر را درست کپی کردید GL/glut.hنوشته که اینو پیدا نکرد باید درست کپی کنید .
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تا خطا چی میگه ؟ من دیگه واقعا گیچ شدم . کسی نمیاد به این مساله رسیدگی کنه :(
آقا من تازه میخوام شروع کنم
همون اول اون Compiler need ها رو که کپی میکنم انگار درست نیست همون پیغام اولی رو میده بازم.
من اونا رو تو program files x86 ریختم چون ویژوالم اونجا بود مشکلش از این میتونه باشه؟؟؟
شما بایدglut32.dll را در syswow64 کپی کنید. و x86 درسته...
هیچی اول 1 متر با مانیتور فاصله بگیر بعد محکم سرتو بکوب به مانیتور خلاص والا..........
خوب ببین این می تونه مشکل از ویژوالت یک برنامه ساده داس می تونی اجرا کنی ؟نقل قول:
کلا اصلا هیچ هدری رو نمیشناسه هیچ برنامه ای رو نمیتونه اجرا کنه ولی تو فایل lib همه ی هدرها هست نمیدونم چیکار کنم
سلام به همه دوستان
من دارم یه پروژه paint ساده می نویسم به رسم خط و مربع و دایره و ... مشکل خاصی ندارم مشکل اصلی من وقتی هستش که میخوام مختصاتی که باید اون شکل رسم بشه رو از موس بگیرم به مشکل بر میخورم من از دستور :
glutMouseFunc( mouse);
استفاده میکنم مشکل اینجاست که میخوام 2 تا مختصات از موس بخونه اما این مختصات هایی که میخونه با مختصات صفحه هماهنگی نداره اینم کده من هستش ممنون میشم که کمکم کنید :
#include<gl/glut.h>
#include<math.h>
int xx1=2,xx2=70,yy1=2,yy2=2;
int i=0;
double round(double x)
{
return floor(x + 0.5);
}
void DDALine( GLint X1, GLint Y1, GLint X2, GLint Y2)
{
GLint iX, iY, Temp;
float m, X, Y;
if( (X2-X1) > (Y2-Y1))
{
if( X1 > X2)
{
Temp=X1; X1=X2; X2=Temp;
Temp=Y1; Y1=Y2; Y2=Temp;
}
Y=Y1;
m = (GLfloat) (Y2-Y1)/(X2-X1);
for( iX = X1; iX <= X2; iX ++)
{
glBegin(GL_POINTS);
glColor3f(1.0,0.2,0.0);
glVertex2i(iX,round(Y));
glEnd();
Y += m;
}
}
else
{
if( Y1 > Y2)
{
Temp=X1; X1=X2; X2=Temp;
Temp=Y1; Y1=Y2; Y2=Temp;
}
X = X1;
m = (float) (X2-X1)/(Y2-Y1);
for( iY = Y1; iY <= Y2; iY ++)
{
glBegin(GL_POINTS);
glColor3f(1.0,0.2,0.0);
glVertex2i(round(X),iY);
glEnd();
X += m;
}
}
}
void init()
{
glClearColor(0,0,0,0);
glMatrixMode(GL_PROJECTION);
gluOrtho2D(0,100,0,200);
}
void display()
{
glClear(GL_COLOR_BUFFER_BIT);
glEnable(GL_POINT_SMOOTH);
glPointSize(10);
if (i==2)
{
DDALine(xx1,yy1,xx2,yy2);
}
glFlush();
i=0;
}
void mouse(int button, int state, int x, int y)
{
i++;
if (state == GLUT_DOWN)
{
if (i==1)
{
xx1=x;
yy1=y;
}
if (i==2)
{
xx2=x;
yy2=y;
}
}
}
int main(int argc,char **argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
glutInitWindowSize(500,500);
glutInitWindowPosition(200,200);
glutCreateWindow("Line With Slope");
init();
glutDisplayFunc(display);
glutMouseFunc( mouse);
glutMainLoop();
return 0;
}
مختصات ماوس معکوس است یعنی یکبار باید از ارتفاع را ازش کم کنیم تا مختصات ما بدست بیاد .
مثلاً اگر از
gluOrtho2D(0.0,650.0,0.0,300.0);
.
.
void myMouseFunc( int button, int state, int x, int y ) {
if ( button==GLUT_LEFT_BUTTON && state==GLUT_DOWN ) {
xx=x;
yy=300-(y);
اگر دستگاه 1 باشه بجای 300 از یک کمش می کنیم.
این پست را ببین.
سلام ببخشید سوالمو اینجا می پرسم اخه سولای مختلفه !:خجالت:
اول از همه یکم
glLightfv(GL_LIGHT0, GL_POSITION, position);
رو توضیح بدین یعنی الان منظورم اینه که این نور ما نقه ایه جهتیه اسپاته !:متفکر:
چطور تعیین کنم چه مدلی باشه !:متفکر:
بعد این یعنی چی ؟ چی رو فعال می کنه ؟:متفکر:
glEnable(GL_CULL_FACE);
بافر Stencil واس چیه ؟:متفکر:
بعد الان من مثلا با اپن جی ال برنامه نوشتم با ورژن جندش نوشتم ؟ الان از کجا بدونم تو چه ورژنی کار می کنه !:متفکر:
شیدر هم استفاده نکردم ! تو همه کار می کنه ؟:متفکر:
:متفکر:
:متفکر:
:متفکر:
:متفکر:
دوستان سلام
کسی کد رسم هواپیمای 2 بعدی در opengl رو داره برام بزاره؟
فوری یه!!!!
glLightfv ( light , pname , params ) → None
پارامتر ها
light
یک نور را مشخص می کند . تعداد نور ها بر حسب پیاده سازی مشخص می شود ولی حداقل 8 نور پشتیبانی می شود اینها بوسیله نام سمبلیک مشخص می شوند از GL_LIGHT i زمانی که 0 ≤ i < GL_MAX_LIGHTS
pname
نوع منبع نور را مشخص می کند برای light
مقادیرقابل قبول
GL_AMBIENT, GL_DIFFUSE, GL_SPECULAR, GL_POSITION, GL_SPOT_CUTOFF, GL_SPOT_DIRECTION, GL_SPOT_EXPONENT, GL_CONSTANT_ATTENUATION, GL_LINEAR_ATTENUATION, and GL_QUADRATIC_ATTENUATION are accepted.
params
یک اشاره گر به مقادیر که به pnameو نوع نور تخصیص داده می شود.
تشریح :
glLight تعیین می کند مقادیر منحصر به فرد منبع نور را مشخص می کند. light نام نور و یک نام سمبلیک از GL_LIGHT i, زمانی که 0 ≤ i < GL_MAX_LIGHTS و pname مشخص می کند یکی از 10 مشخصه منبع نور را دوباره بوسیله نام سمبلیک
params می تونه یک مقدارباشه یا یک اشاره گر به آرایه ایی از مقادیر جدید.
برای فعال و غیر فعال کردن محاسبات نور می توانید بوسیله فراخوانی glEnable و glDisable با آرگومان GL_LIGHTING اقدام کنید. نور پردازی بطور پیش فرض غیر فعال است. زمانی که فعال می شود منابع نور فعال در محاسبات نور پردازی شرکت می کنند . منبع نور i بوسیله دستور glEnable و glDisable با آرگومان GL_LIGHT i فعال و غیر فعال می شوند.
10 پارامتر منبع نور به ترتیب زیر است :
GL_AMBIENT
نور محیط یا Ambient Light:
params شامل 4 عدد صحیح یا ممیز شناور که مشخص می کنند رنگ نور محیطی RGBA و شدت نور را. مقادیر صحیح به صورت خطی به دستگاه واحد نگاشت می شوند بیشترین مقدار به 1 و منفی ترین مقدار به -1 نگاشت می شود. مقادیر ممیز شناور بطور مستقیم نگاشت می شوند. شدت اولیه نور (0, 0, 0, 1) است.
GL_DIFFUSE
نور پخشی :
params شامل 4 عدد صحیح یا ممیز شناور که مشخص می کنند رنگ نور محیطی RGBA و شدت نور را. مقادیر صحیح به صورت خطی به دستگاه واحد نگاشت می شوند بیشترین مقدار به 1 و مقادیر ممیز شناور بطور مستقیم نگاشت می شوند. مقدار اولیه برای GL_LIGHT0 بابر (1, 1, 1, 1) است. برای نور های دیگر مقادیر دیگر مقادیر دیگر (0, 0, 0, 0) است.
GL_SPECULAR
نور متمرکز :
params شامل 4 عدد صحیح یا ممیز شناور که مشخص می کنند رنگ نور محیطی RGBA و شدت نور را. مقادیر صحیح به صورت خطی به دستگاه واحد نگاشت می شوند بیشترین مقدار به 1 و مقادیر ممیز شناور بطور مستقیم نگاشت می شوند. مقدار اولیه برای GL_LIGHT0 برابر (1, 1, 1, 1) و برای نور ها دیگر برابر (0, 0, 0, 0) است.
GL_POSITION
نور موضعی, نقطه ایی :
params شامل 4 عدد صحیح یا ممیز شناور که مشخص می کنند رنگ نور محیطی RGBA و شدت نور را. مقادیر صحیح به صورت خطی به دستگاه واحد نگاشت می شوند بیشترین مقدار به 1 و مقادیر ممیز شناور بطور مستقیم نگاشت می شوند.
موضع تبدیل بوسیله ماتریس modelview است زمانی که glLight فراخوانی می شود زمانی که فقط یک نقطه است و آن در مختصات چشم ذخیره می شود اگر کامپوننت w از موقعیت صفر باشد نور رفتار می کند شبیه منبع نور مستقیم . محاسبات نور پخشی و موضعی نیاز به جهت دارند . ولی نه موقعیت واقعی موقعیت شروع برابر (0, 0, 1, 0) است پس منبع اولیه نور مستقیم است . به موازات جهت مختصات محور -z.
بقیشم من حسش نبود ترجمه کنم ولی اینا رو برو در قسم برنامه های و مثال های openGL یک برنامه هست مقادیرشونو کم و زیاد کن بدست میاد.
GL_SPOT_DIRECTION
params contains three integer or floating-point values that specify the direction of the light in homogeneous object coordinates. Both integer and floating-point values are mapped directly. Neither integer nor floating-point values are clamped.
The spot direction is transformed by the inverse of the modelview matrix when glLight is called (just as if it were a normal), and it is stored in eye coordinates. It is significant only when GL_SPOT_CUTOFF is not 180, which it is initially. The initial direction is (0, 0, -1).
GL_SPOT_EXPONENT
params is a single integer or floating-point value that specifies the intensity distribution of the light. Integer and floating-point values are mapped directly. Only values in the range [0,128] are accepted.
Effective light intensity is attenuated by the cosine of the angle between the direction of the light and the direction from the light to the vertex being lighted, raised to the power of the spot exponent. Thus, higher spot exponents result in a more focused light source, regardless of the spot cutoff angle (see GL_SPOT_CUTOFF, next paragraph). The initial spot exponent is 0, resulting in uniform light distribution.
GL_SPOT_CUTOFF
params is a single integer or floating-point value that specifies the maximum spread angle of a light source. Integer and floating-point values are mapped directly. Only values in the range [0,90] and the special value 180 are accepted. If the angle between the direction of the light and the direction from the light to the vertex being lighted is greater than the spot cutoff angle, the light is completely masked. Otherwise, its intensity is controlled by the spot exponent and the attenuation factors. The initial spot cutoff is 180, resulting in uniform light distribution.
GL_LINEAR_ATTENUATION , GL_QUADRATIC_ATTENUATION , GL_CONSTANT_ATTENUATION
params is a single integer or floating-point value that specifies one of the three light attenuation factors. Integer and floating-point values are mapped directly. Only nonnegative values are accepted. If the light is positional, rather than directional, its intensity is attenuated by the reciprocal of the sum of the constant factor, the linear factor times the distance between the light and the vertex being lighted, and the quadratic factor times the square of the same distance. The initial attenuation factors are (1, 0, 0), resulting in no attenuation.
Notes
It is always the case that GL_LIGHT i = GL_LIGHT0 + i.
ببین در ابتدا این مشخصه غیر فعال است ولی اگر فعال بشه با این دستور ما خودمون بوسیله دستور glFrontFace مشخص می کنیم پشت یا رو اجسام برای رندر انتخاب یا گلچین بشود !!نقل قول:
بعد این یعنی چی ؟ چی رو فعال می کنه ؟:متفکر:
glEnable(GL_CULL_FACE);
GL_FRONTو GL_BACK, و GL_FRONT_AND_BACK قابل قبول است .
بافر استنسیل به طور خیلی ساده برای مشخص کردن یک محدوده برای رندر کردن استفاده می شود و یک بافر اضافه محسوب می شود. ولی می شه بوسیله اون افکت های خیلی زیادی را خلق کرد یا همین سایه زدن و اینا.
ببنید ورژن openGL بستگی به کارت گرافیک شما داره وقتی درایور ها نصب می شوند openGL هم آپدیت می شود ولی بطور پیش فرض روی ویندوز 1.1 است که سرعت و ایناش کمتر از ورژن های بعدی است و یکسری قابلیت ها را نداره شما وقتی از یک قابلیت جدید استفاده کنید می تونید برید وارد سایت nvidia و ببنید ورژن فلان آیا ساپورتش میک نه یا خیر ولی اکثراً مشکلی نداره حتی من می تونم بهتون قطعه کد بدم که برنامه رو روی آندروید یا گوشی آیفون اپل تست کنید .نقل قول:
بعد الان من مثلا با اپن جی ال برنامه نوشتم با ورژن جندش نوشتم ؟ الان از کجا بدونم تو چه ورژنی کار می کنه !
لینک های مفید :
http://www.opengl.org/wiki/Getting_Started
http://en.wikipedia.org/wiki/Stencil_buffer
http://developer.apple.com/library/i...roduction.html
http://developer.android.com/trainin...ngl/index.html
اینا شاید غلط و اشتباه زیاد داشته باشه خوشحال می شم دوستان اصلاح کنند.
سلام میشه توابع
glDrawArrays
glDrawArraysIndirect
glDrawArraysInstanced
glDrawArraysInstancedBaseInstance
glDrawBuffers
glDrawElementsBaseVertex رو توضیح بدید ؟
glDrawArrays ( mode , first , count ) → رندر کردن اشکال پایه بوسیله داده های ماتریسی
پارا متر ها :
mode
نوع شکل پایه را مشخص می کند و می تواند مقادیر ثابت زیر باشد :
GL_POINTS, GL_LINE_STRIP, GL_LINE_LOOP, GL_LINES, GL_TRIANGLE_STRIP, GL_TRIANGLE_FAN, GL_TRIANGLES, GL_QUAD_STRIP, GL_QUADS, و GL_POLYGON قابل قبول هستند.
first
مشخص کننده راس شروع.
count
مشخص کننده تعداد که باید رندر شود.
Description
glDrawArrays specifies multiple geometric primitives with very few subroutine calls. Instead of calling a GL procedure to pass each individual vertex, normal, texture coordinate, edge flag, or color, you can prespecify separate arrays of vertexes, normals, and colors and use them to construct a sequence of primitives with a single call to glDrawArrays.
When glDrawArrays is called, it uses count sequential elements from each enabled array to construct a sequence of geometric primitives, beginning with element first. mode specifies what kind of primitives are constructed, and how the array elements construct those primitives. If GL_VERTEX_ARRAY is not enabled, no geometric primitives are generated.
Vertex attributes that are modified by glDrawArrays have an unspecified value after glDrawArrays returns. For example, if GL_COLOR_ARRAY is enabled, the value of the current color is undefined after glDrawArrays executes. Attributes that aren't modified remain well defined.
Notes
glDrawArrays is available only if the GL version is 1.1 or greater.
برای بقیه هم به این رفرنس opengl 4 مراجعه کنید
http://www.opengl.org/sdk/docs/man/
سلام میشه بگید چطور میشه ابر بیضی سه بعدی رسم کرد؟
و اینکه واسه انداختن عکس روی بزیه چیکار کنیم؟
برای ابر اول باید تابع رسم کمان رو بنویسی !نقل قول:
سلام میشه بگید چطور میشه ابر بیضی سه بعدی رسم کرد؟
و اینکه واسه انداختن عکس روی بزیه چیکار کنیم؟
بعد ابر درست کردن کاری نداره دیگه ساده میشه !
برای عکس انداختن هم اول باید عکس رو با یه کتاب خون ای لود کنید بعد وارد پان جی ال کنید !
سرچ کنید مثال هست ! اگه تو کد مشکلی داشتین بگین !:لبخندساده:
مرسی از کمکتون اما من اینارو میدونم !!!!!!
تو ابربیضی وقتی x,y,z بدست آوردیم باید چیکار کنیم؟ تابعی هست واسه کشیدن ابربیضی؟
عکسم هرجا سرچ کردم جواب درست حسابی پیدا نکردم هیچ جا درست توضیح نداده :(:ناراحت:
با سلام
میخواستم بدونم برای انتخاب یک شکل دو بعدی چطوری باید مختصات اون شکل رو برای موس بدست بیارم؟
یه برنامه کوچیک دارم مینویسم که با کلیک بر روی یک مربع 1x1 به حالت انتخاب بره(مثلا دور اون خط کشیده بشه) و بعد از اون، با کلید های صفحه کلید قابل جابجایی باشه و در صورتی که جای دیگری از صفحه(غیر از مربع) کلیک شد دیگه از حالت انتخاب خارج بشه.
بنده به صورت زیر محدوده شکل رو مشخص کردم اما انتخاب نمیشه!! :ناراحت:
میدونم کاملا اشتباه هستش، اما جور دیگه ای هم نتونستم حساب کنم!!!:اشتباه:
با کلیک بر روی صفحه، تابع زیر فراخوانی میشه:
void Positions(int x,int y)
{
if((x>(px-0.5) && x<(px+0.5)))
if((y<(py+0.5) && y>(py-0.5)))
{
select=true;
draw_Quad();
glColor3f(1.0, 1.0, 1.0);
glLineWidth(2.0);
draw_Quad_Line();
}
else
{
select=false;
glClearColor(0.5, 1.0, 0.5, 0.0);
glClear(GL_COLOR_BUFFER_BIT);
draw_Quad();
}
glFlush();
}
ممنون میشم که راهنماییم کنید.
:لبخندساده:
اگه جایی از سوال مجهول هستش، یا نیازی به ارسال کل کد هست بفرمایید تا زودتر به جواب برسیم.
با تشکر.
اول از همه این را در نظر بگیرید شما در یک حلقه هستید که هر ثانیه 30 بار تکرار می شه بعدش کد بزنید . اول شما باید بوسیله glut مختصات ماوس را بدست بیارید و یک شرط چک کنید اگر مختصات ماوس در محدوده شکل بود select را 1 یا true کندو در غیر اینصورت 0 یا false برای اینکه مختصات بهتر تنظیم بشه شما باید پرجکشن را روی 500 * 500 یا هر مقدار دلخواه دیگر تنظیم کنید . اصولاً برای ترسیم بهتر از یک لیست پیوندی یا درخت یا هر چیزی که راحت تر هستید استفاده کنید .
یک کد برای اینکه ازش الهام بگیرید گذاشتم که وقتی مأوس میره روش رنگش سبز می شه ..
#include <math.h>
#include <GL/glut.h>
bool flag=0;
void special( int key, int x, int y)
{
switch(key){
case GLUT_KEY_UP:
//your code
break;
case GLUT_KEY_DOWN:
//your code
break;
}
}
void init(void){
glClearColor(1.0,1.0,1.0,0.0);
glMatrixMode(GL_PROJECTION); //projection parameters
gluOrtho2D(0.0,300.0,0.0,300.0); //sets up WC extent
}
void Display()
{
glClear(GL_COLOR_BUFFER_BIT);
if (flag) glColor3f(0.0, 0.0, 1.0);
else glColor3f(0.0, 1.0, 0.0);
glPushMatrix();
glTranslatef(150.0,150.0,0.0);
GLUquadricObj *circle = gluNewQuadric ();
gluQuadricDrawStyle (circle, GLU_FILL);
gluDisk (circle,0,100,5000,1);
gluDeleteQuadric(circle);
glPopMatrix();
glutSwapBuffers();
}
void myMotionFunc( int x, int y ) {
y=300-(y);
if(sqrt(double(pow(float(abs(150-x)),2)+pow(float(abs(150-y)),2)))>100) flag=1;
else flag=0;
}
int main(int argc, char **argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
glutInitWindowPosition(500,500);
glutInitWindowSize(300,300);
glutCreateWindow("Circle key");
init();
glutDisplayFunc(Display);
glutIdleFunc(Display);
glutPassiveMotionFunc (myMotionFunc);
glutSpecialFunc(special);
glutMainLoop();
return 0;
}
با تشکر بخاطر کد برنامه،
البته چون تازه وارد هستم راستش از کدای بالا زیاد سر در نیاوردم و حتما از اون کدا هم سوال میپرسم.:لبخندساده:
اگه لطف کنید کد بنده رو یه بررسی کنید، یه فرمولی برای محاسبه مکان شیئ از خودم درست کردم که حتی اگه اندازه ی پنجره رو توی کدها تغییر بدیم بازم عمل کنه. :چشمک:
فقط یه مشکل کوچیکی وجود داره که به راهنمایی دوستان نیاز دارم. :لبخند:
زمانی که میخوایم شیئ رو انتخاب میکنیم هیچ مشکلی وجود نداره، ولی زمانی که برای از انتخاب در آوردن شیئ به کنار شیئ کلیک میکنیم مشکل خودش رو نشون میده. :متفکر:
اگر بالا یا پایین شیئ کلیک کنیم از انتخاب درمیاد، ولی اگر به چب یا راستش کلیک کنیم، انگار که اصلا فرمان کلیکی وجود نداره یا اینکه انگار روی خود شیئ کلیک میکنیم!!!!!!!!!!!!!!!!!!!!!!!! :عصبانی:
من یکم داغ کردم اگه زودتر کمک کنید ممنون میشم.
اینم کد برنامه:
// Select_Move_shape.cpp : Defines the entry point for the console application.
#include "stdafx.h"
#include <stdlib.h>
#include <glut.h>
GLsizei wh = 500, ww = 500;
GLfloat px = 0.0;
GLfloat py = 0.0;
GLfloat Munit = 0.05;
GLfloat wx = ww/2;
GLfloat wy = wh/2;
GLfloat wxMunit = wx * Munit;
GLfloat wyMunit = wy * Munit;
bool select=false;
GLfloat size = 0.5;
GLfloat PXsize = wx* size;
GLfloat PYsize = wy* size;
void draw_Quad()
{
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_QUADS);
glVertex2f(px-size, py+size);
glVertex2f(px+size, py+size);
glVertex2f(px+size, py-size);
glVertex2f(px-size, py-size);
glEnd();
glFlush();
}
void Positions(int x,int y)
{
//x = ww - x;
y = wh - y;
if((x>(wx-PXsize) && x<(wx+PXsize))) //(float)
if((y<(wy+PYsize) && y>(wy-PYsize)))
{
select=true;
glClearColor(0.5, 0.5, 1.0, 0.0);
glClear(GL_COLOR_BUFFER_BIT);
draw_Quad();
}
else
{
select=false;
glClearColor(0.5, 1.0, 0.5, 0.0);
glClear(GL_COLOR_BUFFER_BIT);
draw_Quad();
}
glFlush();
}
void my_key_events (unsigned char key, int x, int y )
{
int k=key;
printf("Key Value Is: %d\n",k);
switch ( key ) {
case 'a': case 'A': //case GLUT_KEY_LEFT:
if(select==true)
{
px-=Munit; //Left
wx-=wxMunit;
draw_Quad();
}
break;
case 'd': case 'D': //case GLUT_KEY_RIGHT:
if(select==true)
{
px+=Munit; //0.05--2.5//Right
wx+=wxMunit;
draw_Quad();
}
break;
case 'w': case 'W': //case GLUT_KEY_UP:
if(select==true)
{
py+=Munit; //Up
wy+=wxMunit;
draw_Quad();
}
break;
case 's': case 'S': //case GLUT_KEY_DOWN:
if(select==true)
{
py-=Munit; //Down
wy-=wxMunit;
draw_Quad();
}
break;
case 'r' : case 'R' :
glColor3f(1.0, 0.0, 0.0); //Red
draw_Quad();
break;
case 'g' : case 'G' :
glColor3f(0.5, 1.0, 0.5); //Green
draw_Quad();
break;
case 'b' : case 'B' :
glColor3f(0.0, 0.0, 1.0); //Blue
draw_Quad();
break;
case 'q' : case 'Q' :
exit ( EXIT_SUCCESS);
break;
}
}
void mouse_action(int btn, int state, int x, int y)
{
if(btn==GLUT_RIGHT_BUTTON)
{
glClearColor(1.0, 1.0, 1.0, 0.0);
glClear(GL_COLOR_BUFFER_BIT);
draw_Quad();
}
if(btn==GLUT_LEFT_BUTTON && state==GLUT_DOWN)
{
Positions(x,y);
printf("Xs: %d\nYs: %d\n\n",x,y);
if((x>0 && y>0) && (x<=10 && y<=10))
printf("OKsss\n");
}
}
void mydisplay(void)
{
glClearColor(0.8, 1.0, 0.8, 0.0);
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(0.0, 0.0, 0.0); //Black
draw_Quad();
glFlush();
}
int main(int argc, char** argv)
//int _tmain(int argc, _TCHAR* argv[])
{
glutInit(&argc,argv);
glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize(500,500);
glutInitWindowPosition(500,150);
glutCreateWindow("Move_Game => Author: Kazemian");
//init(); //!!!!!
glutDisplayFunc(mydisplay);
glutMouseFunc (mouse_action);
glutKeyboardFunc( my_key_events );
//glViewport(0,0,2,2);
glutMainLoop();
return 0;
}
یکمی اصلاحات برات انجام دادم ولی انگار کلاً ما در و دیوار حرف می زنیم !!!
// glut.cpp : Defines the entry point for the console application.
//
// Select_Move_shape.cpp : Defines the entry point for the console application.
#include "stdafx.h"
#include <stdlib.h>
#include <GL/glut.h>
GLsizei wh = 500, ww = 500,color=1;
GLfloat px = 0.0;
GLfloat py = 0.0;
GLfloat Munit = 1;
GLfloat wx = ww/2;
GLfloat wy = wh/2;
GLfloat wxMunit = wx * Munit;
GLfloat wyMunit = wy * Munit;
bool select=false;
GLfloat size = 200;
GLfloat PXsize = wx* size;
GLfloat PYsize = wy* size;
void draw_Quad()
{
glBegin(GL_QUADS);
glVertex2f(px, py);
glVertex2f(px, py+size);
glVertex2f(px+size, py+size);
glVertex2f(px+size, py);
glEnd();
}
void draw_OQuad()
{
glColor3f(1.0, 0.0, 0.0);
glBegin(GL_LINE_LOOP);
glVertex2f(px, py);
glVertex2f(px, py+size);
glVertex2f(px+size, py+size);
glVertex2f(px+size, py);
glEnd();
}
void Positions(int x,int y)
{
//x = ww - x;
y = wh - y;
if((x>(wx-PXsize) && x<(wx+PXsize))) //(float)
if((y<(wy+PYsize) && y>(wy-PYsize)))
{
select=true;
glClearColor(0.5, 0.5, 1.0, 0.0);
glClear(GL_COLOR_BUFFER_BIT);
draw_Quad();
}
else
{
select=false;
glClearColor(0.5, 1.0, 0.5, 0.0);
glClear(GL_COLOR_BUFFER_BIT);
draw_Quad();
}
glFlush();
}
void my_key_events (unsigned char key, int x, int y )
{
int k=key;
printf("Key Value Is: %d\n",k);
switch ( key ) {
case 'a': case 'A': //case GLUT_KEY_LEFT:
if(select==true)
{
px-=Munit; //Left
wx-=wxMunit;
}
break;
case 'd': case 'D': //case GLUT_KEY_RIGHT:
if(select==true)
{
px+=Munit; //0.05--2.5//Right
wx+=wxMunit;
}
break;
case 'w': case 'W': //case GLUT_KEY_UP:
if(select==true)
{
py+=Munit; //Up
wy+=wxMunit;
}
break;
case 's': case 'S': //case GLUT_KEY_DOWN:
if(select==true)
{
py-=Munit; //Down
wy-=wxMunit;
}
break;
case 'q' : case 'Q' :
exit ( EXIT_SUCCESS);
break;
}
}
void mouse_action(int btn, int state, int x, int y)
{
y=wh-y;
if(btn==GLUT_RIGHT_BUTTON)
{
draw_Quad();
}
if(btn==GLUT_LEFT_BUTTON && state==GLUT_DOWN)
{
//Positions(x,y);
printf("Xs: %d\nYs: %d\n\n",x,y);
if (x>=(px-size) && x<=(px+size) && y<= (py+size) &&y>= (py-size))
select=true;
else
select=false;
printf("select: %d\n",select);
}
}
void mydisplay(void)
{
glClearColor(0.8, 1.0, 0.8, 0.0);
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(0.0, 1.0, 0.0); //Black
draw_Quad();
if (select) draw_OQuad();
glutSwapBuffers();
glFlush();
}
int main(int argc, char** argv)
{
glutInit(&argc,argv);
glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB);
glutInitWindowSize( wh,ww);
glutInitWindowPosition(500,150);
glutCreateWindow("Move_Game => Author: Kazemian");
glClearColor(0.8, 1.0, 0.8, 0.0);
glMatrixMode(GL_PROJECTION); //projection parameters
gluOrtho2D(0.0,wh,0.0,ww); //sets up WC extent
glutDisplayFunc(mydisplay);
glutIdleFunc(mydisplay);
glutMouseFunc (mouse_action);
glutKeyboardFunc( my_key_events );
glutIdleFunc(mydisplay);
glutMainLoop();
return 0;
}
بخاطر جوابگوییتون از شما ممنونم. :چشمک:
اما اگه دقت کنید همون مشکلی که توی کد من هستش، داخل کد شما هم وجود داره(داخل این کد سمت چپ و پایین اون برای از انتخاب در آوردن شیئ بی تاثیرند)!!!
با این تفاوت که شما از توابع حرفه ای تری استفاده کردید که هنوز سوادم نمیرسه.:خجالت:
یعنی درو دیوار برنامه؟
یه چند تا سوال:
به اشتباه از دو تابع Idle استفاده شده؟ یا دلیل خاصی داره؟
تابع Ortho دقیقا چیه و چطوری کار میکنه؟
و اینکه من برای نمایش حالت انتخاب، از خط دور شکل استفاده کردم ولی درست نشون نمیداد!! :ناراحت:
میشه توضیح بدید که از چه ترفندی استفاده کردید؟
مشکل از شرط سلکت است دیگه اینجوری درست می شه
if (x>=(px) && x<=(px+size) && y<= (py+size) &&y>= (py))
select=true;
else
select=false;
کد بالا را جایگزین کنید درست می شه در و دیوارش !!
کد من مثل شماست ؟! یا حضرت ....
نه نیاز نیست همون یکی کافیه اشتباه کده :دی
تابع Ortho یک سرچ بزنید پویا چند بار توضیح داده به خوبی و خیلی کامل خلاصش اینه که ماتریس پیش فرض 1 است ما می آییم با اندازه پنجره تنظیمش می کنیم برای راحت کار کردن با مختصات ماوس
از ترفند خاصی استفاده نشده اگر دقت کنید یک تابع دیگه تعریف شده که به جای مستطیل خط می کشه همین !
درسته مشکل برطرف شد. :تشویق:
فقط الان دارم سعی میکنم با این حلقه ی تکراری که شما گفتید کنار بیام تا برنامه رو به سبک دیگه ای تغییر بدم(یه جور تمرین).!!!
بنده هم همچین تابعی نوشته بودم، فقط دیدم درست کار نمیکنه پاکش کردم!!
البته اون تابع رو داخل تابع Position استفاده کرده بودم که شما زحمت کشیدید کلا بیخیال تابع Position شدی.:متفکر:
مشکلمون شبیه به همه، وگرنه کد شما کجا و کد ما... :لبخند:نقل قول:
نوشته شده توسط amin1softco
ما که جسارت نمیکنیم، پوزش مرا پذیرا باشید.:خجالت:
ممنون.
سلام دوستان
من با ویژوال استادیو 2012 هر برنامه ای که برای OpenGL مینویسم ارر میده و نمیتونه فایل exe را ایجاد کنه باید چیکار کنم ؟
من این کد صفحه 321 کتاب قلی زاده را نوشتم ولی با این که مثل کتابه باز ارر میده کدش را اینجا میزارم از دوستان میخوام که کمک کنن ببینن مشکل چیه
پیشاپیش سپاس گذارم
این کد الگوریتم برش چند ضلعی ساترلند-هاگمن هستش
# include<stdlib.h>
# include <GL/glut.h>
# include <math.h>
# include <iostream.h>
class wcPt2D {
public:
GLfloat x, y;
};
typedef enum {Letf, Right, Bottom, Top } Boundary;
const GLint nClip = 4;
GLint inside (wcPt2D p, Boundary b, wcPt2D wMin, wcPt2D wMax)
{
switch (b) {
case Left: if (p.x < wMin.x) return (false); break;
case Right: if (p.x > wMax.x)return (false); break;
case Bottom: if (p.y < wMIn.y)return (false); break;
case Top: if (p.y > wMax.y) return (false); break;
}
return (true);
}
GLint cross (wcPt2D p1, wcPt2D p2, Boundary winEdge, wcPt2D wMin, wcPt2D wMax)
{
if (inside (p1, winEdge, wMin, wMax) == inside (p2, winEdge, wMin, wMax))
return (false);
else return (true);
}
wcPt2D intersect (wcPt2D p1, wcPt2D p2, Boundary winEdge, wcPt2D wMin, wcPt2D wMax)
{
wcPt2D iPt;
GLfoat m;
if (p1.x!= p2.x) m= (p1.y - p2.y) / (p1.x - p2.x);
switch (winEdge) {
case Left:
iPt.x = wMin.x;
iPt.y = p2.y + (wMin.x - p2.x) * m;
break;
case Right:
iPt.x = wMax.x;
iPt.y = p2.y + (wMax.x - p2.x) * m;
break;
case Bottom:
iPt.y = wMin.y;
if (p1.x!= p2.x) iPt.x = iPt.x = p2.x + (wMin.y - p2.y) / m;
else iPt.x = p2.x;
break;
case Top:
iPt.y = wMax.y;
if (p1.x != p2.x) iPt.x = p2.x + (wMax.y - p2.y) / m;
else iPt.x = p2.x;
break;
}
return (iPt);
}
void clipPoint (wcPt2D p, wcPt2D p2, Boundary winEdge, wcPt2D wMin, wcPt2D wMax
wcPt2D * pOut, int * cnt, wcPt2D first[], wcPt2D * s)
{
wcPt2D iPt;
if (!first[winEdge])
first[winEdge] = &p;
else
if (cross (p, s[winEdge], winEdge, wMin, wMax)){
iPt = intersect (p, s[winEdge], winEdge, wMin, wMax);
if (winEdge < Top)
clipPoint (iPt, b+1, wMin, wMax, pOut, cnt, first, s);
else {
pOut[*cnt] = iPt; (*cnt)++;
}
}
s[winEdge] = p;
if (inside (p, winEdge, wMin, wMax))
if (winEdge < Top)
clipPoint (P, winEdge + 1, wMin, wMax, pOut, cnt, first, s);
else {
pOut[*cnt] = p; (*cnt)++;
}
}
void closeClip (wcPt2D wMin, wcPt2D wMax, wcPt2D * pOut, GLint * cnt, wcPt2D * first[ ], wcPt2D * s)
{
wcPt2D pt;
Boundary winEdge;
for (winEdge = Left ; winEdge <= Top ; winEdge++) {
if (cross (s[winEdge], *first[winEdge], winEdge, wMin, wMax)) {
pt = intersect (s[winEdge], *first[winEdge], winEdge, wMin, wMax);
if (winEdge < Top)
clipPoint (pt, winEdge + 1, wMin, wMax, pOut, cnt, first, s);
else {
pOut[*cnt] = pt; (*cnt)++;
}
}
}
}
GLint polygonClipSuthHodg (wcPt2D wMin, wcPt2D wMax, GLint n, wcPt2D * pIn, wcPt2D * pOut)
{
wcPt2D * first[nClip] = {0, 0, 0, 0 }, s[nClip]:
GLint k, cnt = 0;
for (k = 0; k < n; k++)
clipPoint (pIn[k], Left, wMin, wMax, pOut, &cnt, first, s);
closeClip (wMin, wMax, pOut, &cnt, first, s);
return (cnt);
}
نمیدونم چه اروری میده ولی در خط 9 این کد شما نوشتین Letf شما اول نوشتین Letf ولی بعد از Left استفاده کردین :لبخندساده:
با سلام خسته نباشين
بصورت رايگان بازديد کننده وبسايت شمارو افزايش ميديم
سايت اسکاي رنک (سامانه افزايش سريع بازديد و بهبود رتبه السکا) تنها سايت اسکاي رنک چنين فرصتي به شما داده تا رتبه وبسايت خود رو در السکا بالا ببريد پس از همين حالا در سايت عضو بشين و آدرس وبسايت خود رو تو پنل کاربريتون اضافه کنيد و به بازديد اتومات و خريد بازديد بپردازيد موفق باشيد
http://skyrank.ir/
09397951796
http://skyrank.ir/banners/bener.gif
با سلام و خسته نباشید،
یه چندتایی سوال دارم!!
چطوری میتونم شدت تابش یه منبع نور رو کم و زیاد کنم؟
خودم فکر میکنم باید پارامتر چهارم A0 رو تغییر بدم، اما شاید چون هنوز کامل با OpenGL آشنا نشدم، نتونستم!!! :ناراحت:
GLfloat A0[4]={1,0,0,1};
glLightfv(GL_LIGHT0,GL_DIFFUSE,A0);
یه سوال دیگه اینکه چطور میتونم دوربین رو حرکت بدم و با رسیدن به یک شیئ با کلید های جهتی دور اون شیئ بچرخم؟
وقتی فقط مختصات چشم(دوربین) رو تغییر میدم به شکل خیلی بدی جابجا میشه!!
وقتی مختصات دوربین و مختصات نقطه فوکوس شده رو با هم تغییر میدم به صورت موازی جابجا میشه.
و زمانی که مختصات نقطه فوکوس شده رو تغییر میدم مثل اینه که دوربین روی پایه قرار گرفته و به اطراف میچرخه.البته نمیدونم چرا بیش از 180 درجه نمیچرخه؟!
(البته روش بهتری برای این کار نیاز دارم که با چرخش دوربین، سمت حرکت برای کاربر مثل قبل باشه و تغییری نکنه یعنی با کلید جلو فقط جلو بره و چپ و راست نره!!)
لطفا پارامتر های خود تابع Perspectiv رو هم یه مخصر توضیح بدید. :خجالت:
سوال بعدی هم اینه، چطور میتونم فقط یک شیئ سه بعدی رو به شکل شفاف(شیشه ای) تبدیل کنم؟
با تشکر از زحمات شما. :چشمک:
سلام دوستان
کسی می تونه کمکم کنه که تو صفحه یک مخروط و حلقه و قوری داشته باشم؟
ممنون میشم اگه کسی کمکم کنه
چند وقته دنبالشم ولی چیزی پیدا نکردم کارم بدجور گیره
درود به دوستان
این سه خط چیکار میکنه؟ممنون میشم راهنماییم کنین
glutAttachMenu(GLUT_RIGHT_BUTTON);
glutAttachMenu(GLUT_MIDDLE_BUTTON);
glutMouseFunc(mouse);
سپاس
دوستان بالاخره این رو پیدا کردم
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glColor3f(1.0,0.0,0.0);
glPushMatrix();
glTranslatef(-0.6,0,0);
glRotatef(t,t,t,0);
glutSolidTeapot(0.2);
glPopMatrix();
خواهش می کنم شما هم یک لطفی بکنید و بگید اگه سه تا از این اشکال تو صفحه داشته باشیم و چه طور بهشون مکان بدیم که کجای صفحه قرار بگبیرن؟
ممنون میشم اگه کسی کمک کنه
سلام داداش ببین تو که میگی هنوز اول کاری ! اخه نه اصلا از دوربین استفاده کردی نه از هیچی الان دقیقا هم منظورتو نفهمیدم چیه میخای 3 تا قوری بسازی که رو هم نیافتن ؟؟ یعنی با فاصله از هم ساخته بشن ؟؟ اینکه کاری نداره فکر کنم تو همون کتاب انگیسیه گفته بود
بیا ببین منظورت همینه یا خیر
#include <freeglut.h>
void display () {
glClear(GL_COLOR_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glPushMatrix();
glTranslatef(0,0,-3);
glutWireTeapot(1);
glTranslatef(0,2,0);
glutSolidTeapot(1);
glPopMatrix();
glTranslatef(0,-2,-1);
glutSolidTeapot(1);
glPopMatrix();
glFlush();
}
void reshape ( int width, int height )
{
glViewport(0,0,width,height);
}
int main ( int argc, char * argv[] )
{
glutInit(&argc,argv);
glutInitWindowSize(500,500);
glutInitWindowPosition(0,0);
glutInitDisplayMode(GLUT_RGB);
glutCreateWindow("mehran!");
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(60,1,1,10);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0.0,0.0,5.0,0.0,0.0,0.0,0.0,1.0,0.0);
glutMainLoop();
}