如何旋转这个 openGl 代码

发布于 2024-11-13 11:55:10 字数 805 浏览 4 评论 0原文

在这段代码中,我尝试绘制简单的奥林匹克环并旋转它...下面的工作正常,但我无法旋转环..帮助我解决这个问题...

void myReshape (int width, int height)
{
  glViewport (0, 0, width, height);    
  glMatrixMode (GL_PROJECTION);
  glLoadIdentity();
  gluOrtho2D (-5, 105, -5, 105);
  glMatrixMode (GL_MODELVIEW);
  glLoadIdentity ();
  glTranslatef (0.375, 0.375, 0.0);
}


int main (int argc, char **argv)
{
  glutInit(&argc, argv);
  glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB); 
  glutInitWindowPosition(100,100); 
  glutInitWindowSize(110*PIXEL_SIZE, 110*PIXEL_SIZE);
  glutCreateWindow ("Olymipc Rings  ||  rotation  "); 
  glClearColor(1.0, 1.0, 1.0, 0.0);  
  glPointSize(PIXEL_SIZE);          
  glShadeModel (GL_FLAT);       
  glutDisplayFunc(display);
  glutReshapeFunc(myReshape);
  glutMainLoop(); 
  return 0; 
}

in this code i'm try to draw simple olympic ring and rotate it... the below work fine but i can't rotate the rings.. help me to solve this problme...

void myReshape (int width, int height)
{
  glViewport (0, 0, width, height);    
  glMatrixMode (GL_PROJECTION);
  glLoadIdentity();
  gluOrtho2D (-5, 105, -5, 105);
  glMatrixMode (GL_MODELVIEW);
  glLoadIdentity ();
  glTranslatef (0.375, 0.375, 0.0);
}


int main (int argc, char **argv)
{
  glutInit(&argc, argv);
  glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB); 
  glutInitWindowPosition(100,100); 
  glutInitWindowSize(110*PIXEL_SIZE, 110*PIXEL_SIZE);
  glutCreateWindow ("Olymipc Rings  ||  rotation  "); 
  glClearColor(1.0, 1.0, 1.0, 0.0);  
  glPointSize(PIXEL_SIZE);          
  glShadeModel (GL_FLAT);       
  glutDisplayFunc(display);
  glutReshapeFunc(myReshape);
  glutMainLoop(); 
  return 0; 
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

飘落散花 2024-11-20 11:55:10

在绘制环之前使用 glRotatef(axis_x,axis_y,axis,z, angle) 函数。
如果你想继续旋转环,请始终在 main() 函数中使用 glutIdle(myidle) 并增加角度值,并使用 glutPostRedisplay()。
如果您不希望旋转影响其他绘图,请在环形绘图之前和之后使用 glPushMatrix() 和 glPopMatrix() 。
例如,如果您想绕 x 轴旋转环,您的代码将类似于

float angle=0;

void display (void) {

  glClear(GL_COLOR_BUFFER_BIT); 
  glBegin(GL_LINE_LOOP);
  glVertex2i(-1,-1);
  glVertex2i(100,-1);
  glVertex2i(100,100);
  glVertex2i(-1,100);
  glEnd();

 glPushMatrix(); //enters temporarily in a stack 

  for(int i = 0 ; i <5; i++)
  {
      glRotatef(1,0,0, angle)
      glColor3f(color[i][0],color[i][1],color[i][2]);
      draw_circle(center[i][0],center[i][1],ring_radius);

  }
glPopMatrix(); // comes out of the stack

  glScalef(0.001, 0.001, 0.001);
  drawText(MESSAGE);
  glFlush();             

}


void myidle()
{
angle++; //angle value keeps on increasing
glutPostRedisplay(); // draws your drawing with updated value of angle to the screen
}

int main (int argc, char **argv)
{
  glutInit(&argc, argv);
  glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB); 
  glutInitWindowPosition(100,100); 
  glutInitWindowSize(110*PIXEL_SIZE, 110*PIXEL_SIZE);
  glutCreateWindow ("Olymipc Rings  ||  rotation  "); 
  glClearColor(1.0, 1.0, 1.0, 0.0);  
  glPointSize(PIXEL_SIZE);          
  glShadeModel (GL_FLAT);       
  glutDisplayFunc(display);
  glutIdleFunc(myidle); //just like DisplayFunc keeps on getting calls
  glutReshapeFunc(myReshape);
  glutMainLoop(); 
  return 0; 

阅读有关 glPopMatrix()、glPushMatrix() 和回调函数(如 glutIdleFunc())的内容。

我希望这会有所帮助!

Use glRotatef(axis_x,axis_y,axis,z, angle) function before you draw the rings .
If you want to keep rotating the ring always use glutIdle(myidle) in your main() function and increment the value of angle there and also use glutPostRedisplay().
Use glPushMatrix() before and glPopMatrix() and after your ring drawings if you do not want the rotation to effect other drawings.
for example if you want to rotate your rings about x axis your code will look like

