簡體   English   中英

繪制動畫的OpenGL場景

[英]draw in animated opengl scene

單擊鼠標按鈕時,在動畫場景中繪制煙火效果時出現問題。 為什么不畫圖?

我的代碼:

#include<GL/glut.h>  
struct Point {
GLint x;
GLint y;
};
Point p1, p2;

int ww=600,wh=400;  

int xi,yi,xf,yf,y1b,x1b,y2b,x2b;
float px, py, t; 
float x=0.,y=0.,x1=5.;


void update()
{
   x+=0.01;
   x1 -= 0.02;

   if (x>6)
   {
       x -= 6;
       x1 = 4;

   }
}

我在那里創建了一個根據貝塞爾曲線繪制煙花效果的函數。 如果我在靜態窗口上繪制,它將為Okey。

// Bezier curve firework
void bezier(int xi, int yi, int xf, int yf)
{

    // Coordinates for additional points of bezier curve
    x1b = xi + rand()%15;
    y1b = yi + rand()%5;
    x2b = xf + rand()%15;
    y2b = xf + rand()%5;

    calculate and draw the curves
    for (t=0.;t<=1.;t+=0.001)
    {
        px=(1-t)*(1-t)*(1-t)*xi+3*t*(1-t)*(1-t)*x1b+3*t*t*(1-t)*x2b+t*t*t*xf; 
        py=(1-t)*(1-t)*(1-t)*yi+3*t*(1-t)*(1-t)*y1b+3*t*t*(1-t)*y2b+t*t*t*yf;
        glPointSize(2);
        glBegin(GL_POINTS);
            //glColor3f(1,0,0);
            glVertex2d(px,py);
        glEnd();
        glFlush();
    }

}  


void initRendering()
{
    glEnable(GL_DEPTH_TEST);
}

void reshaped(int w , int h)
{
    glViewport(0,0,w,h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(45, (double)w/(double)h,1,200);
}

// If pressed ESC -> exit
void keyPressed(unsigned char k, int x, int y)
{
    if(k==27)
    {
        exit(0);
    }
}

然后,如果我按下鼠標按鈕,它應該調用上面的函數並繪制我需要的東西。 但是沒有(

// If pressed mouse button -> draw firework effect
void mousePressed(int button, int state, int x, int y)
{

    if (button == GLUT_LEFT_BUTTON && state == GLUT_UP)
    {


             xi=x;  
             yi=wh-y;  


             xf=x + 5.;  

             p1.x = xi; p1.y = yi;
             p2.x = xf; p2.y = yi;

             //drawLine(xi,yi,xf,yi);
             bezier(xi, yi,xf, yi);



    }
glutPostRedisplay();
}

在那里,我創建了動畫窗口。 兩朵雲在准波中移動。

// Display a two moving clouds and the earth
void display()
{
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);

    glMatrixMode(GL_MODELVIEW);

    glLoadIdentity();
    glPushMatrix();
    glTranslatef(x1,y,-5.0);
    glBegin(GL_POLYGON);

        glColor3f(1.,0.,0.5);

        glVertex3f(-1.,1.,-5.);
        glVertex3f(0.,2.,-5.);
        glVertex3f(-2.,2.,-5.);
        glVertex3f(1.,1.,-5.);

    glEnd();
    glPopMatrix();

    glPushMatrix();

    glTranslatef(x,y,-5.);

    glBegin(GL_POLYGON);

        glColor3f(0.,0.5,0.5);

        glVertex3f(1.,0.7,-5.);

        glVertex3f(1.5,1.0,-5.0);

        glVertex3f(0.7,1.5,-5.0);

        glVertex3f(0.0,2.0,-5.0);

        glVertex3f(-0.7,1.5,-5.0);

        glVertex3f(-1.4,1.6,-5.0);

        glVertex3f(-1.7,1.0,-5.0);

        glVertex3f(-1.5,0.7,-5.0);

        glVertex3f(-1.0,0.5,-5.0);

    glEnd();

    glPopMatrix();

    glBegin(GL_POLYGON);

        glColor3f(1.,1.,1.5);

        glVertex3f(-2.,-2.,-5.);
        glVertex3f(-2.0,-2.0,-5.0);
        glVertex3f(-1.0,-1.5,-5.0);
        //glVertex3f(0.0,0.0,-5.0);
        glVertex3f(2.0,-2.0,-5.0);
        glVertex3f(1.2,-1.5,-5.0);

    glEnd();

    update();

    glutSwapBuffers();



    glFlush();  

}

void myinit()  
{  
   glViewport(0,0,ww,wh);  
   glMatrixMode(GL_MODELVIEW);  
   glLoadIdentity();  
   gluOrtho2D(0.0,(GLdouble)ww,0.0,(GLdouble)wh);  
   glMatrixMode(GL_MODELVIEW);  
}  

int main(int argc,char **argv)
{
    // Initialization
    glutInit(&argc, argv);

    glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB|GLUT_DEPTH);

    glutInitWindowPosition(100,100);

    glutInitWindowSize(400,400);

    glutCreateWindow("Salute | Clouds");

    initRendering();



    // Registration

    glutDisplayFunc(display);

    glutIdleFunc(display);

    glutReshapeFunc(reshaped);

    // Handler of

    myinit();

    glutKeyboardFunc(keyPressed);
    glutMouseFunc(mousePressed);

    // Main Loop
    glutMainLoop();

    return(0);
 }

我認為問題如下:我試圖在更新的動畫窗口中繪制煙花。 每次我單擊屏幕時,它都會更新。 最后,什么也看不見。 實際上是一個問題:如何使glutMoseFunk函數在更新的窗口中向我致敬?

當您的場景以透視投影繪制時, bezier函數可與正交投影一起使用。 這意味着在調用bezier之前必須更改投影矩陣。

此外,在主循環中進行所有渲染( display功能)。 事件mousePressed僅應用於更改參數(設置xiyi ,...)。

顯示功能可能如下所示:

int ww=400, wh=400;

void display()
{
    // clear the frame buffer
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);

    // setup perspective projection
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(45, (double)ww/(double)wh,1,200);

    // set model view matrix (identity matrix)
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();  

    // draw scene
    .....

    // setup ortihgraphic projection
    glMatrixMode(GL_PROJECTION);  
    glLoadIdentity();  
    gluOrtho2D(0.0,(GLdouble)ww,0.0,(GLdouble)wh);

    bezier(xi, yi,xf, yi);
    update();

    glutSwapBuffers();
    glutPostRedisplay(); 
}

reshaped函數應設置視口並僅注意窗口大小:

void reshaped(int w , int h)
{
    ww = w;
    wh = h;
    glViewport(0, 0, ww, wh);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM