صفحه 6 از 10 اولاول ... 45678 ... آخرآخر
نمایش نتایج 201 تا 240 از 376

نام تاپیک: آموزش OpenGL

  1. #201

    نقل قول: آموزش OpenGL

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

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

  2. #202

    نقل قول: آموزش OpenGL

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

  3. #203

    نقل قول: آموزش OpenGL

    منظورت از بافر عمق چیه؟ چطوری باید غیر فعالش کنم؟ مشکلی پیش نمیاد؟
    توي بافر فريم چندتا بافر وجود داره كه از جمله اونها ميشه به بافر رنگ ( هموني كه رنگ فرگمنتها رو نگه ميداره). بافر عمق، استنثيل ، تجمع و ... اشاره كرد.

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

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

    glutInitDisplayMode( GLUT_RGBA | GLUT_DOUBLE  );


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

    glDisable(GL_DEPTH_TEST_)


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

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

  4. #204

    نقل قول: آموزش OpenGL

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

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

  5. #205

    نقل قول: آموزش OpenGL

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

  6. #206

    نقل قول: آموزش OpenGL

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

  7. #207

    نقل قول: آموزش OpenGL

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

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

  8. #208

    نقل قول: آموزش OpenGL

    salam be hameye soale kheyli sade daram
    man ye barname neveshtam
    hich errori ham nemide
    ejra ham mishe
    ama khoroji ha ro neshoon nemide
    doostan age mishe lotf konid bebinid moshkelesh kojaaast

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



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

    Point2 CP;

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

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

    void setBackgroundColor(float r, float g, float b)
    {
    glClearColor(r, g, b, 0.0);
    }

    void setColor(float r, float g, float b)
    {
    glColor3f(r, g, b);
    }

    void lineTo(Point2 p)
    {
    glBegin (GL_LINES);
    glVertex2f((GLfloat) CP.getX(), (GLfloat) CP.getY());
    glVertex2f((GLfloat) p.getX(), (GLfloat) p.getY());
    glEnd();
    CP.set(p.getX(), p.getY());
    glFlush();
    }



    void lineTo(float x, float y)
    {
    glBegin(GL_LINES);
    glVertex2f((GLfloat) CP.getX(), (GLfloat) CP.getY());
    glVertex2f((GLfloat) x, (GLfloat) y);
    glEnd();
    CP.set (x, y);
    glFlush();
    }

    Point2 Tween(Point2 A, Point2 B, float t)
    {
    Point2 P;
    P.set(A.getX() + (B.getX() - A.getX())*t, A.getY() + (B.getY() - A.getY())*t);
    return P;
    }

    void drawTween(Point2 A[], Point2 B[], int N, float t)
    {
    for(int i = 0; i < N; i++)
    {
    Point2 P;
    P = Tween(A[i], B[i], t);
    if (i == 0) moveTo(P.getX(), P.getY());
    else lineTo(P.getX(), P.getY());
    }
    }


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

    clearScreen();
    Point2 A[10];
    Point2 B[10];
    A[0].set(0.2, 0.5);
    A[1].set(0.5, 0.35);
    A[2].set(0.8, 0.5);
    A[3].set(0.5, 0.2);
    A[4].set(0.2, 0.5);


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

    drawTween(A, B, 5, t);
    t = t + tinc;
    }
    }


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


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




    glutDisplayFunc(myDisplay);
    glutMainLoop();

    return 0;
    }









  9. #209
    کاربر دائمی آواتار amin1softco
    تاریخ عضویت
    شهریور 1386
    محل زندگی
    پای آن سرو بلند
    پست
    1,832

    نقل قول: آموزش OpenGL

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

  10. #210

    نقل قول: آموزش OpenGL

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

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

    using namespace std;



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


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

    Point2 CP;

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

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




    void lineTo(float x, float y)
    {
    glBegin(GL_LINES);
    glVertex2f(CP.x, CP.y);
    glVertex2f(x,y);
    glEnd();
    CP.x=x;
    CP.y=y;
    glFlush();
    }

    Point2 Tween(Point2 A, Point2 B, float t)
    {
    Point2 P;


    P.x=(A.x+(B.x-A.x)*t);
    P.y=(A.y+(B.y+A.y)*t);
    return P;
    }

    void drawTween(Point2 A[], Point2 B[], int N, float t)
    {
    for(int i = 0; i < N; i++)
    {
    Point2 P;
    P = Tween(A[i], B[i], t);
    if (i == 0) moveTo(P.x, P.y);
    else lineTo(P.x, P.y);

    }
    // ****************************************
    clearScreen();
    Sleep(200);
    // ****************************************
    }



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

    }

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



    clearScreen();

    Point2 A[20];
    Point2 B[20];


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


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


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














    float t = 0.0;
    int N = 10;
    float tinc = 1.0/N;
    for (int i = 0; i <= N; i++)
    {

    drawTween(A, B, 5, t);
    t = t + tinc;
    }
    }


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

    glutInit(&argc, argv);
    glClearColor(1.0, 1.0, 1.0, 0.0);
    glColor3f(0.0, 0.0, 0.0);


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

    glutCreateWindow("nike");
    glShadeModel(GL_FLAT);
    glutDisplayFunc(myDisplay);
    glutMainLoop();

    return 0;
    }


  11. #211

    نقل قول: آموزش OpenGL

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

  12. #212

    نقل قول: آموزش OpenGL

    ye soal daram man nazdike 30 ta noghte dadam k rasm beshe ama rasm nemishe ki midone moshkel chie lotfan komakam konid
    A[0].set(0.1, 0.3);
    A[1].set(0.1, 0.6);
    A[2].set(0.2, 0.6);
    A[3].set(0.2, 0.3);
    A[4].set(0.4, 0.2);

    A[5].set(0.6, 0.3);
    A[6].set(0.6, 0.6);
    A[7].set(0.9, 0.6);
    A[8].set(0.9, 0.8);
    A[9].set(1.0, 0.8);

    A[10].set(1.0, 0.7);
    A[11].set(1.1, 0.7);
    A[12].set(1.1, 0.8);
    A[13].set(1.2, 0.8);
    A[14].set(1.2, 0.7);

    A[15].set(1.3, 0.7);
    A[16].set(1.3, 0.8);
    A[17].set(1.4, 0.8);
    A[18].set(1.4, 0.6);
    A[19].set(1.9, 0.6);

    A[20].set(1.9, 0.8);
    A[21].set(1.7, 0.8);
    A[22].set(1.7, 0.7);
    A[23].set(1.6, 0.7);
    A[24].set(1.6, 0.9);
    A[25].set(2.0, 0.9);
    A[26].set(2.0, 0.5);
    A[27].set(2.4, 0.5);
    A[28].set(2.4, 0.3);
    A[29].set(2.2, 0.3);

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

  13. #213
    کاربر دائمی آواتار amin1softco
    تاریخ عضویت
    شهریور 1386
    محل زندگی
    پای آن سرو بلند
    پست
    1,832

    نقل قول: آموزش OpenGL

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

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

    glTranslatef ( -0.5 , -1.5 , -0.2 ) ;

    .
    .
    .

  14. #214

    نقل قول: آموزش OpenGL

    نقل قول نوشته شده توسط pswin.pooya مشاهده تاپیک
    توي OpenGL با glRotate منابع نور هم ميچرخن. بايد از push و pop استفاده كني و هر شكل رو به صورت مجزا بچرخوني.

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

     glEnable(GL_COLOR_MATERIAL);


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

    http://www.falloutsoftware.com/tutorials/gl/gl8.htm
    اول تشکر
    بعد هم اینکه تونستم با راهنمایی شما نورو بندازم بدون اینکه رنگ اصلی از بین بره

    ولی در رابطه با push و pop مشکل دارم . آخه من 1 مکعب با شش تا فرمان polygon درست کردم. میشه یه مقدار بیشتر راهنمایی کنی. این تیکه رسم معکبمه:
    void display(){
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
    glPolygonMode(GL_BACK, GL_FILL);
    glEnable(GL_DEPTH_TEST);
    Rotatedecide();

    glBegin(GL_POLYGON);
    glColor3f(0.2,0.0,0.0);
    glVertex3f(-0.3,-0.3,-0.3);
    glVertex3f(0.3,-0.3,-0.3);
    glVertex3f(0.3,0.3,-0.3);
    glVertex3f(-0.3,0.3,-0.3);
    glEnd();
    glBegin(GL_POLYGON);
    glColor3f(0.8,0.1,0.1);
    glVertex3f(-0.3,-0.3,-0.3);
    glVertex3f(-0.3,-0.3,0.3);
    glVertex3f(-0.3,0.3,0.3);
    glVertex3f(-0.3,0.3,-0.3);
    glEnd();
    glBegin(GL_POLYGON);
    glColor3f(2.0,1.0,0.7);
    glVertex3f(-0.3,-0.3,-0.3);
    glVertex3f(-0.3,-0.3,0.3);
    glVertex3f(0.3,-0.3,0.3);
    glVertex3f(0.3,-0.3,-0.3);
    glEnd();
    glBegin(GL_POLYGON);
    glColor3f(0.0,0.0,2.0);
    glVertex3f(0.3,-0.3,-0.3);
    glVertex3f(0.3,-0.3,0.3);
    glVertex3f(0.3,0.3,0.3);
    glVertex3f(0.3,0.3,-0.3);
    glEnd();
    glBegin(GL_POLYGON);
    glColor3f(2.0,0.0,0.0);
    glVertex3f(-0.3,0.3,-0.3);
    glVertex3f(-0.3,0.3,0.3);
    glVertex3f(0.3,0.3,0.3);
    glVertex3f(0.3,0.3,-0.3);
    glEnd();
    glBegin(GL_POLYGON);
    glColor3f(1.0,1.0,0.89);
    glVertex3f(-0.3,-0.3,0.3);
    glVertex3f(0.3,-0.3,0.3);
    glVertex3f(0.3,0.3,0.3);
    glVertex3f(-0.3,0.3,0.3);
    glEnd();


    glFlush();


    }


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

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

  15. #215

    نقل قول: آموزش OpenGL

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

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

    glTranslatef ( -0.5 , -1.5 , -0.2 ) ;

    .
    .
    .
    ahaaaaaaaaaan bale alan fahmidam mersiiiiiiiiiiiiiii

    baba ma taze karim
    gharare badan ha mohanes beshim

  16. #216

    نقل قول: آموزش OpenGL

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

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

  17. #217
    کاربر دائمی آواتار amin1softco
    تاریخ عضویت
    شهریور 1386
    محل زندگی
    پای آن سرو بلند
    پست
    1,832

    نقل قول: آموزش OpenGL

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

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

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


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


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

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

  18. #218

    نقل قول: آموزش OpenGL

    سلام

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

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

  19. #219
    کاربر جدید
    تاریخ عضویت
    خرداد 1391
    محل زندگی
    تهران_شهرستان بهارستان
    پست
    17

    نقل قول: آموزش OpenGL

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

  20. #220
    کاربر جدید
    تاریخ عضویت
    خرداد 1391
    محل زندگی
    تهران_شهرستان بهارستان
    پست
    17

    نقل قول: آموزش open-gl

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

  21. #221

    نقل قول: آموزش OpenGL

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

  22. #222
    کاربر دائمی آواتار amin1softco
    تاریخ عضویت
    شهریور 1386
    محل زندگی
    پای آن سرو بلند
    پست
    1,832

    نقل قول: آموزش open-gl

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

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

  23. #223

    نقل قول: آموزش OpenGL

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

    );

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

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

  24. #224

    نقل قول: آموزش OpenGL

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

  25. #225

    نقل قول: آموزش OpenGL

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

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

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

  26. #226
    کاربر دائمی آواتار amin1softco
    تاریخ عضویت
    شهریور 1386
    محل زندگی
    پای آن سرو بلند
    پست
    1,832

    نقل قول: آموزش OpenGL

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

  27. #227
    کاربر جدید
    تاریخ عضویت
    خرداد 1391
    محل زندگی
    تهران_شهرستان بهارستان
    پست
    17

    نقل قول: آموزش OpenGL

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

  28. #228
    کاربر دائمی آواتار amin1softco
    تاریخ عضویت
    شهریور 1386
    محل زندگی
    پای آن سرو بلند
    پست
    1,832

    نقل قول: آموزش OpenGL

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

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

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

    static double s_line_length = 0.5;

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

    glEnd();
    glFlush();
    }

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

    }

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

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

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

    }

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

    glutMainLoop();
    }


  29. #229
    کاربر جدید
    تاریخ عضویت
    خرداد 1391
    محل زندگی
    تهران_شهرستان بهارستان
    پست
    17

    نقل قول: آموزش OpenGL

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

  30. #230
    کاربر دائمی آواتار amin1softco
    تاریخ عضویت
    شهریور 1386
    محل زندگی
    پای آن سرو بلند
    پست
    1,832

    نقل قول: آموزش OpenGL

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

    #include <stdio.h>
    #include <stdlib.h>
    #include <GL/gl.h>
    #include <GL/glut.h>
    static double s_line_length = 0.5;
    bool f=true; //تعریف یک متغیر سراسری
    void display_function(void)
    {
    glClear(GL_COLOR_BUFFER_BIT);
    glColor3f(0.0 ,1.0,0.0);
    glBegin (GL_LINES);
    glVertex3f (0.0 ,s_line_length , 0.0);
    glVertex3f (s_line_length, 0.0 ,0.0);
    glColor3f(0.0,0.0,1.0);
    glVertex3f( 0.0 , -s_line_length , 0.0);
    glVertex3f(-s_line_length , 0.0 , 0.0);

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

    if (flag )
    {
    s_line_length += 0.1;
    count++;
    }
    else
    {
    s_line_length -= 0.1;
    count--;
    }
    glutPostRedisplay();

    if(f)//شرط برای چک کردن اجرای مجدد تایمر
    glutTimerFunc( 200,timer_function , 0);
    }

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

    }
    void keyboard_function( unsigned char ch , int x , int y)
    {
    //&nbsp;&nbsp; &nbsp;exit (0);
    if (ch=='p'){
    f=(f)?false:true;
    glutTimerFunc( 200,timer_function , 0);
    }


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

    glutMainLoop();
    }


  31. #231
    کاربر جدید
    تاریخ عضویت
    خرداد 1391
    محل زندگی
    تهران_شهرستان بهارستان
    پست
    17

    نقل قول: آموزش OpenGL

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

  32. #232
    کاربر جدید
    تاریخ عضویت
    خرداد 1391
    محل زندگی
    تهران_شهرستان بهارستان
    پست
    17

    نقل قول: آموزش OpenGL

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

  33. #233
    کاربر دائمی آواتار amin1softco
    تاریخ عضویت
    شهریور 1386
    محل زندگی
    پای آن سرو بلند
    پست
    1,832

    نقل قول: آموزش OpenGL

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

    استفاده کنید.

  34. #234
    کاربر جدید
    تاریخ عضویت
    خرداد 1391
    محل زندگی
    تهران_شهرستان بهارستان
    پست
    17

    نقل قول: آموزش OpenGL

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

  35. #235
    کاربر دائمی آواتار amin1softco
    تاریخ عضویت
    شهریور 1386
    محل زندگی
    پای آن سرو بلند
    پست
    1,832

    نقل قول: آموزش OpenGL

    نقل قول نوشته شده توسط mjshaman مشاهده تاپیک
    عزیزجان، میشه یکم بیشتر توضیح بدی که باید دقیقا چطوری و کجا و با چه مقادیر ورودی با glutInitDisplayMode(GLUT_DOUBLE |GLUT_RGB); کار کنیم
    مرسی
    ببین بهتره یک کتابی چیزی مطالعه کنید .
    اونم که جزو مقادیر اولیه است که حکم سازنده را برای GLUT داره و فقط همین خط را باید جایگزین کنید کار خاصی نباید انجام بدید برای اینکه متوجه صحبت هام بشید یک سورس خیلی ساده را ضمیمه کردم که fps را هم محاسبه می کنه و با یک عکس یک انیمیشن خیلی ساده ایجاد کرده امید وارم مفید واقع بشه...
    فایل های ضمیمه فایل های ضمیمه
    • نوع فایل: zip fps.zip‏ (80.0 کیلوبایت, 49 دیدار)

  36. #236
    کاربر جدید
    تاریخ عضویت
    خرداد 1391
    محل زندگی
    تهران_شهرستان بهارستان
    پست
    17

    نقل قول: آموزش OpenGL

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

  37. #237
    کاربر دائمی آواتار amin1softco
    تاریخ عضویت
    شهریور 1386
    محل زندگی
    پای آن سرو بلند
    پست
    1,832

    نقل قول: آموزش OpenGL

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

    if (time - timebase > 1000) {//این تابع زمان کلی اجرا را از مقدار تایم بیس کم می کنه اگر 1000 معادل 1 ثانیه شد باید این شرط اجرا بشه
    fps = float(frame*1000.0/(time-timebase));//این تابع میگه فرم در ثانیه برابر با فرم هایی که شمارش شده تا رسیدن به شرط تقسیم برای دقت بیشتر است چون حدوداً برابر 1 می شه
    timebase = time;//مقدار تایم بیس را با مقدار قبلی جایگزین می کنه برای یک ثانیه بعدی
    frame = 0;//مقدار فرم هم صفر می شود
    }
    .
    .
    .}

  38. #238

    نقل قول: آموزش OpenGL

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

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

  39. #239

    نقل قول: آموزش OpenGL

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

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


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

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

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

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

  40. #240
    کاربر دائمی آواتار amin1softco
    تاریخ عضویت
    شهریور 1386
    محل زندگی
    پای آن سرو بلند
    پست
    1,832

    نقل قول: آموزش OpenGL

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

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

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

صفحه 6 از 10 اولاول ... 45678 ... آخرآخر

برچسب های این تاپیک

قوانین ایجاد تاپیک در تالار

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