float angle=0;

void display (void) {

  glClear(GL_COLOR_BUFFER_BIT); 
  glBegin(GL_LINE_LOOP);
  glVertex2i(-1,-1);
  glVertex2i(100,-1);
  glVertex2i(100,100);
  glVertex2i(-1,100);
  glEnd();

 glPushMatrix(); //enters temporarily in a stack 

  for(int i = 0 ; i <5; i++)
  {
      glRotatef(1,0,0, angle)
      glColor3f(color[i][0],color[i][1],color[i][2]);
      draw_circle(center[i][0],center[i][1],ring_radius);

  }
glPopMatrix(); // comes out of the stack

  glScalef(0.001, 0.001, 0.001);
  drawText(MESSAGE);
  glFlush();             

}


void myidle()
{
angle++; //angle value keeps on increasing
glutPostRedisplay(); // draws your drawing with updated value of angle to the screen
}

int main (int argc, char **argv)
{
  glutInit(&argc, argv);
  glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB); 
  glutInitWindowPosition(100,100); 
  glutInitWindowSize(110*PIXEL_SIZE, 110*PIXEL_SIZE);
  glutCreateWindow ("Olymipc Rings  ||  rotation  "); 
  glClearColor(1.0, 1.0, 1.0, 0.0);  
  glPointSize(PIXEL_SIZE);          
  glShadeModel (GL_FLAT);       
  glutDisplayFunc(display);
  glutIdleFunc(myidle); //just like DisplayFunc keeps on getting calls
  glutReshapeFunc(myReshape);
  glutMainLoop(); 
  return 0; 

Read about glPopMatrix(), glPushMatrix() and call back functions like glutIdleFunc().

I hope this will help!!

dawn曙光 2024-11-20 11:55:10

试试这个:

#include <stdlib.h>
#include <stdio.h>
#include <GL/glut.h>
#include <GL/gl.h>
#include <math.h>

#define PIXEL_SIZE 3 
#define MESSAGE     "hello world !"

void draw_circle(int x, int y, int r);

int ring_radius = 19; 
int color[5][3]={{0,0,1}, {0,0,0},{1,0,0}, {1,1,0},{0,1,0}};
int center[5][2]={{15,60},{50,60},{85,60},{33,45},{68,45}};
//=========================================================

void drawText(const char * message)
{
    glRasterPos2f((GLfloat)0, (GLfloat)-400);
    while (*message) 
    {
        glutBitmapCharacter(GLUT_BITMAP_HELVETICA_12, *message);
        glutStrokeCharacter(GLUT_STROKE_ROMAN,*message++);
    }
}

void display (void) 
{
    int ms = glutGet(GLUT_ELAPSED_TIME);

    glMatrixMode (GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D (-5, 105, -5, 105);
    glMatrixMode (GL_MODELVIEW);
    glLoadIdentity ();
    glTranslatef (0.375, 0.375, 0.0);

    glClear(GL_COLOR_BUFFER_BIT); 
    glBegin(GL_LINE_LOOP);
    glVertex2i(-1,-1);
    glVertex2i(100,-1);
    glVertex2i(100,100);
    glVertex2i(-1,100);
    glEnd();

    const float deg_per_sec = 60.0f;
    float angle = deg_per_sec * ( (float)ms / 1000.0f );

    for(int i = 0 ; i <5; i++)
    {
        glColor3f(color[i][0],color[i][1],color[i][2]);

        glPushMatrix();
        glTranslatef( center[i][0], center[i][1], 0 );
        glRotatef(angle, 0, 0, 1);
        glTranslatef( -center[i][0], -center[i][1], 0 );
        draw_circle(center[i][0],center[i][1],ring_radius);
        glPopMatrix();
    }
    glScalef(0.001, 0.001, 0.001);
    drawText(MESSAGE);
    glFlush();             

    glutSwapBuffers();
}

void draw_circle(int center_x, int center_y , int radius)
{
    int r = radius;
    int h = 1 - r ;    /*initialization */
    int x = 0;
    int y = r;
    int dU=3;
    int dD = 5 - 2*r;
    int i = center_x;
    int j = center_y;

    glPointSize(6);
    glBegin(GL_POINTS);

    while( y > x )
    {
        if (h<0)
        {
            dU= dU + 2;
            h = h + dU;
            x = x + 1;
            dD = dD + 2;
        }
        else
        {
            dD = 2*(x-y) + 5;
            h = h + dD;
            x = x + 1;
            y = y - 1;
            dU = dU + 2;
            dD = dD + 4;
        }

        glVertex2i(x+i, y+j);
        glVertex2i(-x+i, y+j);
        glVertex2i(x+i, -y+j);
        glVertex2i(-x+i,-y+j);
        glVertex2i(y+i, x+j);
        glVertex2i(y+i, -x+j);
        glVertex2i(-y+i, x+j);
        glVertex2i(-y+i, -x+j);

    }

    glEnd();
} 

void myReshape (int width, int height)
{
    glViewport (0, 0, width, height);    
}

void idle()
{
    glutPostRedisplay();
}


int main (int argc, char **argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB); 
    glutInitWindowPosition(100,100); 
    glutInitWindowSize(110*PIXEL_SIZE, 110*PIXEL_SIZE);
    glutCreateWindow ("Olymipc Rings  ||  rotation  "); 
    glClearColor(1.0, 1.0, 1.0, 0.0);  
    glPointSize(PIXEL_SIZE);          
    glShadeModel (GL_FLAT);       
    glutDisplayFunc(display);
    glutReshapeFunc(myReshape);
    glutIdleFunc(idle);
    glutMainLoop(); 
    return 0; 
}

