Home Index Search Links About Us
[LinuxFocus Image]
[Navegation Bar]
������� ������ �������� ���������

���������������� OpenGL: ��������� ������� ���������������

����� Miguel Angel Sepulveda


��������

��������� �����

��������� ����� � ���������������

����������

� ��������� ���...

��������

��� ������ ������ � �����, ����������� OpenGL, ������� ���� ������������ ���������� � 2D/3D ������� (�������� ��� �� ��� ����� OpenGL?). �� ������������, ��� �������� ������ �� ����� ���������� ��� ���������� �������� �� ����� �, � ������� ������ � ����������� GLUT (� ��������� ������, ������������ � ������ ������ ����������� ���������������� GLUT � ����� �������). ��� �������� �� ����������� ������������ ����������� Mesa, ������� �������� ������������ ���������� ����������� ��������� OpenGL. � ��������� ����� ���� ���� ���������� ��������� Mesa (�������� ����������� ����� 3Dfx).

������ ����� ������� OpenGL ����� �������������� ��������, ���������� �� ������; �� ������� ����, �� ����������� �������������� ����� �������! � ����� ����� ����� ������ �� ���������� ������ �������� �������� ��� ����-����������, ��������� ���������� �� OpenGL.

������, ��� � ����� �������������, � ����� �� ������������ ���, ��� � ������, � ����� ���� ��� ���� � ������� � OpenGL ���������� � �������� ������� ��������� ��������� � ������������ ������. ������� ��� ������� ����� ������ ����� ;-) � �������, �������� ������ ��� ������� ���������� ��� ���������� ���, �� ������� ����, ���������. ���� �� �������� ��������� �� ������ �������, ������ ����� ��� �����.

OpenGL �������� ������������� � ���������� ��������, �������������, �������� �������� � ������������ ��������� ��������� ���. ������ ��� ����� ������������ � ��� ������ ��� ����������� ����������. ��� �����, ��� ��� �� ������ ������� ��������� �� ���������� �������, ������ ��� ����������� �� ����� ����������� ���������� �����������, �������, ���������� �����, ������� ����� ���. ������� ���������� ���������� � ������� ���������� ����� ���� ������� � ��������� ������������. ����, ��������� ��� ������ � �������� ������� ���������� ��������.

��������� �����

OpenGL ����� ����� ���� ��������� �������������� ����������: �����, ����� � ��������������. ��� ��� ����������� � �������� �� ��������������� ������. ������� ��������������� ����� ��� ����� ������� � ������� � ��������� �������, ������� ������������ ����� ��������� ���������� ���� �������, (x,y) � ����- � (x, y, z) � ���������� ������������. ���� ��������� ���������� �������� �������� ����������������, � ������������ ������� �������� ������������ ���������� ������� ���������, � ������� ������ ����� ����������� �������� ������� � ������� � ��������� �������, (x, y, z, w). �� �������� � �������� ��������� ����� ����, ��� ������ ��������� ������������ ������� ����������� ����������.

��������� ��� �������������� ������� � OpenGL � �������� ����� ����������� ��� ������������� ����� ������, ���� ����� ����� ������� ��� ���������� ������. ��������� ������� �����:

void glVertex{234}{sifd}[v](TYPE coords); 

����������� ���������� � ����������� �������. (�������� ������ ������������ ����� ��������� � ������������ ��������, �������� {234} �������� 2 ��� 3 ��� 4, � �� ����� ��� �������� � ���������� ������� ����������� � ����� ���� ������� - ����. ���.) �������� ������ ���������� ����� ����� �������. ������� ����� ����� 2, 3 ��� 4 ��������� � ��������: �������� �����, ������� �����, ����� � ��������� ������� ��� ����� � ������� ���������. ��� ��������� ����������� ����� ���� ������������ � ��������� �����, � � ���� ������ �� ����� ������������ ��������� v-����. ��� ��������� ��������:

void glVertex2s(1, 3);
void glVertex2i(23L, 43L);
void glVertex3f(1.0F, 1.0F, 5.87220972F);

float vector[3];
void glVertex3fv(vector);

��� �������� ��� ����������� ������� ����� ����� ��� glVertex*.

