Miguel Angel Sepúlveda ���� �Ұ�: 1993� �����ϴ���(�̱�)�� �����ߴ�. ������, �̽���, �Ϻ�, �̱����� ���п��� �о߿��� ���Ѵ�. Ŀ�� 0.98����� �������� �˰� �Ǿ���. (ù���� ���ߴ�) ����� ���� �ð��� ������ ��Ŀ���� ���������� ���Ѵ�. ���ڿ��� �����ϱ� ���� ����������� �ٰ��� ������������ ���翡�� |
OpenGL���α���:������ �ٰ��� ���������: OpenGL���α��� ù ����� ������ �������۾��� ���Ͽ� �˾ƺ��ϴ�. ���� ���� ���� 2����/3���� ������ �����ǥ���� OpenGL�� ���� �������� ù��° ���̴�. ('OpenGL�̶� �����ΰ�?'��� �۵� �Բ� �ִ�.) �� ���� �д� �������� �������� C�����÷����� �̹� �ͼ��ϰ� GLUT���̺귯���� �ణ�� ������ ������ �ִٰ� �����ϰ� �����ϰڴ�.(���� ó�� ���Ѵٸ� ��������Ŀ���� "GLUT���α���"�̶� ���� ���� �б� �ٶ���.) ���ڴ� ���������� �����Ӱ� ����� �� �ִ� ȯ������ OpenGL�� ������ �����ִ� Mesa���̺귯���� �̿��϶�� ��õ�Ѵ�. Mesa�� �ϵ���������� �����ϴ� ��ǰ�� �̹� ������ �ִ�.(���� ���� '3Dfx ����ī��'�� �о��.) ���ο� OpenGL ���ɾ�� �� ����� ������ ���Ͽ� ����Ǵ� ����� �� �� ���� ���̴�. ���� �츮�� �̷��� �� ���̴�. �� ������ ���������� ������ OpenGL�� ������ ���� �ùķ��̼��� �ҽ��ڵ带 ���� �� ���̴�. ���� �����ϱ �ռ� ���� ���ڴ� �������̹Ƿ� OpenGL�� ����� ����� ��ټ��� ���� ���ڳ� ������ �ý����� �ùķ��̼��ϱ� ���� ������ ����ߴ� ����� ���� �����д�. ���� ���� ���ڰ� ���� ���� �������� �� �������� ġ��ģ ���� �����ʾ� �ִ� ;-) �������� �ٸ� ������ ���� �����ʹٸ� ���ڿ��� �˷��ֱ� �ٶ���. OpenGL�� ��κ� 3���� �����̳� ȯ������ Ư��ȿ��, ���ǰ� ������ ����ȿ���� ���� ������ ������ ���õǾ� �ִ�. ���� OpenGL�� 2���� ������ ���������ִ� ��ɵ� �ִ�. ������ 3���� ���ù��̳� �� ������, ����ȿ��, ī�� ��ġ ����� ���� ���� 2�������� �� �� �ִ� �͵��߿��� �������� �˾Ƶξ�� �� ���� ���ٴ� ���� �����ؾ� �Ѵ�. ���� ����/���� �������α��� 2�������� �������Ǿ�����. ���� ������ 2���� �ִϸ��̼��� ����� ����� ���캸��� ����. �� ���OpenGL�� ��,��, �ٰ����� ���� ��� �������� ��Ҹ��� ������ �ִ�. �̷��� �������� ��ҵ��� ���������� ������� ǥ���ȴ�. �� ��(vertex)�� 2�� �Ǵ� 3���� �Ǽ������� ��Ÿ���µ�, ������ǥ������ 2���� ���� (x,y)��, 3���� ���� (x, y, z)�� ǥ���ȴ�. ������ǥ��� ���� �Ϲ����� ��ǥ���̴�. ���� ��ǻ�� ���Ⱥо߿����� 4���� �Ǽ��� (x, y, z, w)�� ǥ���Ǵ� ȣ�����Ͼ ��ǥ�迪�� ���� ���ȴ�. ���� 3���� �������� ��� �⺻ ������ ���캸�� �ٽ� �̾߱� �ϵ��� ����. OpenGL���� ��� �������� ��ü�� ������ ������ ���� �������� �������� ǥ���DZ� ������ ������ �����ϴ� ��ƾ�� �ִ�. �� ������ ������ ����.: void glVertex{234}{sifd}[v](TYPE coords); ���� ���� ǥ����� �ͼ��������� �ʿ䰡 �ִ�. �߰�ȣ�� �� ����� ����ϴ� �Լ����� �Ϻ��̴�. ���� �Լ��� ��� �Ķ���ͷ� 2,3,4 �� �ϳ��� ���� �� ������ ���� short, long, float, double ���� ������ Ÿ�Ա��� ������ �� �� �ִ�. ���û������� �� �Ķ���͵��� ������������ ������ ���� �ִµ�, �� ��쿡�� v-������ ��ƾ���� ����� �� �ִ�. ���ݱ��� �̾߱��� �͵��� ������ ����� ��� ���̴�.: void glVertex2s(1, 3);
float vector[3];
�̷� ��� ��ƾ���� �׳� �����ϰ� glVertex*��� �θ���. OpenGL���� ������ ������ ������ ���ǵ� ������ ������.
������ ������ glBegin(GLenum mode)�� glEnd() ���̿�
���ǵȴ�.glVertex*���� mode���� ���� �ǹ̰� ������.
���� ����.:
2���� ��ǥ�迡 5���� ���� ���� ���̴�. GL_POINTS�� OpenGL�� ��������� <GL/gl.h>.�� ���ǵ� ǥ������ �ϳ��̴�. �̿��� �� �ִ� ��尡 ������ ���⼭�� �ʿ��� ����鸸 ���캸��� �Ѵ�. �� ������ OpenGL�� ���º����� ������ۿ� �ش��ϴ� ������ ������.
���� ������ �ٲٷ��� glColor*���� ��ƾ�� ����ϸ� �ȴ�;
������ �����ϰ� �ٷ�� ����� ���� �� ���� ������ �� ������ �ٸ� ��翡��
�ٷ� ���̴�. ������ ���캸�� 0.0���� 1.0������ �ε����Ǽ� 3���� �̿��Ͽ�
RGB(����-���-û��;Red-Green-Blue) ���ڵ������ ǥ���� �� �ִ�.;
���ݱ��� ��� ���� �̿��ϰ� �ΰ��� ������ �ۼ��� ������ ����. ù��° ������ ī������(�Ϲ����� ����)���� ���� �˵��� ���ִ� ������ OpenGL���α��̴�. �������� ������ ����� ����̳� ǥ�� ������ ���Ͽ� �� ���� ���ص� �� ������ ���� �ʴ´�. ������ �����ڸ� ������ �� ���� ���ϰ� �� ���� �̸� ���ǵ� �Ŀ� �����Ͽ� ���ο� ���� �����Ͽ� �ٽ� �����ϴ� ���·� ������ ���� ���̴�. �̶� ����ϴ� ���� ������ ����.: yn+1 = yn + K sin(xn)
ǥ�ظ��� ���ڰ��ӱ��� ���Ӱ�θ� ���� ȸ���ϰ� �ִ� ���⸦ �� ���ڰ� ����� ������ ���ӱ� �ܸ��� ������ ������ ��Ÿ����. ǥ�ظ��̳� �ٸ� �ʵ��� �Ӽ��� �����ϴ� ���� �̿°�����ġ���� ������ ������ �������� �����ϱ� ���Ͽ� �����п��� �߿��ϴ�. ǥ�ظ��� �� �Ķ������ ��� �������� ���� ����ϴ�. K�� ī���������� ��Ÿ���ش�. ���� �����п��� ���� ������ ������ ������ �����ڵ带 �����ϰ��� �ϴ� ����鿡�� �ʰ� �� �Ӽ��� ���캼���� ���̴�. ���� �ؽ���, ȭ���Ҳ�, ����, ��������� �����ϴ� ���� �˰������� �� ������ �ʿ� �����ϰ� �ִ�. ����1(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()�Լ��� ȣ���Ͽ� ������ �ݺ��Ͽ� GL_POINTS���� glVertex*�� ���ǵǴ� ������ ȭ�鿡 ����. ���� �����ϴ�. ������ �ʱ�ȭ�� ���� winInit()��ƾ�� ���캸��. �� ��ƾ���� �ܿ� ���ٷ� �� OpenGL��ƿ��Ƽ ��Ŷ�� �Լ�gluOrtho2D()�� ���Ǿ���. �� �Լ��� ��ǥ�踦 2���� ������ǥ��� ������ ���̴�.�� �Լ����� "�ּ� x, �ִ� x, �ּ� y, �ִ� y��ǥ��"�� ���ȴ�. ����: ���ڴ� ���� ��� ���������� ���캸�� ���Ͽ� ���ϸ�� ������� �ſ� ���� ������ �̿��Ͽ� ������ �Ͽ���. ũ�Ⱑ ũ�ų� �ð��� ���� �ɸ��� ��, ���� OpenGL��ƾ�� ���� �������� ȭ�鿡 ���� �����µ� ���� �ɸ��� �͵��� �ַ� ���ϸ�带 ����ϴ� ���� �Ϲ����̴�. �Ʒ� ���� ���� 1�� ���� �� �� �ִ� ���̴�.: �ι�° ���α�, ���� 2(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; /* ���� x�� 2���̷� ���� ���̴�.*/ *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; }�� ���α��� ���� 1(example1.c)�� �����Ͽ� ���������. ����1�� ū �������� �����츦 ���߹��۸��� ���ٴ� �Ͱ� �� �Ķ������ K�� ���α��� ����Ǵ� ���� ��� �ٲ�ٴ� ���̴�. ���ο� �ݹ��Լ��� idle()�� GLUT�� glutIdleFunc()�̺�Ʈ ó����� ��ϵǾ���.; �� �Լ��� ������� �Է��� ������ �̺�Ʈó���Ⱑ ������ �ϴ� �Լ��̴�. idle()�ݹ��Լ��� �ִϸ��̼����α��ֿ� ���� �����ϴ�. ���� 2���� �� �Լ��� �� �Ķ������ ���� ���ݾ� �ٲ��ִ� ����� �Ѵ�. idle()�Լ��� �������� �ִ� glutPostResDisplay()�Լ��� ����â�� �ʱ�ȭ�� �״�� ������ ä�� �����츦 �ٽ� ���� ���� ������ GLUT�����̴�. �Ϲ������� �׳� display()�� �ѹ��� ȣ���ϴ� �ͺ��� �ξ� ȿ�����̴�. display()�Լ��� �ڿ� ���� glutSwapBuffers()�Լ��� ������ ���캼���� �Լ��̴�. �� �������� ���߹��۸��� �����찡 �ʱ�ȭ�Ǿ��� ������ ������۷� �������� ������ ������ �� �ִ�. ;�� ��� ������ ���� ����ڴ� ������ ����� �� �� ����. ���� ��(�� ������)�� ������ ������ glutSwapBuffers()�Լ��� ���Ͽ� ������۰� �ٷ� �������� �ȴ�. �� �� ���� ���� �ִ� ���۴� ���� ���۷� ��ȯ�ȴ�. �� ����� �̿��Ͽ� �ִϸ��̼��� �ε巴�� �� �� �ִ� ���̴�. �Ʒ� �ִϸ��̼��� ����Ǵ� ������ ��� ȭ���̴�.: �߿�! ���� �Ҿ�~ : The display() �ݹ��Լ��� �� idle()������ �ѹ� ����ȴ�. �������� �̰��� ���ο� �ΰ� �ִϸ��̼� ����� ���α��Ҷ��� display()�� idel()���� ����� ��ɵ��� �����Ͽ��� �� ���̴�. ���� �ٰ��� �������� 3(example3.c) �տ��� glBegin(GLenum mode)���� �پ��� ��尡 �����ϸ� �̿� ���� ����v0, v1,v2, v3,v4,... vn-1���� ������ �ǹ̰� Ư���� �ǹ̷� �ؼ��ȴٰ� �ߴ�. ��忡 ����� �� �ִ� ���� ���� �� �ִ� ������ ������ ����.:
���� idle()�ݹ��Լ��� Ŭ���۵��ð��� �״�� ���������ش�(time������ ������Ʈ �ذ��鼭) display()�Լ������� �� �����ٰ� ���� ������ 2���� ��ü�� ���ش�. �������� �������� 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(); }; �������ݱ��� ��� ������ �̿��Ͽ� ���� ������������ �غ��� �ٶ���.:
���� ���翡������ �ۿ��� �ٷ���� �ϴ� ������ ������. �ٰ����� ���Ͽ� �� �̾߱� �غ��͵��� ����. ����ȣ(1998�� 3��ȣ)������ ����ؼ� �ٰ����� ���캸�� �������� �̹� �ͼ����� ���ɵ��� �� �� �ڼ��� �ٷ��� ���ϴ°ͱ��� ���캸�ڴ�. �� �ڼ��� �˰� �����ø�:
���� : ����ȣ
|
�� ������Ʈ�� Miguel Angel Sepulveda���� ���� �����˴ϴ�. © 1998 Miguel Angel Sepúlveda LinuxFocus 1998 |