همه رو وارد کردم الان چک کردم دیدم کلا اصلا هیچ هدری رو نمیشناسه هیچ برنامه ای رو نمیتونه اجرا کنه ولی تو فایل lib همه ی هدرها هست نمیدونم چیکار کنم:گریه:
Printable View
هیچی اول 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();
}
سلام دوست عزیز،
خط اول برای ارتباط کلید راست به منویی که از قبل نوشته شده هست و همچنین خط دوم نیز برای ارتباط منو با کلید وسط موس هستش.
خط آخر هم تابع کالبکی هستش که باید به برنامه بفهمونیم از کدوم تابع برای عکس العمل نشون دادن به رویدادهای موس استفاده کنه، که در تابع main نوشته میشه و اسمی که در ورودی اون نوشته شده(mouse) همون تابع مورد نظر هستش.
سلام
من می خواستم یه برنامه به شیوه rastering بنویسم و نحوه نوشتن به این شیوه رو هم مطالعه کردم ولی آدرس دهی خونه ها رو خوب متوجه نشدم.میشه کمی به من توضیح بدین جریان چیه؟
ممنون از لطفتون
یکی از دوستان در مورد بافت ها سئوال پرسیده بود و در خواست یک مثال ساده از لود کردن یک فایل bmp توسط سی++ و قرار دادن بعنوان بافت را داشته بود من این کد را زدم که ضمیمه این پست است <br>
برای اینکار ما ابتدا باید فایل را باز کنیم و هدر های فایل را بخونیم و اندازه طول و عرض فایل بیتمپ را بدست بیاریم و بعد از اون بوسیله توابع یک تکسچر ایجاد و مقید کنیم برای توضیحات مفصل تر از لینک های زیر استفاده کنید :
http://nehe.gamedev.net/tutorial/texture_mapping/12038/
http://www.opengl-tutorial.org/begin...textured-cube/
#include <iostream>
#include <GL/gl.h> //سر فایل که هسته اپن جی ال را به برنامه اضافه می کند
#include <GL/glut.h>//سر فایل برای اضافه کردن توابع مورد نیاز ایجاد پنجره
GLfloat angle = 0.0;// برای چرخش مکعب ااین متغیر استفاده می کنیم ز
GLuint textureID; // ایجاد یک متغیر برای ایجاد شناسه برای بافت
GLuint loadBMP_custom(const char * imagepath){// تابع ساده برای لود کردن تصاویر بیتمپ از نوع 24 بیتی
// خواندن اطلاعات هدر فایل بیتمپ
unsigned char header[54]; // هر فایل بیتمپ با 54 بایت هدر شروع می شود که در این متغیر ذخیره می شود
unsigned int dataPos; // نگهداری موقعیت ما در فایل که تا کجا خوانده شده
unsigned int width, height;// متغیر برای ذخیره کردن طول و عرض بیتمپ
unsigned int imageSize; // = width*height*3 اندازه کلی تصویر برابر است با طول در عرض در 3 که شامل 3 مقدار رنگی است
// داده های واقعی بیتمپ در این متغیر ذخیره می شوند
unsigned char * data;
// باز کردن فایل
FILE * file = fopen(imagepath,"rb");//آدرس از ورودی تابع اصلی گرفته می شود
if (!file) {printf("Image could not be opened\n"); return 0;}
if ( fread(header, 1, 54, file)!=54 ){ // اگر 54 بایت هدر نداریم پس یک مشکل وجود دارد
printf("Not a correct BMP file\n");
return 0;
}
//هر فایل بیتمپ با این دو حرف شروع می شود
if ( header[0]!='B' || header[1]!='M' ){
printf("Not a correct BMP file\n");
return 0;
}
// گرفتن اطلاعات از هدری که قبلاً خوانده شده
dataPos = *(int*)&(header[0x0A]);
imageSize = *(int*)&(header[0x22]);
width = *(int*)&(header[0x12]);
height = *(int*)&(header[0x16]);
// بعضی فایل های بیتمپ درست قالب بندی نشده اسند
if (imageSize==0) imageSize=width*height*3;
if (dataPos==0) dataPos=54; // گذر از هدر فایل بیتمپ
// ساخت یک بافر
data = new unsigned char [imageSize];
// خواندن داده های واقعی از فایل به داخل بافر
fread(data,1,imageSize,file);
//همه چیز در حافظه است الان می تونیم فایل را ببندیم
fclose(file);
//بیتمپ ها با فرمت بی جی آر ذخیره می شوند
//است که باید به آرایش ار جی بی تبدیل شود.
//BGR 2 RGB
for (int i = 0; i < imageSize; i+=3)
{
char c = data[i];
data[i] = data[i+2];
data[i+2] = c;
}
glGenTextures(1, &textureID); // ساخت یک بافت اپن جی ال
glBindTexture(GL_TEXTURE_2D, textureID);// مقید سازی بافت ساخته شده جدید تمام توابع بعدی این بافت را تغییر می دهند
// دادن تصویر به اپن جی ال
glTexImage2D(GL_TEXTURE_2D, 0,GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTE R,GL_LINEAR); // فیلتر سازی خطی
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTE R,GL_LINEAR);
}
void init (void) {
loadBMP_custom("NeHe.bmp"); // لود کردن تصویر از آدرس داده شده
glEnable(GL_TEXTURE_2D); // فعال کردن نگاشت بافت دو بعدی
glShadeModel(GL_SMOOTH); // فعال کردن نرم کننده
glClearColor(0.0f, 0.0f, 0.0f, 0.5f); // مشخص کردن رنگ بک گراند
glClearDepth(1.0f); // فعال کردن بافر عمق
glEnable(GL_DEPTH_TEST); // فعال کردن تست عمق
glDepthFunc(GL_LEQUAL); // مشخص کردن نوع تست عمق
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // ساخت پرسپکتیو
glBlendFunc(GL_SRC_ALPHA,GL_ONE); // فعال کردن بلندینگ و مشخص کردن نوع ان
glEnable(GL_BLEND);
}
void display (void) {
glClearColor (0.0,0.0,0.0,1.0);
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);// پاک کردن بافر
glLoadIdentity(); // لود ماتریس همانی یا 1
gluLookAt (0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);//مشخص کردن موقعیت دوربین
glRotatef(angle, 1.0, 0.0, 0.0);//چرخش با زاویه آنگل
glRotatef(angle, 0.0, 1.0, 0.0);//چرخش با زاویه آنگل
glRotatef(angle, 0.0, 0.0, 1.0);//چرخش با زاویه آنگل
glBegin(GL_QUADS);
/*برای نگاشت صحیح یک بافت روی مکعب , شما باید مطمئن شوید که بالا سمت راست بافت به بالا سمت راست مکعب نگاشت میشود و به همین ترتیب گوشه های دیگر اگر گوشه ها با یکدیگر مچ نشوند ممکن است تصویری نمایش داده نشود یا تصویر بر عکس شود ویا...
اولین glTexCoord2f روی محور ایکس سمت چپ است 0.5f وسط بافت و 1.0f سمت راست بافت است .
بنابراین حالا ما می دانیم که گوشه بالا سمت چپ با 0.0f در محور x و 1.0f برای محور y در بافت و بالا سمت چپ مکعب دارای مختصات -1.0f برای x و 1.0f برای محور y است و به همین ترتیب تا آخر*/
glTexCoord2f(0.0f, 0.0f); //مشخص کردن مختصات بافت
glVertex3f(-1.0f, -1.0f, 1.0f);//مشخص کردن رأس اول مکعب
glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f);
// Back Face
glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f);
glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f);
// Top Face
glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f);
glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, 1.0f, 1.0f);
glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, 1.0f, 1.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f);
// Bottom Face
glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, -1.0f, -1.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, -1.0f, -1.0f);
glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f);
glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f);
// Right face
glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f);
glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f);
// Left Face
glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f);
glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f);
glEnd();
glutSwapBuffers();
angle ++;
}
void reshape (int w, int h) {
glViewport (0, 0, (GLsizei)w, (GLsizei)h);
glMatrixMode (GL_PROJECTION);
glLoadIdentity ();
gluPerspective (60, (GLfloat)w / (GLfloat)h, 1.0, 100.0);
glMatrixMode (GL_MODELVIEW);
}
int main (int argc, char **argv) {
glutInit (&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);
glutInitWindowSize (500, 500);
glutInitWindowPosition (100, 100);
glutCreateWindow ("A basic OpenGL Window");
init ();
glutDisplayFunc (display);
glutIdleFunc (display);
glutReshapeFunc (reshape);
glutMainLoop ();
return 0;
}
اقا یک سوال داشتم من چجوری میتونم حرکت موس رو پیدا کنم ؟؟ و چجوری میتونم بگم وقتی موس روی فلان ابجکت رفت فلان اتفاق بی افته
در کل میخام این کار رو انجام بدم -> یک مربع 2 بعدی ترسیم کنم و وقتی موس روی اون مربع قرار گرفت و کلید چپ زده شد و موس به هرطرف رفت اون مربع هم به همون طرف بده
کسی میتونه کمکم کنه ؟؟
ممنون
من والا چندتا مثال برای کار با مأوس گذاشتم قبلاً
حالا نمی دونم این درسته یا نه ولی من خودم اگر بودم اول یک لیست پیوندی درست می کردم و اسمش را می گذاشتم لیست نمایش و بعد برای هر فرم می اومدم و یک بار این لیست را پیمایش می کردم و در هر گره مختصات آبجکت یا شکل را ذخیره می کردم مثلاً دو تا متغیر x,y + اینکه یک شرط که در اون فرم مختصات مأوس کجاست و یک فلگ مثلاً تعریف می کردم که با شرط بیاد و چک کنه اگر مختصات مأوس با مختصات این آبجکت بر خورد داره اون فلاگ مقدارش عوض بشه و اینجوری کل صحنه دستم بود
برای همین مثالم این کفایت می کنه ولی چون یک مربع بیشتر نیست می تونید یک کلاس تعریف کنید مختصات این مربع در اون ذخیره بشه.....
نه داداش ببین من باید یه جوری این کد رو بنویسم که بتونم تو کتابخونه ی خودم بذارمش و به عنوان مثال یککاربر بتونه با 1 خط کد همه چی رو تعریف کنه من دارم از دستورات جی ال یو تی استفاده میکنم (فعلا ) :لبخند:
حل شد :لبخند:
#include "stdafx.h"
#include <gl/freeglut.h>
#include <iostream>
#include <gl/glut.h>
static bool p=true;
GLfloat rot = 0.0;
GLuint textureID;
GLuint loadBMP_custom(const char * imagepath)
{
unsigned char header[54];
unsigned int dataPos;
unsigned int width, height;
unsigned int imageSize;
unsigned char * data;
FILE * file = fopen(imagepath,"rb");
if (!file)
{
printf("Image could not be opened\n"); return 0;
}
if ( fread(header, 1, 54, file)!=54 )
{
printf("Not a correct BMP file\n");
return 0;
}
if ( header[0]!='B' || header[1]!='M' )
{
printf("Not a correct BMP file\n");
return 0;
}
dataPos = *(int*)&(header[0x0A]);
imageSize = *(int*)&(header[0x22]);
width = *(int*)&(header[0x12]);
height = *(int*)&(header[0x16]);
if (imageSize==0) imageSize=width*height*3;
if (dataPos==0) dataPos=54;
data = new unsigned char [imageSize];
fread(data,1,imageSize,file);
fclose(file);
for (int i = 0; i < imageSize; i+=3)
{
char c = data[i];
data[i] = data[i+2];
data[i+2] = c;
}
glGenTextures(1, &textureID);
glBindTexture(GL_TEXTURE_2D, textureID);
// دادن تصویر به اپن جی ال
glTexImage2D(GL_TEXTURE_2D, 0,GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTE R,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTE R,GL_LINEAR);
}
void init (void) {
glEnable(GL_TEXTURE_2D);
glShadeModel(GL_SMOOTH);
glClearColor(0.0f, 0.0f, 0.0f, 0.5f);
glClearDepth(1.0f);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
glBlendFunc(GL_SRC_ALPHA,GL_ONE);
glEnable(GL_BLEND);
}
void display (void) {
glClearColor (0.0,0.0,0.0,1.0);
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
gluLookAt (0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
if (p==true)
{
glPushMatrix();
loadBMP_custom("nehe.bmp");
glRotatef(rot, 0.0, 1.0, 0.0);
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 0.0f); glVertex3f(1.0f,-1.0f, 1.0f);
glTexCoord2f(1.0f, 0.0f); glVertex3f( 3.0f, -1.0f, 1.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f(2.0f, 0.0f, 1.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3f( 3.0f, -1.0f, 1.0f);
glEnd();
glPopMatrix();
glPushMatrix();
loadBMP_custom("nehe1.bmp");
glRotatef(rot,1.0,0.0,0.0);
glTranslatef(-2,0,0);
glutSolidTeapot(0.5);
glPopMatrix();
}
else
{
glPushMatrix();
loadBMP_custom("nehe1.bmp");
glRotatef(rot, 0.0, 1.0, 0.0);
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 0.0f); glVertex3f(1.0f, -1.0f, 1.0f);
glTexCoord2f(1.0f, 0.0f); glVertex3f( 3.0f, -1.0f, 1.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f(2.0f, 0.0f, 1.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3f( 3.0f, -1.0f, 1.0f);
glEnd();
glPopMatrix();
glPushMatrix();
loadBMP_custom("nehe.bmp");
glRotatef(rot,1.0,0.0,0.0);
glTranslatef(-2,0,0);
glutSolidTeapot(0.5);
glPopMatrix();
}
glutSwapBuffers();
}
void idle()
{
rot++;
display();
}
void keyboard (unsigned char key, int x, int y)
{
if (key=='a')
{
if (p==true)
p=false;
else
p=true;
}
}
void reshape (int w, int h) {
glViewport (0, 0, (GLsizei)w, (GLsizei)h);
glMatrixMode (GL_PROJECTION);
glLoadIdentity ();
gluPerspective (60, (GLfloat)w / (GLfloat)h, 1.0, 100.0);
glMatrixMode (GL_MODELVIEW);
}
int main (int argc, char **argv) {
glutInit (&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);
glutInitWindowSize (1000, 600);
glutInitWindowPosition (100, 100);
glutCreateWindow ("Textured");
init ();
glutDisplayFunc (display);
glutIdleFunc (idle);
glutReshapeFunc (reshape);
glutKeyboardFunc(keyboard);
glutMainLoop ();
return 0;
}
بازم ممنون از جناب amin1softco
سلام
چه تاپیک خوب و پرباری.واقعا برای کسی که بخواد کار با این کتابخونه رو شروع کنه عالیه
فقط میشه این لینک رو دوباره آپ کنید.لینکش دیگه غیرفعال شده:چشمک:
در مورد pick up کردن و حرکت دوربین هم دوستان قبلا سوال پرسیدن ولی جواب داده نشده ، کسی هست که توابع مربوط به اینارو توضیح بده.مثلا ما تو یه فضای 3 بعدی 8 تا نقطه داریم(رئوس یک مکعب مستطیل) و حالا میخوایم یکی از رئوس رو انتخاب کنیم و اونو حرکت بدیم + اینکه دوربین رو هم بتونیم حرکت بدیم
سلام برای انتخاب راه های زیادی وجود داره و بیشتر بسته به اینه که از کدوم ویرایش استفاده می کنید. اگر از ویرایش OpenGL 1.2 استفاده می کنید خود API یک دستورالعمل داره که توضیحاتش در لینک زیر موجوده:
http://www.glprogramming.com/red/chapter13.html
برای ویرایش های بالاتر بهتره یا از شیدرها استفاده بشه و یا اینکه از روش Ray Pickup که توضیحاتش در کتاب DirextX 9 Game Programming هست استفاده بشه.
لطفا سوالها رو در تاپیکهای جدا بپرسید
این فایل رفرنس های OpenGL2 است که می تونید با یک سرچ ساده بهش دست پیدا کنید فایل ضمیمه است .
برای پیک کردن به بخش مثال های OpenGL یکسری بزنید فک کنم کارتون راه بندازد.
http://nehe.gamedev.net/tutorial/pic...sorting/16005/
سلام
متاسفانه نمی شد تاپیک جدید ایجاد کنم بنابراین سوالمو همین جا مطرح می کنم:
من بررسی کردم و نحوه ی استفاده از تابع gluCylinder رو برای کاربرد دلخواهم متوجه شدم . حالا می خوام بدونم چطور می تونم محورهای مختصات رو با استفاده از این تابع رسم کنم. در واقع می خوام که هر کدوم از محور ها یک میله باشه و نه خط. البته طول مشخصی هم داشته باشه که خودم تعیین می کنم. همینطوری با توجه به فرمی که داره متاسفانه نه تنها چیزی برام رسم نمی کنه که حتی اشیاء دیگه ای رو هم که رسم کردم محو می کنه. من روی یک گرید می خوام اینو رسم کنم.
ممنون می شم اگر جواب بدید.
خوب یک استوانه یا میله با تابع درست کن مثلاً :
GLUquadricObj *quadratic;
quadratic = gluNewQuadric();
glRotatef(90.0f, 0.0f, 1.0f, 0.0f);
gluCylinder(quadratic,0.1f,0.1f,3.0f,32,32);
و سپس با توابع glPushMatrix glRotatef آن را در محور مورد نظر بچرخان شکل می شه محور مختصات.
ایران تحریم است . 1- فیلتر شکن 2- استفاده از کش گوگل 3- دانلود نسخه کامل آموزش های nehe
و...
الان این برنامه ای که نوشتم یه نقطه تو صفحه است که با حرکت موس حرکت می کنه.حالا میخوام این یه نقطه رو مثلا بکنم 2 نقطه یا بیشتر که حالا بیام یکیشو انتخاب کنم و فقط همونو جابه جا کنم
این لینکایی که فرستادید رو نگا کردم ولی نفهمیدم چطوری باید از این تابع gluPickMatrix استفاده کنم :/ کسی هس که راهنماییم کنه؟
#include<gl/glut.h>
float lastX = -1.0f;
float lastY = -1.0f;
float xdiff = 0.0f;
float ydiff = 0.0f;
bool mouseDown = FALSE;
void init()
{
glClearColor(0,0,0,0);
glMatrixMode(GL_PROJECTION);
gluOrtho2D(0,2000,0,1000);
}
void display()
{
glClear(GL_COLOR_BUFFER_BIT);
glEnable(GL_POINT_SMOOTH);
glPointSize(10); glBegin(GL_POINTS);
glColor3f(1.0,0.0,0.4);
glVertex2i(1000,500);
glEnd();
glFlush();
}
void moveDisplay(void)
{
glTranslatef(xdiff,ydiff,0);
glutPostRedisplay();
}
void mouse(int button, int state, int x, int y)
{
if(button == GLUT_LEFT_BUTTON && state == GLUT_DOWN)
mouseDown = TRUE;
else
mouseDown = FALSE;
}
void mouseMotion(int x, int y)
{ if (mouseDown)
{ if(lastX==-1)
lastX=x;
if(lastY==-1)
lastY=y;
xdiff=x-lastX;
ydiff=-y+lastY;
lastX=x;
lastY=y;
moveDisplay();
}
else
{
lastX=x;
lastY=y;
}
}
int main(int argc,char **argv)
{ glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
glutInitWindowSize(500,500);
glutInitWindowPosition(200,200);
glutCreateWindow("moving");
init();
glutDisplayFunc(display);
glutMouseFunc(mouse);
glutMotionFunc(mouseMotion);
glutMainLoop();
return 0;
}
من قبلاً یک برنامه نوشتم بهتره یک نگاهی بهش بندازید ...
الان با ویژوال 2012 دوباره کامپایلش کردم.
روش کار برنامه از منوی کناری شکل دایره را انتخاب کنید و چند تا دایره روی صفحه قرار بدید و سپس ماوس را از منوی کناری انتخاب کنید و با کلیک بر روی هر دایره می توانید انتخاب و موقعیت آن را بوسیله ماوس تغییر دهید ....
http://upload7.ir/images/05280800229308322708.gif
به روش پیکینگ OpenGL هم لینکی که پویا گذاشته نمونه برنامه داره .