����� ������������������ ������ ���������������� OpenGL � ������������ � ����������. �������� ����������� ����� ������� glBegin(GLenum mode)glEnd(), ����� ������� glVertex* ����� ������������ ���� ��������� ��������� ���������������� � ������������ �� ��������� ������ - mode, ��������:
glBegin(GL_POINTS);
glVertex2f(0.0, 0.0);
glVertex2f(1.0, 0.0);
glVertex2f(0.0, 1.0);
glVertex2f(1.0, 1.0);
glVertex2f(0.5, 0.5);
glEnd();

�������� ��� 5 ����� � ���������� ������������ � ���������� ������������. ��������� GL_POINTS ������ � ������� ��������� � ������������ ����� <GL/gl.h>. ���� ����� ������ �������, �� �� ����� ������������� �� �� ���� ������������� 

������ ����� �������� ������, ���������� � ���������� ��������� OpenGL, ��������������� � ������� ������. ����� �������� ������� ����, ����������� ����� ������� glColor*; � ������ ����� � ����������� � ��� ����� �������� ����� (����� ����� ��������� ��������� ������). ���� �� �� ����� ������������ ��� ����� � ������� � ��������� ������ � ��������� �� 0,0 �� 1,0 � ��������� RGB (Red-Green-Blue, �������-�������-�����);
glColor3f(1.0, 1.0, 1.0); /* ����� */ 
glColor3f(1.0, 0.0, 0.0); /* ������� */ 
glColor3f(1.0, 1.0, 0.0); /* ��������� */ 
���... 

��������: ../../common/January1998/Makefile, ../../common/January1998/../../common/January1998/example1.c, ../../common/January1998/../../common/January1998/example2.c

� ��� ��� ���������� ���������, ����� �������� ��� ������ �������. ������ - ������� ��������� OpenGL ��� ��������� ��������� ����� � ��� ���������� ����������� ����� (����������� �����). ���� �������� �� ������ � �������, � � ����������� �� ����������� ������, �� ����������. ����� ������, ����� ����� ����� � ���������� �����, ��������� ������ ��������� �������:

yn+1 = yn + K sin(xn)
xn+1 = xn + yn+1

� ������ ����������� ����� �� ������� ������ ���������� ���������� �������, ������� ������ �� ������ ���������� � ���������� ��� �������������� ���������. �������� ������� ���� � ������ ���� ����� ��� ������, ��� ��� �������� ������ ������������ ���������� �������, ����������� � ���������. ����������� ����� ������ ���������, ��� ��� �������� � � �������� ���������� ����� ����������� � �������������� ������������ ��������. � ����� ������, ���� ��, ��� ���������� �� ������������ �������, �� ��� �� ����� ������������� ���������� ��������� ��� �������, ������ �������� �������� �� ����� � �� ��������, ��� ��� ������ ��������� ��� �������� �������, ������ �������, ��������, ������ ����������� ���. �������� �� ����������� ������.

����� ���� ��� ������� ������� ../../common/January1998/../../common/January1998/example1.c:

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

const  double pi2 = 6.28318530718;

void NonlinearMap(double *x, double *y){
    static double K = 1.04295;
    *y += K * sin(*x);
    *x += *y;
    *x = fmod(*x, pi2);
    if (*x < 0.0) *x += pi2;
};

void winInit(){
    /* ��������� ��������� ��������� */
    gluOrtho2D(0.0, pi2, 0.0, pi2);
};

void display(void){
    const int    NumberSteps = 1000;
    const int    NumberOrbits = 100;
    const double Delta_x = pi2/(NumberOrbits-1);
    int step, orbit;

    glColor3f(0.0, 0.0, 0.0);
    glClear(GL_COLOR_BUFFER_BIT);
    glColor3f(1.0, 1.0, 1.0);

    for (orbit = 0; orbit < NumberOrbits; orbit++){
      double x, y;
      y = 3.1415;
      x = Delta_x * orbit;

      glBegin(GL_POINTS);
      for (step = 0; step < NumberSteps; step++){
        NonlinearMap(&x, &y);
        glVertex2f(x, y);
      };
    
      glEnd();
    };

    for (orbit = 0; orbit < NumberOrbits; orbit++){
      double x, y;
      x = 3.1415;
        y = Delta_x * orbit;

        glBegin(GL_POINTS);
        for (step = 0; step < NumberSteps; step++){
          NonlinearMap(&x, &y);
          glVertex2f(x, y);
        };
        glEnd();

     };
};

