مگه برنامش کامل نیست؟؟؟؟؟؟؟؟ تازه این پست خلاف قوانین سایته .......
مگه برنامش کامل نیست؟؟؟؟؟؟؟؟ تازه این پست خلاف قوانین سایته .......
سلام
مرسی از سایتتون
میشه بگین چطور میشه تو opengl یه دایره یا هر شکل با زدن یه کلید پرش کنه؟لطفا راهنماییم کنین
خیلی ممنون از سایتشونمارو قاطی 4 تایی ها نکنید....
ببنید این opengl و برنامه نویسی کلاً هنوز اونقدر هوشمند نیست یعنی برای انجام هر کاری باید قبلش اونو تشریح کنید مثلاً وقتی می خواهید یک توپ پرتاب بشه باید حرکت پرتابی رو پیاده سازی کنید یعنی بوسیله فرمول های فیزیک مسیرش رو معین کنید و اونو در مسیرش حرکت بدین و یک کتابخانه است به اسم physics که بیشتر این چیزا رو شبیه سازی می کنه مثلاً برای جاذبه زمین
بقیشو بزرگان باید جواب بدند
سلام
من به نحوه چرخش اشیا در OpenGL نیاز دارم
در برنامه من یک شی وجود داره که باید حرکن کنه
یعنی وقتی کلید جلو رو زدم بره جلو
وقتی کلید عقب رو زدم عقب بره
و وقتی کلید راست رو زدم باید به چپ بچرخه ( نه اینکه بره چپ بلکه مثل وقتی که موس رو به چپ می برم و صفحه می چرخه وقتی هم که دکمه چپ رو میزنم باید به جپ بچرخه)
و برای دکمه راست هم همینطور
ممنون میشم راهنمایی بفرمایید
این همه ما این دایره ها رو دور هم چرخونیدم والا ... دو راه داره یا خودت بری ماتریس ها رو تغییر بدی بصورت دستی یا باید از توابع :
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 در 15:27 عصر
خوب خدا رو شکر مصیبت قبلی حل شد
میشه بگید dev رو دیگه از کجا باید پیدا کنیم؟؟؟اصلا نمیدونم چی هست
آخه pdf اموزشی که ازhttp://www.parsbook.org/?s=%D9%85%D9...%D8%B1+open+gl گرفتم اسمی از dev نیاورده و اصلا ازش استفاده نکرده
آخرین ویرایش به وسیله a-t-e-f-e-h : یک شنبه 21 اسفند 1390 در 12:57 عصر
ببنید dev یک محیط برای برنامه نویسیه که با دلفی نوشته شده و با استفاده از کامپایلر gcc/g++ کار کامپایل برنامه رو انجام میده و کلاً حجمش کمه و سریع راه اندازی می شه و قابل استفاده است و فکر کنم جزو نرم افزار های آزاد محسوب بشه . آموزش پست اول فقط می خواست یک راهنما باشه برای کامپایلر هایه متنوع تر و نکته جالب این dev اینه که بیشتر library هایی که ما نیاز داریم را در اختیار ما قرار میده و شما حتی بدون طی این مراحل می تونید همون پکیج را در اینترنت سرچ کنید و دانلود کنید بدون کپی هیچ فایلی البته روش پست اول را الان فقط می تونید با استفاده از v-p-n انجام بدید.
چرا در برنامه استفاده از کلید های صفحه کلید، کلید F2 کار نمی کند؟ یعنی با فشردنش عمل مربوطه انجام نمی شه ولی F1, F3,F4 و بقیه مشکلی ندارند؟
مطمئنید؟! ما که 3 تا بیشتر تعریف نکردیم f1 , f2 ,f3 منم تست کردم کار می کرد . فک کنم کلید هایه تابعی لپتاپتون برایه کار دیگه ایی تنظیم شده یا یک برنامه روش عمل می کنه
سلام
دوستان من میخوام یه برنامهمه بنویسم که با اسفاده از الگوریتم 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;
}
کد 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);
}
}
خوب شما کد الگوریتم رو دارید فقط باید ازش استفاده کنید یعنی مختصات نقاط سازنده حرف اول و دوم رو پیدا کنید و با مختصات زیر جایگزین کنید
// 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);
دیگه بقیه کار ها رو خودش انجام میده البته اگر درست متوجه شده باشم.
ببخشید میشه بصورت برنامه از اول با #include ها و بقیه چیزایی که واسه اجرا نیازه واسم بگذازید نمیدونم چطوری run کنم
اگه امکانش هست کمکم کنید.
خیلییییی مممنووووووون
هیچ جا opengl بلد نیستن .واقعا جای افتخار داره که یه فروم فعال اینجا دارین
بازم تشکر
اینجا دسور tween که اجراش مشکل نداره رو واستون گذاشتم
Point Tween(Point A, Point B, float t)
{
Point P;
P.x = A.x + (B.x - A.x)*t;
P.y= A.y + (B.y - A.y)*t;
return P;
}
من میخوام با استفاده از این اکد یه حرف الفبا رو به یه حرف دیگه تبدیل کنم.
مثلا تبدیل توی عکس پایین رو ببینید
کل مطلبی که من در این رابطه دارم از کتاب گرافیک کامپیوتری هست
متن این قسمت رو هم واستون میذارم
Tweening and lerp
One often wants to compute the point P(t) that is fraction t of the way along the straight line from point A to point B [the tween (for in-between) at t of points A and B].
Each component of the resulting point is formed as the lerp() of the corresponding components of A and B.
A procedure Tween (Point2 A, Point2 B, float t) implements tweening for points A and B, where we have used the new data type Point2 for a 2D point:
struct Point2
{ float x; float y; };
Tweening takes 2 polylines and interpolates between them (using lerp) to make one turn into another (or vice versa).
We are finding here the point P(t) that is a fraction t of the way along the straight line (not drawn) from point A to point B.
To start, it is easiest if you use 2 polylines with the same number of lines.
We use polylines A and B, each with n points numbered 0, 1, …, n-1.
We form the points Pi (t) = (1-t)Ai + tBi, for t = 0.0, 0.1, …, 1.0 (or any other set of t in [0, 1]), and draw the polyline for Pi.
Code for Tween
void drawTween(Point2 A[ ], Point2 B[ ], int n, float t)
{ // draw the tween at time t between polylines A and B
for (int i = 0; i < n; i++)
{ Point2 P;
P = Tween (A[i], B[i], t);
if (i ==0) moveTo(P.x, P.y);
else lineTo(P.x, P.y);
}
}
To allow drawing tweens continuously, use the code below with double buffers.
for (t = 0.0, delT = 0.1; ; t += delT;) {
//clear the buffer
drawTween (A, B, n, t);
glutSwapBuffers();
if ((t<=0.0) || (t>=1.0)) delT = -delT;
}
آخرین ویرایش به وسیله saturn2200 : سه شنبه 09 خرداد 1391 در 23:25 عصر
من منظور شما رو در همون پست اول درست فهمیده بودم شما همون کار رو انجام بدید که گفتم نتیجه می گیرید
برای اجرا هم می تونید از این برنامه و آموزشش استفاده کنید http://s3.picofile.com/file/7394041826/dev.zip.html
سلام دوستان من در کار کردن با اوپن جی ال تازه کارم
الان میخوام برای پایان ترم یک پروژه درست کنم اما به مشکل برخوردم
کسی میتونه یک تابع بنویسه که مختصات x,y دو نقطه رو از کاربر دریافت کنه و براش یک خط رسم کنه
نحوه ی فراخوانی توابعی که ورودی دارن در داخل تابع main چطور هست؟
ممنون میشم اگر کمک کنید
سلام بازم شرمنده
من اجرای برنامه رو بلدم.
این tween که منم میخوام یه مقدار فرق داره باید بصورت انیمیشن این کار انجام بشه
این نقاطی که روی عکس بالاست بصورت انیمیشن جابجا بشن روی نقاط متناظر .اینطوری حرف "ر" به حرف "ا" تبدیل میشه و یه فرم انیمیشن قشنگی هم داره.
این الگوریتم مثلا اگه دیده باشید توی فیلمها استفاده میشه .مثلا تصویر سفید برفی از زیبایی به زشتی و یا برعکس تبدیل میشه.
اگه بتونیم واسه یه polygon ساده اینکارو انجام بدیم واسه تصویرای پیچیده هم امکانش هست.
واسه راهنمایی تا همینجا هم خیلییی ممنون
خیلی کمکم کردین.
خوب عزیزم اینکه خیلی واضحه باید یک خطش رو حذف کنی این قطعه کد رو جایگزین کن جواب می گیری
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 را هر چی بیشتر کنی انیمیشنش لطیف تره :دی
ببنید شما باید بین glbegin دو تا نقطه مشخص کنید و پارامتر هاش رو از کاربر در یافت کنید.
https://barnamenevis.org/showthread.p...82#post1429482
خیلییییی مرسی واقعا ایول داره
من اینو نشون یه بچه ها امیر کبیر دادم نتونست درست کنه!!!
دیگه روم نمیشه سوال بپرسم
اما دلم نمیاد از اطلاعات شما استفاده نکنم.
اگه بخوام viewport ها رو حذف کنم امکانش هست؟چطوری میتونم اینکارو انجام بدم
و یه سوال مهمتر اگه بخوام شکل رو عوض کنم باید چیکار کنم؟
مثلا یه نیم دایره به یه مستطیل تبدیل بشه .باید چیکار کنم
آخرین ویرایش به وسیله saturn2200 : یک شنبه 14 خرداد 1391 در 00:01 صبح
خوب شاید دقت نکرده نیست ما صنعتی شریف تشریف داریم دقتمون بیشتره زبانم بدتر :دییییی
بله اگر حذف بشه glut از مقادیر پیش فرض خودش که سایز پنجره است استفاده می کنه توضیحاتش رو می تونید از این جا بخونید.
ببنید این شکل ها بسیله قطعه ی زیر ترسیم می شه :
glBegin (GL_LINES);
glVertex2f((GLfloat) CP.getX(), (GLfloat) CP.getY());
glVertex2f((GLfloat) p.getX(), (GLfloat) p.getY());
glEnd();
اینم که معلومه بین نقاط خط ترسیم می کنه که در این حالت به نظر من استفاده از روش های رسم قدیمی دایره مثل نقطه میانی است که شما باید با اون الگوریتم نقطه یابی کنید و نقاط رو به ماتریس اضافه کنید
Point2 A[10];
Point2 B[10];
حالا نیم دایره نقاط خیلی بیشتری داره که به نظرم 360 تا بگیرید قیافش به دایره شبیه تر می شه
خلاصه یک نقطه یابی ساده است . باید نقاط رو مشخص کنید بقیه کار ها هم به عهده الگوریتمه
نه دوست عزیز پروژه دانشجویی انجام نمی دیم ولی بازم باری اینکه متوجه بشی چی به چیه به این قطعه کد را جایگزین کن و نتیجه رو مشاهده کن
// 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;
}
منم کاملاً تفریحی اپن جی ال کار می کنم ...
سلام
مطالب open gl که گذاشتی مفیده فایده واقع شد
یه سوال:
من تمام مراحل اجرای برنامه opengl با C++ , C# رو به طور دقیق انجام دادم و وقتی که یه کد نمونه (تست شده در جای دیگه) رو هم اجرا می کنم هیچ خطایی نمیده ولی توی فرم هم چیزی نمیکشه به نظر شما مشکل کار من کجاست؟![]()
سلام ما در مورد اجرای برنامه در سی شارپ فقط چندتا فرم ورک برای پیاده سازی معرفی کردیم نه بیشتر !! ولی ممکنه مشکل شما اینجا باشه که در سیستم های 64 بیتی باید glut32.dll را در پوشه syswow64 کپی کنید.
به هر حال این فیلم آموزشی می تونه کمکتون کنه http://s3.picofile.com/file/7400251284/glut.zip.html
با سپاس و تشکر فراوان از amin عزیز
من تمام پیش نیاز ها رو انجام دادم و موقع اجرا هیچ خطایی نمیگیرم ، پنجره کنسول C باز میشه و بعدش هم پنجره open gl ولی داخل open gl شکل رو ترسیم نمیکنه و این فرم کلا به صورت ترنسپارنت هست و وقتی که سایزشو تغییر میدم مشکی میشه، از صفحه نمایشم عکس گرفتم تا بیشتر در جریان قرار بگیری، خودم احتمال میدم تنظیمات گرافیکی سیستمم باشه و تمام سوراخ سمبه های win7 رو کاوش کردم ولی بی فایده، اگه راه حلی به نظرت میرسه بگی ممنون میشم.
بازم ممنون به خاطر فیلمی که گذاشتی و اینکه همیشه در دسترس و به فکر هستی ...
http://up98.org/upload/server1/02/j/...u439mvwc5b.png
این مشکل دلایل متعددی داره که خیلی هاش مربوط به تنظیمات اشتباه توابع اولیه و گاهی هم مربوط تداخل گرافیک gdi ویندوز با wgl می شه که فکر نکنم ربطی به ما داشته باشه در آخر می رسیم به یک باگ glut که اگر این باگ باشه با یک بافر مشکل دارید و باید با دو بافر تست کنید ببنید کد زیر درست کار میده یا نه :
//lines.cpp
//---------
//Draw lines with OpenGL + GLUT
//Compiler DevC++ 4.9.9.2 + GLUT3.7 (Win32)
#pragma comment(lib,"opengl32.lib")
#pragma comment(lib,"glu32.lib")
#pragma comment(lib,"glut32.lib")
#include <windows.h>
#include <GL/glut.h>
void init(void)
{
glClearColor(1.0,1.0,1.0,0.0); //display window set to white
glMatrixMode(GL_PROJECTION); //projection parameters
gluOrtho2D(0.0,200.0,0.0,150.0); //sets up WC extent
}
void lineSegments(void)
{
glClear(GL_COLOR_BUFFER_BIT); //clears display window
glColor3f(0.0, 0.0, 1.0); //line colour set to blue
glBegin(GL_LINES);
glVertex2i(180,15); glVertex2i(10,145); //line seg1
glVertex2i(145,10); glVertex2i(15,180); //line seg2
glEnd();
glutSwapBuffers();
glFlush(); //process all OGL functions immediately
}
int main(int argc, char** argv)
{
glutInit(&argc, argv); //initialise GLUT
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); //sets display mode
glutInitWindowPosition(50, 100); //top left display window pos
glutInitWindowSize(400, 300); //display win width and height in pixel coords
glutCreateWindow("Example01 - lines"); //now create display win
init(); //run initilization procs
glutDisplayFunc(lineSegments); //call drawing func
glutMainLoop(); //display all and wait
return 0;
}
نه متاسفانه![]()
آقا ایول واقعا نمیدونم چطوری تشکر کنم
خوب اینطوری بهتر شد تازه یاد گرفتم چطوری شکل رو عوض کنم
مرسیییییییییییییییییییییی ییییییییییییییییییییییییی ییییییییییییییییییییییییی ییییییییییییییییییی
داشتم از زندگی نا امید میشدما
هنوزم آدمای با گذشت و باحالی تو این دنیا هست
من اولش فکر میکردم که مثلا A[0].set(0.2, 0.2) یه خط رسم میکنه بین دو تا نقطه به این مختصات حالا فهمیدم که نه آقا اینا همش نقطه بوده که در آخر به هم وصل شده حالا دیگه هر شکلی رو میتونم بکشم![]()
می تونی نتیجه دستور زیر را بهم بگی :
#include <iostream>
using namespace std;
.
.
.
cout << "OpenGL Version : " << glGetString(GL_VERSION) << endl;
glutMainLoop(); //display all and wait
.
.
اگر ورژن openGL کارت گرافیکت بیشتر از 3 باشه فکر نکنم راهی داشته باشه باید باید یکجور دیگه کد بنویسیم :دیییییی
سلام من پنجره open gl رو به حالت FULLScreen بردم و مشکلم حل شد، فقط تو این حالت شکل رو ترسیم میکنه
بازم تشکر![]()
@poniosa:
اگر از glut استفاده ميكني تابع idle رو ثبت نكردي يا اينكه بافر رو تعويض نمي كني.
چه ربطي داره. مال من 4.2 هست راحت دارم با ورژن 1.2 كار ميكنم.اگر ورژن openGL کارت گرافیکت بیشتر از 3 باشه فکر نکنم راهی داشته باشه باید باید یکجور دیگه کد بنویسیم :دیییییی
والا من بیشتر از 3 رو خودم تست نکردم فقط روی حساب پستی که خود شما یکبار زده بودی این رو گفتم!!!
به هر حال آخرش بر می گرده به همون باگی که لینکش رو دادم. موفق باشید!!!OpenGL و آینده:
به طور کل میشه گفتش که ما در آینده شاهد حذف بسیاری از دستورهای پیشین OpenGL خواهیم بود. (یا حداقل از کار افتادن اونها) که توی OpenGL 3.x به راحتی مشاهده میشد که یکی از پرکاربردترین دستورها یعنی glBegin کار نمی کرد. (مگر با فراهم کردن شرایط خاص و غیر استاندارد) اما حالا OpenGL تمام تمرکز خودش رو گذاشته روی دستورها و الحاقی هایی که باعث ارتباط بهتر و کاملتر با قسمت های قابل برنامه ریزی gpu هستش.
خب درسته كه دستورها حذف شدن. اما هنوز از دستورهاي پيشين پشتيباني ميشن. توي ويرايشهاي جديد OpenGL شما مي تونيد ويرايشي رو كه مي خواهيد استفاده كنيد رو مشخص كنيد. اينكار با مشخص كردن عدد minor و major ويرايش در هنگام ساخته شدن محتوا انجام مي گيره و يه كار اتوماتيك نيست كه خودش اون رو انجام بده. حالا بسته به ويرايشي كه انتخاب مي كنيد قابليتهاي قبلي رو حذف و قابليتهاي جديد رو اضافه ميكنه.
حتي تعداد از دستورهاي حذف شده هنوز هم توي ويرايشهاي جديد قابل استفاده هستند. اما استفاده از اونها پيشنهاد نميشه و پشتيباني از اونها به شدت به ويرايش درايور بستگي داره. مثلا VBO توي داريورهاي قديمي OpenGL 3 جواب ميداد اما توي ويرايشهاي جديد ديگه امكانش نيست. بهترين راه چك كردن پرفرمانس برنامه اينجور موارد استفاده از برنامه gDEBUGer هست. كه تمام اين موارد رو بهتون گزارش ميكه. خود من هم از طريق اين برنامه متوجه قضيه VBO شدم.
مورد ديگه در مورد GLUT هست كه glut به كمك glew (يا لود كردن دستي الحاقيها) ماكزيمم تا OpenGL 2.1 ساپورت ميده و براي وياريشهاي حداقل بالاتر بايد بريد سراغ SDL و يا اينكه از API خود سيستم عامل كمك بگيريد.
من هنوز هم حرفهاي خودم رو تاييد ميكنم. اين اتفاق مرتبا داره مي افته. در حقيقت ويرايشهاي جديد OpenGL سراغ نو آوري و ارتباط موثر هستند نه يك راه ساده براي كار. API به شدت و به سرعت داره تغيير ميكنه. در حقيقت الان هر دو تا API دايركت و OpenGL مثل هم عمل مي كنند و شما خيلي راحت امكان سوئيچ بين اونها رو داريد (برخلاف گذشته) و موارد خيلي كمي رو پيدا مي كنيد كه در اونها اختلاف داشته باشند. بيشترين دليل اين قضيه هم اينه كه OpenGL توي سالهاي اخير با معرفي سيستم ها و پلتفرمهاي جديد بشدت تجاري شده و برخلاف گذشته، حالا مثل دايركت بيشتر توجهش بجاي اينكه روي مسائل بنيادي گرافيك باشه روي نيازهاي بازار است.
دمت گرم پسر خیلی باحالی![]()
ولی خوب قسمت اولش رو نمی دونستم ...
در مورد 3 تابع زیر توضیحی مختصر می خواستم یک مقدار روی تعریفه خودم شک دارم :
glEnable(GL_DEPTH_TEST)
glFrontFace(GL_CCW)
glEnable(GL_CULL_FACE)
تعریف خودم به ترتیب : اجسام پشت شی مورد نظر دیده نشود - برای تشخیص رو و پشت بودن جسم کاربرد دارد - تو و داخل جسم را حساب نکن
سوال دوم اینه که صدا گذاری در opengl با استفاده از fmod هست ؛ غیر از fmod هم داریم اسمش چی بود ؟
آخرین ویرایش به وسیله soroushp : پنج شنبه 25 خرداد 1391 در 22:18 عصر
کاملا اشتباه. درسته یکی از کاربردهای بافر عمق (یعنی بیشترین کاربردش اینه) اما کلا برداشتت اشتباه هست. پیشنهاد میکنم یه کتاب OpenGL بخوناجسام پشت شی مورد نظر دیده نشود
باز هم کاملا اشتباه هست. هر رویه با توجه به ساعتگرد بودن و مخالف ساعتگرد بودن اون و با توجه به اینکه ضخامت صفر هم داره ، باز هم دارای یک رویه جلو و عقب هست. از اونجا که توی بیشتر موارد رویه های پشتی دیده نمیشن. میشه به OpenGL دستور داد که از پردازش بیخوده اونها جلوگیری کنه که کارها سریعتر پیش بره.برای تشخیص رو و پشت بودن جسم کاربرد دارد - تو و داخل جسم را حساب نکن
کلا OpenGL و گرافیک کامپیوتری سختر از این هست که بخوای با استباط خودت (برخلاق زبونهای C# و Visual basic و...) جلو بری. قبل از هر چیز باید و اما باید یه دید دقیق ریاضی و تئوری نسبت به این مسائل داشته باشی. وگرنه همش درجا میزنی. کتابهای زیادی برای معرفی دقیق OpenGL وگرافیک کامپیوتری وجود داره و من بشدت پیشنهاد می کنم اونها رو مطالعه کنی. یکسری از اونها رو میتونی توی لینک زیر پیدا کنی:
http://opengl.persiangig.com/page.html
این موضوع اصلا ربطی به OpenGL نداره.سوال دوم اینه که صدا گذاری در opengl با استفاده از fmod هست
؛ غیر از fmod هم داریم اسمش چی بود
- API سیستم عامل
- Bass
- ّOpenAL
- ...
سلام
دوستان من تازه کارم. اگه سوالام ابتدایی بود ببخشید
من بالاخره موفق شدم یک مکعب سه بعدی درست کنم
بعد با روتیت هم تونستم بچرخونمش. حالا هم یک منبع نور بهش اضافه کردم ولی باهاش یه چندتایی مشکل دارم!
اول اینکه وقتی روتیت میکنم به نظرم خود شکل نمیچرخه بلکه دوربین داره میچرخه ، چون مثلا شدت نور اگر گوشه بالا سمت راست زیاده ، وقتی که میچرخه شدت نور مثلا میاد پایین سمت راست شکل ،درحالی که منبع باید همون بالا باشه و شکل بچرخه!
بعد هم اینکه موقع طراحی ، من هر ضلعی از مکعبو یه رنگی دادم مثلا یک ضلعش آبی یک ضلعش قرمز و... اما وقتی که منبع نور میزارم باید براش سه تا رنگ تعریف کنم در حالی که من میخوام همون رنگ خودش باشه و نور روش قرار بگیره مثل اون مثالی که توی صفحه اول یا دوم زدین که یک توپ فوتبال روش نور افتاده
امیدوارم خوب توضیح داده باشم
با تشکر فراوان![]()
توي OpenGL با glRotate منابع نور هم ميچرخن. بايد از push و pop استفاده كني و هر شكل رو به صورت مجزا بچرخوني.اول اینکه وقتی روتیت میکنم به نظرم خود شکل نمیچرخه بلکه دوربین داره میچرخه ، چون مثلا شدت نور اگر گوشه بالا سمت راست زیاده ، وقتی که میچرخه شدت نور مثلا میاد پایین سمت راست شکل ،درحالی که منبع باید همون بالا باشه و شکل بچرخه!
خب. اين سه تا رنگ (diffuse و ambient و specular) رو بترتيب به سفيد و خاكستري تيره و سفيد ست كن. و يا مي توني براي اينكه اجسام از رنگ خودشون به عنوان متريال استفاده كنند از دستور زير توي مقدار دهي اوليه برنامت استفاده كني:بعد هم اینکه موقع طراحی ، من هر ضلعی از مکعبو یه رنگی دادم مثلا یک ضلعش آبی یک ضلعش قرمز و... اما وقتی که منبع نور میزارم باید براش سه تا رنگ تعریف کنم در حالی که من میخوام همون رنگ خودش باشه و نور روش قرار بگیره مثل اون مثالی که توی صفحه اول یا دوم زدین که یک توپ فوتبال روش نور افتاده
glEnable(GL_COLOR_MATERIAL);
لينك زير يه مقاله خيلي خوب در مورد نورها در OpenGL هست كه ميتونه بهت كمك زيادي بكنه:
http://www.falloutsoftware.com/tutorials/gl/gl8.htm
سلام بزرگواران
راستش من یک مشکلی پیدا کرده بودم
من با گرافیک دو بعدی اوپن جی ال کار میکنم و برای یک پروژه نیاز به کارهای ابتدایی با اون دارم
من میخوام یک صفحه ی متحرک ایجاد کنم.. هرکدوم از اشکال این صفحه که مثلا شامل یک ماشین و خونه و ... میشه رو توسط یک سری توابع پیاده سازی کردم
مثلا یک مستطیل رسم میکنم، بعد مربع روش میکشم، و بعد دایره روی این مربع رسم میکنم و به همین ترتیب تا کل صفحه رو رسم کنم
اما متاسفانه در همون قدم های اول چند تابع اول رو معمولا خوب انجام میده... اما وقتی به توابعی که در خط های بعد فراخوانی کردم میرسه، بعضیاشون رو رسم نمیکنه
گاهی هم مثلا نصفه نیمه رسمش میکنه...
مشکلم چطور حل میشه؟
این رو هم بگم من برای کشیدن دایره و مربع از نقطه استفاده میکنم ( و از توابع خود اوپن جی ال استفاده نمیکنم، مثلا برای مربع توپر از تعدادی خط موازی استفاده میکنم)
آیا نیاز هست که کد هایی که نوشتم رو اینجا بیارم؟
خواهش میکنم راهنمایی کنید خیلی کارم گیره... من خیلی چیزا در این تاپیک یاد گرفتم
ازتون ممنونم
آخرین ویرایش به وسیله majnoon110 : شنبه 03 تیر 1391 در 22:20 عصر