��������
��� ������ ������ � �����, ����������� 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
|