int main(int argc, char **argv) {
  glutInit(&argc, argv);  
  glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA);  
  glutInitWindowPosition(5,5);  
  glutInitWindowSize(300,300);  
  glutCreateWindow("Standard Map");  
  
  winInit();
  glutDisplayFunc(display);  
  glutMainLoop();  
  
  return 0;  
}  
  
�������� ������ ���������������� GLUT ��� ��������� ������� glut* , ��� � �������� ���� �� ��� ������. ����������� ���� ����������� � ������ ���������� ������ � RGB-�������. ���������� ������� � ������ display() ������ �����: ������� �� �������� ������ ���� ��� ����; glClear(GL_COLOR_BUFFER_BIT) ���������� ����� ������, ������������ ������� ���� (������), ����� ����� ������ ������ ����� � ������� glColor, ��������� NonlinearMap() (���������� �����) ��������� ��� � ������ ����� ��������� glVertex* � ������ GL_POINTS. ����� ������. :-)

��������, ��� ������� ������������� ���� winInit() �������� ����� ���� ����� ������� ������ ������ OpenGL (GLUT), gluOrtho2D(). ��� ������� ������������� ���������� ������������� ������� ���������. ����������� ������� �������� "������� x, �������� x, ������� y, �������� y".
� ������ ����� ���������� ���� � ������� ���������� �����, ����� � ��� ��� ���� ����������, ��� ����������� ���������������. ������ � ������ ���������� ���� � �������� �������������, ������� ������� ����� ������� ��� ����������, ������ ���������� �� ������ � ��� �������, ��� ���������� ������� OpenGL.

�� ��������� ������ ������� �� ������� ����� �����������:

 

������� �������� �� ������ ���������, ../../common/January1998/../../common/January1998/example2.c:

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

const  double  pi2 = 6.28318530718; 
const  double  K_max = 3.5;
const  double  K_min = 0.1;
static double  Delta_K = 0.01;
static double  K = 0.1;          


void NonlinearMap(double *x, double *y){
    /* ����������� ����� */
    *y += K * sin(*x);
    *x += *y;

    /* Angle x is module 2Pi */
    *x = fmod(*x, pi2);
    if (*x < 0.0) *x += pi2;
};


/* ���������� �������: 
   ��� ����� ����������� � ���������� �������� ������������ */
void  idle(void){
    /* ����������� ����������� ������������ */
    K += Delta_K;
    if(K > K_max) K = K_min;

    /* �������������� ����� */
    glutPostRedisplay();
};


/* ������������� ������������ ���� */
void winInit(void){
    gluOrtho2D(0.0, pi2, 0.0, pi2);
};

/* ���������� �������:
    ��� ����� �����������, ����� ����� ��������� � ����������� */
void display(void){
    const int    NumberSteps = 1000;
    const int    NumberOrbits = 50;
    const double Delta_x = pi2/(NumberOrbits-1);
    int step, orbit;

    glColor3f(0.0, 0.0, 0.0);
    glClear(GL_COLOR_BUFFER_BIT);
    glColor3f(1.0, 1.0, 1.0);
                
    for (orbit = 0; orbit < NumberOrbits; orbit++){
        double x, y;
        y = 3.1415;
        x = Delta_x * orbit;

        glBegin(GL_POINTS);
        for (step = 0; step < NumberSteps; step++){
          NonlinearMap(&x, &y);
          glVertex2f(x, y);
        };
        glEnd();
     };

     for (orbit = 0; orbit < NumberOrbits; orbit++){
        double x, y;
        x = 3.1415;
        y = Delta_x * orbit;

        glBegin(GL_POINTS);
        for (step = 0; step < NumberSteps; step++){
          NonlinearMap(&x, &y);
          glVertex2f(x, y);
        };
        glEnd();
     };

     glutSwapBuffers();
};


int main(int argc, char **argv)  {  
  /* ������������� GLUT */
  glutInit(&argc, argv);  
  glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);  
  glutInitWindowPosition(5,5);  
  glutInitWindowSize(300,300);
  
  /* ��������� ���� */
  glutCreateWindow("Order to Chaos");  
  
  /* �������������� ���� */
  winInit();

  /* ������������ ���������� ������� */
  glutDisplayFunc(display);  
  glutIdleFunc(idle);

  /* ��������� ���������� ������� */
  glutMainLoop();  
  
  return 0;  
}  
  
    
    
