Ю.М. Баяковский, А.В. Игнатенко - Начальный курс OpenGL (PDF) (1124368), страница 18
Текст из файла (страница 18)
Îñíîâàíèå íàõîäèòñÿ â ïëîñêîñòèz = 0.void g l u t S o l i d T o r u s ( GLdouble innerRadius ,void glutWireTorusGLdouble outerRadius ,GLint n s i d e s ,GLint r i n g s )( GLdouble innerRadius ,GLdouble outerRadius ,GLint n s i d e s ,GLint r i n g s )Ýòè êîìàíäû ñòðîÿò òîð èëè åãî êàðêàñ â ïëîñêîñòèz = 0.Âíóòðåííèé è âíåøíèé ðàäèóñû êîíòðîëèðóþòñÿ ïàðàìåòðàìè168Ïðèëîæåíèå À. Ïðèìèòèâû áèáëèîòåê GLU è GLUTinnerRadiusèouterRadius.Ïàðàìåòðnsidesçàäàåò ÷èñëî ñòîðîíâ êîëüöàõ, ñîñòàâëÿþùèõ îðòîãîíàëüíîå ñå÷åíèå òîðà, àrings ÷èñëî ðàäèàëüíûõ ðàçáèåíèé òîðà.void g l u t S o l i d T e t r a h e d r o n ( void )void glutWireTetrahedron ( void )Ýòè êîìàíäû ñòðîÿò òåòðàýäð (ïðàâèëüíóþ òðåóãîëüíóþ ïèðàìèäó) èëè åãî êàðêàñ, ïðè ýòîì ðàäèóñ îïèñàííîé ñôåðû âîêðóã íåãî ðàâåí 1.void g l u t S o l i d O c t a h e d r o n ( void )void glutWireOctahedron ( void )Ýòè êîìàíäû ñòðîÿò îêòàýäð èëè åãî êàðêàñ, ðàäèóñ îïèñàííîé âîêðóã íåãî ñôåðû ðàâåí 1.void glutSolidDodecahedron ( void )void glutWireDodecahedron ( void )Ýòè êîìàíäû ñòðîÿò äîäåêàýäð èëè åãî êàðêàñ, ðàäèóñ îïèñàííîé âîêðóã íåãî ñôåðû ðàâåí êâàäðàòíîìó êîðíþ èç òðåõ.void g l u t S o l i d I c o s a h e d r o n ( void )void g lu t Wi r eI c os a he dr o n ( void )Ýòè êîìàíäû ñòðîÿò èêîñàýäð èëè åãî êàðêàñ, ðàäèóñ îïèñàííîé âîêðóã íåãî ñôåðû ðàâåí 1.Ïðàâèëüíîå ïîñòðîåíèå ïåðå÷èñëåííûõ ïðèìèòèâîâ âîçìîæíî ïðè óäàëåíèè íåâèäèìûõ ëèíèè è ïîâåðõíîñòåé, äëÿ ÷åãî íàäî âêëþ÷èòü ñîîòâåòñòâóþùèé ðåæèì âûçîâîì êîìàíäûglEnable(GL_DEPTH_TEST).Ïðèëîæåíèå Á.ÄåìîíñòðàöèîííûåïðîãðàììûÁ.1.
Ïðèìåð 1: Ïðîñòîå GLUT-ïðèëîæåíèåÝòîò ïðîñòîé ïðèìåð ïðåäíàçíà÷åí äëÿ äåìîíñòðàöèè ñòðóêòóðû GLUT-ïðèëîæåíèÿ è ïðîñòåéøèõ îñíîâ OpenGL. Ðåçóëüòàòîì ðàáîòû ïðîãðàììû ÿâëÿåòñÿ ñëó÷àéíûé íàáîð öâåòíûõïðÿìîóãîëüíèêîâ, êîòîðûé ìåíÿåòñÿ ïðè íàæàòèè ëåâîé êíîïêèìûøè. Ñ ïîìîùüþ ïðàâîé êíîïêè ìûøè ìîæíî ìåíÿòü ðåæèìçàëèâêè ïðÿìîóãîëüíèêîâ.Ïðîãðàììà Á.1.
Ïðîñòîé ïðèìåð OpenGL.#include <s t d l i b . h>#include <g l \ g l u t . h>#i f d e f random#undef random#endif#define random (m) ( float ) rand ( ) *m/RAND_MAX169170Ïðèëîæåíèå Á. Äåìîíñòðàöèîííûå ïðîãðàììû// øèðèíà è âûñîòà îêíàGLint Width = 512 , Height = 5 1 2 ;// ÷èñëî ïðÿìîóãîëüíèêîâ â îêíåintTimes = 1 0 0 ;intFillFlaglongSeed = 0 ;// ñ çàïîëíåíèåì ?= 1;// ôóíêöèÿ îòîáðàæàåò ïðÿìîóãîëüíèêvoid DrawRect ( float x1 , float y1 ,float x2 , float y2 ,int F i l l F l a g ){}g l B e g i n ( F i l l F l a g ? GL_QUADS : GL_LINE_LOOP) ;g l V e r t e x 2 f ( x1 , y1 ) ;g l V e r t e x 2 f ( x2 , y1 ) ;g l V e r t e x 2 f ( x2 , y2 ) ;g l V e r t e x 2 f ( x1 , y2 ) ;glEnd ( ) ;// óïðàâëÿåò âñåì âûâîäîì íà ýêðàívoid Display ( void ){int i ;float x1 , y1 , x2 , y2 ;float r , g , b ;srand ( Seed ) ;glClearColor (0 , 0 , 0 , 1);g l C l e a r (GL_COLOR_BUFFER_BIT) ;for ( i = 0 ; i < Times ; i++ ) {r = random ( 1 ) ;g = random ( 1 ) ;Á.1.
Ïðèìåð 1: Ïðîñòîå GLUT-ïðèëîæåíèåb = random ( 1 ) ;glColor3f ( r , g , b );}}x1 = random ( 1 ) * Width ;y1 = random ( 1 ) * Height ;x2 = random ( 1 ) * Width ;y2 = random ( 1 ) * Height ;DrawRect ( x1 , y1 , x2 , y2 , F i l l F l a g ) ;glFinish ();// Âûçûâàåòñÿ ïðè èçìåíåíèè ðàçìåðîâ îêíàvoid Reshape ( GLint w, GLint h ){Width = w;Height = h ;glViewport ( 0 , 0 , w, h ) ;glMatrixMode (GL_PROJECTION) ;glLoadIdentity ( ) ;glOrtho ( 0 , w, 0 , h , − 1.0 , 1 .
0 ) ;}glMatrixMode (GL_MODELVIEW) ;glLoadIdentity ( ) ;// Îáðàáàòûâàåò ñîîáùåíèÿ îò ìûøèvoid Mouse ( int button , int s t a t e ,int x , int y ){i f ( s t a t e == GLUT_DOWN ) {switch ( button ) {case GLUT_LEFT_BUTTON:Seed = random (RAND_MAX) ;171Ïðèëîæåíèå Á. Äåìîíñòðàöèîííûå ïðîãðàììû172break ;case GLUT_RIGHT_BUTTON:FillFlag = ! FillFlag ;break ;}}}glutPostRedisplay ( ) ;// Îáðàáàòûâàåò ñîîáùåíèÿ îò êëàâèàòóðûvoid Keyboard ( unsigned char key , int x , int y ){const char ESCAPE = ' \033 ' ;i f ( key == ESCAPE )}exit (0);void main ( int argc , char{* argv [ ] )g l u t I n i t (&argc , argv ) ;g l u t I n i t D i s p l a y M o d e (GLUT_RGB) ;glutInitWindowSize ( Width , Height ) ;glutCreateWindow ( " Rect draw example (RGB) " ) ;glutDisplayFunc ( Display ) ;glutReshapeFunc ( Reshape ) ;glutKeyboardFunc ( Keyboard ) ;glutMouseFunc ( Mouse ) ;}glutMainLoop ( ) ;Á.2.
Ïðèìåð 2: Ìîäåëü îñâåùåíèÿ OPENGL173Ðèñ. Á.1. Ðåçóëüòàò ðàáîòû ïðîãðàììû Á.1. Ñëåâà ðåæèì çàïîëíåíèÿ, ñïðàâà ðåæèì êîíòóðîâ.Á.2. Ïðèìåð 2: Ìîäåëü îñâåùåíèÿ OpenGLÏðîãðàììà ïðåäíàçíà÷åíà äëÿ äåìîíñòðàöèè ìîäåëè îñâåùåíèÿ OpenGL íà ïðèìåðå ïðîñòîé ñöåíû, ñîñòîÿùåé èç òîðà, êîíóñà è øàðà. Îáúåêòàì íàçíà÷àþòñÿ ðàçíûå ìàòåðèàëû.  ñöåíåïðèñóòñòâóåò òî÷å÷íûé èñòî÷íèê ñâåòà.Ïðîãðàììà Á.2. Ìîäåëü îñâåùåíèÿ OpenGL.#include <s t d l i b . h>#include <GL/ g l u t .
h>// ïàðàìåòðû ìàòåðèàëà òîðàfloatfloatfloatfloatmat1_dif [ ] = { 0 . 8 f , 0 . 8 f , 0 . 0 f } ;mat1_amb[] = { 0 . 2 f , 0 . 2 f , 0 . 2 f } ;mat1_spec [ ] = { 0 . 6 f , 0 . 6 f , 0 . 6 f } ;mat1_shininess =0.5 f * 1 2 8 ;// ïàðàìåòðû ìàòåðèàëà êîíóñàfloat mat2_dif [ ] = { 0 . 0 f , 0 . 0 f , 0 . 8 f } ;float mat2_amb[] = { 0 . 2 f , 0 . 2 f , 0 . 2 f } ;float mat2_spec [ ] = { 0 . 6 f , 0 . 6 f , 0 .
6 f } ;Ïðèëîæåíèå Á. Äåìîíñòðàöèîííûå ïðîãðàììû174float mat2_shininess =0.7 f * 1 2 8 ;// ïàðàìåòðû ìàòåðèàëà øàðàfloatfloatfloatfloatmat3_dif [ ] = { 0 . 9 f , 0 . 2 f , 0 . 0 f } ;mat3_amb[] = { 0 . 2 f , 0 . 2 f , 0 . 2 f } ;mat3_spec [ ] = { 0 . 6 f , 0 . 6 f , 0 . 6 f } ;mat3_shininess =0.1 f * 1 2 8 ;// Èíèöèàëèçèðóåì ïàðàìåòðû ìàòåðèàëîâ è// èñòî÷íèêà ñâåòàvoid i n i t ( void ){GLfloatGLfloatGLfloatGLfloatlight_ambient [ ] = { 0 .
0 , 0 . 0 , 0 . 0 , 1 . 0 } ;light_diffuse [ ] = { 1.0 , 1.0 , 1.0 , 1.0 };light_specular [ ] = { 1.0 , 1.0 , 1.0 , 1.0 };light_position [ ] = { 1.0 , 1.0 , 1.0 , 0.0 };/* óñòàíàâëèâàåì ïàðàìåòðû èñòî÷íèêà ñâåòà */g l L i g h t f v (GL_LIGHT0,light_ambient ) ;g l L i g h t f v (GL_LIGHT0,light_diffuse );g l L i g h t f v (GL_LIGHT0,light_specular );g l L i g h t f v (GL_LIGHT0,light_position );GL_AMBIENT,GL_DIFFUSE,GL_SPECULAR,GL_POSITION,/* âêëþ÷àåì îñâåùåíèå è èñòî÷íèê ñâåòà */glEnable (GL_LIGHTING ) ;glEnable (GL_LIGHT0 ) ;/* âêëþ÷àåì z −áóôåð */glEnable (GL_DEPTH_TEST) ;}// Ôóíêöèÿ âûçûâàåòñÿ ïðè íåîáõîäèìîñòè// ïåðåðèñîâêè èçîáðàæåíèÿ .Á.2.
Ïðèìåð 2: Ìîäåëü îñâåùåíèÿ OPENGL//  íåé îñóùåñòâëÿåòñÿ âå ñü âûâîä ãåîìåòðèè .void d i s p l a y ( void ){/* î÷èùàåì áóôåð êàäðà è áóôåð ãëóáèíû */g l C l e a r (GL_COLOR_BUFFER_BIT |GL_DEPTH_BUFFER_BIT) ;glPushMatrix ( ) ;glRotatef (20.0 , 1.0 , 0.0 , 0 . 0 ) ;/* îòîáðàæàåì òîð */g l M a t e r i a l f v (GL_FRONT,GL_AMBIENT,mat1_amb ) ;g l M a t e r i a l f v (GL_FRONT,GL_DIFFUSE,mat1_dif ) ;g l M a t e r i a l f v (GL_FRONT,GL_SPECULAR,mat1_spec ) ;g l M a t e r i a l f (GL_FRONT, GL_SHININESS ,mat1_shininess ) ;glPushMatrix ( ) ;g l T r a n s l a t e f ( − 0.75 , 0 .
5 , 0 . 0 ) ;glRotatef (90.0 , 1.0 , 0.0 , 0 . 0 ) ;g l u t S o l i d T o r u s ( 0 . 2 7 5 , 0 . 8 5 , 15 , 1 5 ) ;glPopMatrix ( ) ;/* îòîáðàæàåì êîíóñ */g l M a t e r i a l f v (GL_FRONT,GL_AMBIENT,mat2_amb ) ;g l M a t e r i a l f v (GL_FRONT,GL_DIFFUSE,mat2_dif ) ;g l M a t e r i a l f v (GL_FRONT,GL_SPECULAR,mat2_spec ) ;g l M a t e r i a l f (GL_FRONT, GL_SHININESS ,mat2_shininess ) ;glPushMatrix ( ) ;175176Ïðèëîæåíèå Á.
Äåìîíñòðàöèîííûå ïðîãðàììûg l T r a n s l a t e f ( − 0.75 , − 0.5 , 0 . 0 ) ;glRotatef (270.0 , 1.0 , 0.0 , 0 . 0 ) ;g l u t S o l i d C o n e ( 1 . 0 , 2 . 0 , 15 , 1 5 ) ;glPopMatrix ( ) ;/* îòîáðàæàåì øàð */g l M a t e r i a l f v (GL_FRONT,GL_AMBIENT,mat3_amb ) ;g l M a t e r i a l f v (GL_FRONT,GL_DIFFUSE,mat3_dif ) ;g l M a t e r i a l f v (GL_FRONT,GL_SPECULAR,mat3_spec ) ;g l M a t e r i a l f (GL_FRONT, GL_SHININESS ,mat3_shininess ) ;glPushMatrix ( ) ;g l T r a n s l a t e f ( 0 . 7 5 , 0 .
0 , − 1.0);g l u t S o l i d S p h e r e ( 1 . 0 , 15 , 1 5 ) ;glPopMatrix ( ) ;glPopMatrix ( ) ;/* âûâîäèì ñöåíó íà ýêðàí */}glFlush ( ) ;// Âûçûâàåòñÿ ïðè èçìåíåíèè ïîëüçîâàòåëåì// ðàçìåðîâ îêíàvoid reshape ( int w, int h ){// óñòàíàâëèâàåì ðàçìåð îáëàñòè âûâîäà// ðàâíûì ðàçìåðó îêíàglViewport ( 0 , 0 , ( G L s i z e i ) w, ( G L s i z e i ) h ) ;// çàäàåì ìàòðèöó ïðîåêöèè ñ ó÷åòîì// ðàçìåðîâ îêíàglMatrixMode (GL_PROJECTION) ;glLoadIdentity ( ) ;Á.2. Ïðèìåð 2: Ìîäåëü îñâåùåíèÿ OPENGLgluPerspective (// óãîë çðåíèÿ â ãðàäóñàõ40.0 ,// êîýôôèöèåíò ñæàòèÿ îêíà( GLfloat )w/h ,// ðàññòîÿíèå äî ïëîñêîñòåé îòñå÷åíèÿ1 ,100.0);glMatrixMode (GL_MODELVIEW) ;glLoadIdentity ( ) ;gluLookAt (// ïîëîæåíèå êàìåðû0.0 f ,0.0 f ,8.0 f ,// öåíòð ñöåíû0.0 f ,0.0 f ,0.0 f ,// ïîëîæèòåëüíîå íàïðàâëåíèå îñè y0.0 f ,1.0 f ,0.0 f ) ;}// Âûçûâàåòñÿ ïðè íàæàòèè êëàâèøè íà êëàâèàòóðåvoid keyboard ( unsigned char key , int x , int y ){}//////switch ( key ) {case 2 7 : /*}int{exit (0);break ;e s c a p e */Ãëàâíûé öèêë ïðèëîæåíèÿÑîçäàåòñÿ îêíî , óñòàíàâëèâàåòñÿ ðåæèìýêðàíà ñ áóôåðîì ãëóáèíûmain ( int argc , char ** argv )g l u t I n i t (&argc , argv ) ;177178}Ïðèëîæåíèå Á.
Äåìîíñòðàöèîííûå ïðîãðàììûglutInitDisplayMode (GLUT_SINGLE |GLUT_RGB |GLUT_DEPTH) ;glutInitWindowSize ( 5 0 0 , 5 0 0 ) ;glutCreateWindow ( argv [ 0 ] ) ;init ();glutReshapeFunc ( reshape ) ;glutDisplayFunc ( d i s p l a y ) ;glutKeyboardFunc ( keyboard ) ;glutMainLoop ( ) ;return 0 ;Ðèñ. Á.2. Ðåçóëüòàò ðàáîòû ïðîãðàììû Á.2.Á.3.