Try this:

#include <stdlib.h>
#include <stdio.h>
#include <GL/glut.h>
#include <GL/gl.h>
#include <math.h>

#define PIXEL_SIZE 3 
#define MESSAGE     "hello world !"

void draw_circle(int x, int y, int r);

int ring_radius = 19; 
int color[5][3]={{0,0,1}, {0,0,0},{1,0,0}, {1,1,0},{0,1,0}};
int center[5][2]={{15,60},{50,60},{85,60},{33,45},{68,45}};
//=========================================================

void drawText(const char * message)
{
    glRasterPos2f((GLfloat)0, (GLfloat)-400);
    while (*message) 
    {
        glutBitmapCharacter(GLUT_BITMAP_HELVETICA_12, *message);
        glutStrokeCharacter(GLUT_STROKE_ROMAN,*message++);
    }
}

void display (void) 
{
    int ms = glutGet(GLUT_ELAPSED_TIME);

    glMatrixMode (GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D (-5, 105, -5, 105);
    glMatrixMode (GL_MODELVIEW);
    glLoadIdentity ();
    glTranslatef (0.375, 0.375, 0.0);

    glClear(GL_COLOR_BUFFER_BIT); 
    glBegin(GL_LINE_LOOP);
    glVertex2i(-1,-1);
    glVertex2i(100,-1);
    glVertex2i(100,100);
    glVertex2i(-1,100);
    glEnd();

    const float deg_per_sec = 60.0f;
    float angle = deg_per_sec * ( (float)ms / 1000.0f );

    for(int i = 0 ; i <5; i++)
    {
        glColor3f(color[i][0],color[i][1],color[i][2]);

        glPushMatrix();
        glTranslatef( center[i][0], center[i][1], 0 );
        glRotatef(angle, 0, 0, 1);
        glTranslatef( -center[i][0], -center[i][1], 0 );
        draw_circle(center[i][0],center[i][1],ring_radius);
        glPopMatrix();
    }
    glScalef(0.001, 0.001, 0.001);
    drawText(MESSAGE);
    glFlush();             

    glutSwapBuffers();
}

void draw_circle(int center_x, int center_y , int radius)
{
    int r = radius;
    int h = 1 - r ;    /*initialization */
    int x = 0;
    int y = r;
    int dU=3;
    int dD = 5 - 2*r;
    int i = center_x;
    int j = center_y;

    glPointSize(6);
    glBegin(GL_POINTS);

    while( y > x )
    {
        if (h<0)
        {
            dU= dU + 2;
            h = h + dU;
            x = x + 1;
            dD = dD + 2;
        }
        else
        {
            dD = 2*(x-y) + 5;
            h = h + dD;
            x = x + 1;
            y = y - 1;
            dU = dU + 2;
            dD = dD + 4;
        }

        glVertex2i(x+i, y+j);
        glVertex2i(-x+i, y+j);
        glVertex2i(x+i, -y+j);
        glVertex2i(-x+i,-y+j);
        glVertex2i(y+i, x+j);
        glVertex2i(y+i, -x+j);
        glVertex2i(-y+i, x+j);
        glVertex2i(-y+i, -x+j);

    }

    glEnd();
} 

void myReshape (int width, int height)
{
    glViewport (0, 0, width, height);    
}

void idle()
{
    glutPostRedisplay();
}


int main (int argc, char **argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB); 
    glutInitWindowPosition(100,100); 
    glutInitWindowSize(110*PIXEL_SIZE, 110*PIXEL_SIZE);
    glutCreateWindow ("Olymipc Rings  ||  rotation  "); 
    glClearColor(1.0, 1.0, 1.0, 0.0);  
    glPointSize(PIXEL_SIZE);          
    glShadeModel (GL_FLAT);       
    glutDisplayFunc(display);
    glutReshapeFunc(myReshape);
    glutIdleFunc(idle);
    glutMainLoop(); 
    return 0; 
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文