��� ��������� �������� �� ������ �������, ../../common/January1998/../../common/January1998/example1.c, � ������� ������� ����������� � ���, ��� ���� ����������� � ������ �������� ������, � �������� � �������� � ������� ������ ���������. ���� ��� �� ����� ���������� ������� idle(), ������� �������������� � ����������� ������� GLUT �������� glutIdleFunc(). � ���� ������� ������ ���������� - ��� ���������� ������ ���, ��� ���������� ������� �� ���������� ������ ����� �� ����� ������� �������� �� ������� ������������. ���������� ������� idle() �������� �������� ��� �������� ��������. �� ������ �������, ../../common/January1998/example2, ����������� ������� �������� ��������� ��������� ��������� �����. � ����� ������� idle() ������������ ����� ������ ����� ������������� �������, glutPostResDisplay(), ������� �������������� ����, �������� ���������� �������������. � �����, ��� ����� ����������, ��� ������� ��������� ����� ������� display().

������ ������������� �������� �������� �������� ������������� glutSwapBuffers() � ����� display(). ���� ���� ������������������� � ������ �������� ������, ������� ��� �������� �� ��������� ����������� � ����������� ������, � ������������ �� �����, ��� ��������������� �����������. �� ���������� ��������� ����������� (�����), ��� ���������� ������� ������������� ����������� � �������� ������� �������� glutSwapBuffers(). ��� ���� ������� ���������� �������� ������� ��������.

����� ���� ��������� �� ������, ������������ �� ����� ��������:

������ ���������: ���������� ������� display() ������ ���������� ��� ������� ���� ��� ����� �������� idle(). ���������� ���� ���� �� �������� ��� ��������� ����������� ������������ ��������, ��� ����, ����� ������, ����� ������� ��������� � ������� display() � ����� - � idle().

��������� ����� � ���������������

��������:
../../common/January1998/../../common/January1998/example3.c

��� �� ��� ��������� ������, glBegin(GLenum mode) ��������� � �������� ��������� ������ ������ (mode). ������������������ ������ v0, v1,v2,v3,v4,... vn-1 ����������� ����� ���� ������� ���������������� �������������� ���������� ������. ��������� �������� ��� ������� � ��������������� ��������:

  • GL_POINTS    �����. ������ ����� � ������ �� n ������
  • GL_LINES    �����. ������ ����� ������������� ���� � ������ �����. ������� �������� ����� ������ ������ v0 � v1, v2 � v3,...���. ���� n - �������� �����, �� vn-1 ������������
  • GL_POLYGON    �������������. ������ �������������, ��������� v0, v1,..,vn-1 ��� �������. n ������ ���� ����� ������� 3 ����� ���-���� ���� ����������, ����� ����, ������������� �� ����� ������������ ��� � ����� � ������ ���� �������� (��-�� ����������� ����������, ������������� ���������).
  • GL_TRIANGLES    ������������. ������ ����� �������������, ��������� ������ ������ v0, v1 � v2, ����� v3, v4 � v5 ���. ���� n �� ������ 3, ���������� ����� ������������
  • GL_LINE_STRIP    �������� ��� ������. ������ ����� �� v0 � v1, ����� �� v1 � v2 ���. �������, �� vn-2 � vn-1, ����� n-1 �������� ��������. �����-���� ����������� �� ������������ ������ �������� �� �������������, ����� ����� ����������� ������������
  • GL_LINE_LOOP    ��������� ��������. �� ��, ��� � �������� GL_LINE_STRIP, �� ����������� ����, ��� ��������� ������� �������� ����� vn-1 � v0, ������� ����
  • GL_QUADS    ����������������. ������ ����� �����������������, ��������� �� ������ ������� v0, v1, v2, v3 ����� v4, v5, v6, v7 ���.
  • GL_QUAD_STRIP    ������ �����������������. ������ ����� �����������������, ��������� ������� v0, v1, v3, v2 ����� v2, v3, v5, v4 ���.
  • GL_TRIANGLE_STRIP    ������ �������������. ������ ����� �������������, ��������� ������� � ��������� �������: v0, v1, v2, ����� v2, v1, v3, ����� v2, v3, v4, ���. ������� ������ ������ �������������, ��� ������������ ����� ���������� ����������, � ������ ����� �������������� ��� ������������ ����� �����������.
  • GL_TRIANGLE_FAN    ������ �� GL_TRIANGLE_STRIP, �� ������������ ���������� ������� � ����� �������: v0, v1, v2, ����� v0, v2, v3, ����� v0, v3, v4, ���. ��� ������������ ����� ����� ������� v0
� ����� ������� ������� �� ���������� GL_LINES � GL_POLYGON ��� �������� ����� ��������. �������������� ���������, ����� ��������� �� �������� ���, ����� ������, ��� ��� ��������. � �������� ��� ����� ������ �� ������ ������, �� ����������� � ����� ������� - ��� ����� ������� �������. �������� ���������� �������� ���������� ��������. ��� ���� �� ��������:

��� � ������, ������������ ���������� ������� idle() ����� ������� � ������ ������ �������� ����������� ���� ����� (���������� ���������� time). ������� display() ������ ��� �������: ����� (������) � ���� (����� � ������� ������� ��������������). �������� �������� ������� � �������� ��� xcenter � ycenter: 

    

void display(void){
  static double radius = 0.05;
  const double delta_theta = pi2/20;
  double xcenter , ycenter;  
  double x, y;
  double theta = 0.0;

  double current_angle = cos(omega * time);

  glColor3f(0.0, 0.0, 0.0);
  glClear(GL_COLOR_BUFFER_BIT);
  glColor3f(1.0, 1.0, 1.0);

  /* ������ ����� */  
  glColor3f(1.0, 1.0, 1.0);
  glBegin(GL_LINES);
  glVertex2f(0.0, 0.0);
  xcenter = -cord_length * sin(current_angle);
  ycenter = -cord_length * cos(current_angle);
  glVertex2f(xcenter, ycenter);
  glEnd();

  /* ������ ���� */
  glColor3f(1.0, 0.0, 0.0);
  glBegin(GL_POLYGON);
  while (theta <= pi2) {
    x = xcenter + radius * sin(theta);
    y = ycenter + radius * cos(theta);
    glVertex2f(x, y);
    theta += delta_theta;
  };
  glEnd();
  
  glutSwapBuffers();
};

    
    

����������

��� ��������� ����������� ��� ������������ ������ ��� ���, ��� �� ������ ��� �������:

  • � ������ �������, ../../common/January1998/../../common/January1998/example1.c ���������� ������ �����. �������� � ���������� ����� ����� �� ���������, � ������� �� ���������� ������� ��������� ��������. �������������������, ������� ���������, ������� ���������, �������� ��������������� ��������� ���� ����� ���������� �����. �������� ������������ �� ���� � ��������. :-)
  • �� ������ �������, ../../common/January1998/../../common/January1998/example2.c , �� ������ �������� ���� � ������ �����. ��������, ����� ���������� �������� ����������� ����� ���� �������� �� ���������� ������ ����� ����� � ������������ � ��������� ������������� ������. (�� ������ Physics Review Letters Vol 63, (1989) 1226), ����� ���������� �������� ����� ����������� ������, ��� ���������� ����� �������. ��������, ������ ��������� ������������ ������ ����� ����������� ����� �����. ���� �� ��������� ���� ������, ����������� ������� ����� �� ������ ������� ������ ���������. ��� ������� ������ ��� ��� �� ���, ��� �� ���� ���� � ����������������� �����������, �� ����������� ��������, ���� �� ������ ������������ ����� � �������� � ����� ������������ �������.
  • � ������� �������, ../../common/January1998/../../common/January1998/example3.c , ���������� �������� ��� �����, ������������ ��� ��������� �����. ����������� GL_LINES, GL_TRIANGLES, ���.. ����������, ��� ���������. ���������� �������������� ��������� �����, ��� ������������� ������ ��� ��������� ������ � �������� ��� ��������� ������ � ���� �� ����� � ������ �����, �� ������ ��������� �������� � �������. ����������� ��������������, ����� ���������� �������, �����, ��� ��� ��� ������ � ������ ������ ����� �� ����� ��������. ��������� ��� �������� � �����, ���������� ���������� ��� ���� �������� ���� �� �����.

� ��������� ���...

�� ������� ���. ���� ��� ����� �������������� � ���������������. � ��������� ������� (���� 1998) �� ��������� �������� ���������������, ������������� � ������ ����� �������� ��������� �� ������, � �������� �� ��� ������ �������������.

�������: Vladas Lapinskas


���������� ����������:
© 1998 Miguel Angel Sepúlveda
This website is mantained by Miguel A Sepulveda.