Баяковский.Начальный курс OpenGL (Раздаточные материалы), страница 19
Описание файла
Файл "Баяковский.Начальный курс OpenGL" внутри архива находится в папке "Раздаточные материалы". PDF-файл из архива "Раздаточные материалы", который расположен в категории "". Всё это находится в предмете "инженерная графика" из 5 семестр, которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .
Просмотр PDF-файла онлайн
Текст 19 страницы из PDF
Çàãðóçêà BMP ôàéëà{WORDbfType ;DWORDbfSize ;WORDbfReserved1 ;WORDbfReserved2 ;DWORDbfOffBits ;} BITMAPFILEHEADER;typedef struct tagBITMAPINFOHEADER {DWORDbiSize ;biWidth ;b iH e ig h t ;WORD b i P l a n e s ;WORD biBitCount ;DWORD biCompression ;DWORD b i S i z e I m a g e ;longbiXPelsPerMeter ;longbiYPelsPerMeter ;DWORD biClrUsed ;DWORD biClrImportant ;} BITMAPINFOHEADER;longlongstatic void IntTo2Bytes ( int val , BYTE buf [ 2 ] ){}buf [ 0 ] = (BYTE) v a l ;buf [ 1 ] = (BYTE) ( v a l >> 8 ) ;static void IntTo4Bytes ( int val , BYTE buf [ 4 ] ){}buf [ 0 ]buf [ 1 ]buf [ 2 ]buf [ 3 ]====(BYTE) v a l ;(BYTE) ( v a l >> 8 ) ;(BYTE) ( v a l >> 1 6 ) ;(BYTE) ( v a l >> 2 4 ) ;185Ïðèëîæåíèå Á.
Äåìîíñòðàöèîííûå ïðîãðàììû186Á.4. Ïðèìåð 3: Òåêñòóðèðîâàíèå è àíèìàöèÿÐåçóëüòàòîì âûïîëíåíèÿ ýòîé ïðîãðàììû ÿâëÿåòñÿ ïîñòðîåíèå òåòðàýäðà ñ âðàùàþùèìèñÿ âîêðóã íåãî êîëüöàìè, íà êîòîðûå íàíåñåíà òåêñòóðà.Ïðè êîìïèëÿöèè ïðîãðàììû â Microsoft Visual C++ ôàéë¾texture.bmp¿ íàäî ïîìåñòèòü â êàòàëîã ïðîåêòà èëè óêàçàòüïîëíûé ïóòü ê íåìó. Åñëè ïóòü íå óêàçàí, òî ïðè çàïóñêå èñïîëíÿåìîãî ôàéëà èç îïåðàöèîííîé ñèñòåìû ôàéë ñ òåêñòóðîéäîëæåí íàõîäèòüñÿ â òîì æå êàòàëîãå.
Äëÿ çàãðóçêè èçîáðàæåíèÿ òåêñòóðû ïðîãðàììà èñïîëüçóåò ôóíêöèþLoadBMP,ïðèâå-äåííóþ â ïðåäûäóùåì ïóíêòå.Ïðîãðàììà Á.5. Ïðèìåð òåêñòóðèðîâàíèÿ è àíèìàöèè.#include#include#include#include<s t d l i b . h><math . h><GL\ g l u t . h>"loadbmp . h"#define TETR_LIST 1GLfloat l i g h t _ c o l [ ] = { 1 , 1 , 1 } ;float mat_diff1 [ ] = { 0 . 8 , 0 . 8 , 0 .
8 } ;float mat_diff2 [ ] = { 0 . 0 , 0 . 0 , 0 . 9 } ;float mat_amb[] = { 0 . 2 , 0 . 2 , 0 . 2 } ;float mat_spec [ ] = { 0 . 6 , 0 . 6 , 0 . 6 } ;float s h i n i n e s s =0.7 * 128 , CurAng=0, RingRad=1,RingHeight =0.1;GLUquadricObj * QuadrObj ;GLuint TexId ;GLfloat TetrVertex [ 4 ] [ 3 ] , TetrNormal [ 4 ] [ 3 ] ;// Âû÷èñëåíèå íîðìàëè ê ïëîñêîñòè ,// çàäàâàåìîé òî÷êàìè a , b , cvoid getnorm ( float a [ 3 ] , float b [ 3 ] , float c [ 3 ] ,float * n )Á.4. Ïðèìåð 3: Òåêñòóðèðîâàíèå è àíèìàöèÿ{float mult =0;int i , j ;n [ 0 ] = ( b [1] − a [ 1 ] ) * ( c [2] − a [ 2 ] ) − ( b[2] − a [ 2 ] ) *( c [1] − a [ 1 ] ) ;n [ 1 ] = ( c [0] − a [ 0 ] ) * ( b [2] − a [ 2 ] ) − ( b[0] − a [ 0 ] ) *( c [2] − a [ 2 ] ) ;n [ 2 ] = ( b [0] − a [ 0 ] ) * ( c [1] − a [ 1 ] ) − ( c [0] − a [ 0 ] ) *( b[1] − a [ 1 ] ) ;}// Îïðåäåëåíèå íóæíîãî íàïðàâëåíèÿ íîðìàëè :// îò òî÷êè ( 0 , 0 , 0 )for ( i =0; i <3; i ++) mult+=a [ i ] * n [ i ] ;i f ( mult <0) for ( j =0; j <3; j++) n [ j ]=−n [ j ] ;//Âû÷èñëåíèå êîîðäèíàò âåðøèí òåòðàýäðàvoid I n i t V e r t e x T e t r ( ){float alpha =0;int i ;TetrVertex [ 0 ] [ 0 ] = 0 ;TetrVertex [ 0 ] [ 1 ] = 1 .
3 ;TetrVertex [ 0 ] [ 2 ] = 0 ;// Âû÷èñëåíèå êîîðäèíàò îñíîâàíèÿ òåòðàýäðàfor ( i =1; i <4; i ++){}}TetrVertex [ i ] [ 0 ] = 0 . 9 4 * cos ( alpha ) ;TetrVertex [ i ] [ 1 ] = 0 ;TetrVertex [ i ] [ 2 ] = 0 . 9 4 * s i n ( alpha ) ;alpha +=120.0 * 3.14/180.0;// Âû÷èñëåíèå íîðìàëåé ñòîðîí òåòðàýäðàvoid InitNormsTetr ( ){getnorm ( TetrVertex [ 0 ] , TetrVertex [ 1 ] ,187Ïðèëîæåíèå Á. Äåìîíñòðàöèîííûå ïðîãðàììû188}TetrVertex [ 2 ]getnorm ( TetrVertex [ 0 ]TetrVertex [ 3 ]getnorm ( TetrVertex [ 0 ]TetrVertex [ 1 ]getnorm ( TetrVertex [ 1 ]TetrVertex [ 3 ], TetrNormal [ 0 ] ) ;, TetrVertex [ 2 ] ,, TetrNormal [ 1 ] ) ;, TetrVertex [ 3 ] ,, TetrNormal [ 2 ] ) ;, TetrVertex [ 2 ] ,, TetrNormal [ 3 ] ) ;// Ñîçäàíèå ñïèñêà ïîñòðîåíèÿ òåòðàýäðàvoid MakeTetrList ( ){int i ;glNewList (TETR_LIST,GL_COMPILE) ;// Çàäàíèå ñòîðîí òåòðàýäðàg l B e g i n (GL_TRIANGLES) ;for ( i =1; i <4; i ++){glNormal3fv ( TetrNormal [ i − 1 ] ) ;g l V e r t e x 3 f v ( TetrVertex [ 0 ] ) ;g l V e r t e x 3 f v ( TetrVertex [ i ] ) ;i f ( i !=3)g l V e r t e x 3 f v ( TetrVertex [ i + 1 ] ) ;else}g l V e r t e x 3 f v ( TetrVertex [ 1 ] ) ;}glNormal3fv ( TetrNormal [ 3 ] ) ;g l V e r t e x 3 f v ( TetrVertex [ 1 ] ) ;g l V e r t e x 3 f v ( TetrVertex [ 2 ] ) ;g l V e r t e x 3 f v ( TetrVertex [ 3 ] ) ;glEnd ( ) ;glEndList ( ) ;void DrawRing ( ){// Ïîñòðîåíèå öèëèíäðà ( êîëüöà ) , ðàñïîëîæåííîãîÁ.4.
Ïðèìåð 3: Òåêñòóðèðîâàíèå è àíèìàöèÿ////////////}ïàðàëëåëüíî îñè zÂòîðîé è òðåòèé ïàðàìåòðû çàäàþòðàäèóñû îñíîâàíèé , ÷åòâåðòûé âûñîòó ,ïîñëåäíèå äâà −÷èñëî ðàçáèåíèé âîêðóã èâäîëü îñè z . Ïðè ýòîì äàëüíåå îñíîâàíèåöèëèíäðà íàõîäèòñÿ â ïëîñêîñòè z=0g l u C y l i n d e r ( QuadrObj , RingRad , RingRad ,RingHeight , 3 0 , 2 ) ;void T e x t u r e I n i t ( ){char s t r F i l e [ ] = " t e x t u r e . bmp" ;IMAGE img ;// Âûðàâíèâàíèå â * . bmp ïî áàéòóg l P i x e l S t o r e i (GL_UNPACK_ALIGNMENT, 1 ) ;// Ñîçäàíèå èäåíòèôèêàòîðà äëÿ òåêñòóðûglGenTextures (1 ,& TexId ) ;// Çàãðóçêà èçîáðàæåíèÿ â ïàìÿòüi f ( ! LoadBMP( s t r F i l e , &img ) )return ; ;// Íà÷àëî îïèñàíèÿ ñâîéñòâ òåêñòóðûglBindTexture (GL_TEXTURE_2D, TexId ) ;// Ñîçäàíèå óðîâíåé äåòàëèçàöèè è èíèöèàëèçàöèÿ// òåêñòóðûgluBuild2DMipmaps (GL_TEXTURE_2D, 3 ,img .
width , img . height ,GL_RGB,GL_UNSIGNED_BYTE, img . data ) ;// Ðàçðåøåíèå íàëîæåíèÿ ýòîé òåêñòóðû íà// q u a d r i c −îáúåêòûgluQuadricTexture ( QuadrObj , GL_TRUE) ;// Çàäàíèå ïàðàìåòðîâ òåêñòóðû// Ïîâòîð èçîáðàæåíèÿ ïî ïàðàìåòðè÷åñêèì189190Ïðèëîæåíèå Á. Äåìîíñòðàöèîííûå ïðîãðàììû// îñÿì s è tglTexParameteri (GL_TEXTURE_2D,GL_TEXTURE_WRAP_S, GL_REPEAT) ;glTexParameteri (GL_TEXTURE_2D,GL_TEXTURE_WRAP_T, GL_REPEAT) ;// Íå èñïîëüçîâàòü èíòåðïîëÿöèþ ïðè âûáîðå òî÷êè// íà òåêñòóðåglTexParameteri (GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER, GL_NEAREST) ;glTexParameteri (GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER, GL_NEAREST) ;// Ñîâìåùàòü òåêñòóðó è ìàòåðèàë îáúåêòà}glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,GL_MODULATE) ;void I n i t ( void ){InitVertexTetr ( ) ;InitNormsTetr ( ) ;MakeTetrList ( ) ;// Îïðåäåëåíèå ñâîéñòâ ìàòåðèàëàg l M a t e r i a l f v (GL_FRONT_AND_BACK, GL_AMBIENT,mat_amb ) ;g l M a t e r i a l f v (GL_FRONT_AND_BACK, GL_SPECULAR,mat_spec ) ;g l M a t e r i a l f (GL_FRONT, GL_SHININESS ,shininess );// Îïðåäåëåíèå ñâîéñòâ îñâåùåíèÿg l L i g h t f v (GL_LIGHT0, GL_DIFFUSE, l i g h t _ c o l ) ;glEnable (GL_LIGHTING ) ;glEnable (GL_LIGHT0 ) ;Á.4.
Ïðèìåð 3: Òåêñòóðèðîâàíèå è àíèìàöèÿ// Ïðîâîäèòü óäàëåíèå íåâèäèìûõ ëèíèé è// ïîâåðõíîñòåéglEnable (GL_DEPTH_TEST) ;// Ïðîâîäèòü íîðìèðîâàíèå íîðìàëåéglEnable (GL_NORMALIZE) ;// Ìàòåðèàëû îáúåêòîâ îòëè÷àþòñÿ òîëüêî öâåòîì// äèôôóçíîãî îòðàæåíèÿglEnable (GL_COLOR_MATERIAL) ;g l C o l o r M a t e r i a l (GL_FRONT_AND_BACK,GL_DIFFUSE ) ;// Ñîçäàíèÿ óêàçàòåëÿ íà q u a d r i c −îáúåêò// äëÿ ïîñòðîåíèÿ êîëåöQuadrObj=gluNewQuadric ( ) ;// Îïðåäåëåíèå ñâîéñòâ òåêñòóðûTextureInit ( ) ;// Çàäàíèå ïåðñïåêòèâíîé ïðîåêöèèglMatrixMode (GL_PROJECTION) ;gluPerspective (89.0 , 1.0 , 0.5 , 100.0);// Äàëåå áóäåò ïðîâîäèòüñÿ òîëüêî// ïðåîáðàçîâàíèå îáúåêòîâ ñöåíû}glMatrixMode (GL_MODELVIEW) ;void DrawFigures ( void ){// Âêëþ÷åíèå ðåæèìà íàíåñåíèÿ òåêñòóðûglEnable (GL_TEXTURE_2D) ;// Çàäàåì öâåò äèôôóçíîãî îòðàæåíèÿ äëÿ êîëåög l C o l o r 3 f v ( mat_diff1 ) ;// ×òîáû íå ïðîâîäèòü ïåðåìíîæåíèå ñ ïðåäûäóùåé// ìàòðèöåé çàãðóæàåì åäèíè÷íóþ ìàòðèöóglLoadIdentity ( ) ;// Îïðåäåëÿåì òî÷êó íàáëþäåíèÿ191192Ïðèëîæåíèå Á.
Äåìîíñòðàöèîííûå ïðîãðàììûgluLookAt ( 0 . 0 , 0 . 0 , 2 . 5 ,0.0 , 0.0 , 0.0 ,0.0 , 1.0 , 0.0);// Ñîõðàíÿåì âèäîâóþ ìàòðèöó , òàê êàê äàëüøå// áóäåò ïðîâîäèòüñÿ ïîâîðîò êîëåöglPushMatrix ( ) ;////////Ïðîèçâîäèì íåñêîëüêî ïîâîðîòîâ íà íîâûé óãîë( ýòî áûñòðåå , ÷åì óìíîæàòü ïðåäûäóùóþ âèäîâóþìàòðèöó íà ìàòðèöó ïîâîðîòà ñ ôèêñèðîâàííûìóãëîì ïîâîðîòà )g l R o t a t e f (−CurAng , 1 , 1 , 0 ) ;g l R o t a t e f ( CurAng , 1 , 0 , 0 ) ;// Äëÿ ðèñîâàíèÿ êîëåö êàæäîå èç íèõ íàäî// ïðåîáðàçîâàòü îòäåëüíî , ïîýòîìó ñíà÷àëà// ñîõðàíÿåì âèäîâóþ ìàòðèöó , çàòåì âîññòàíàâëèâàåìglPushMatrix ( ) ;g l T r a n s l a t e f (0 ,0 , − RingHeight / 2 ) ;DrawRing ( ) ;glPopMatrix ( ) ;glPushMatrix ( ) ;g l T r a n s l a t e f ( 0 , RingHeight / 2 , 0 ) ;glRotatef (90 ,1 ,0 ,0);DrawRing ( ) ;glPopMatrix ( ) ;glPushMatrix ( ) ;g l T r a n s l a t e f (− RingHeight / 2 , 0 , 0 ) ;glRotatef (90 ,0 ,1 ,0);DrawRing ( ) ;glPopMatrix ( ) ;// Âîññòàíàâëèâàåì ìàòðèöó äëÿ ïîâîðîòîâ òåðàýäðàglPopMatrix ( ) ;// Âûêëþ÷àåì ðåæèì íàëîæåíèÿ òåêñòóðûg l D i s a b l e (GL_TEXTURE_2D) ;// Ïðîâîäèì ïîâîðîòûg l R o t a t e f ( CurAng , 1 , 0 , 0 ) ;Á.4.
Ïðèìåð 3: Òåêñòóðèðîâàíèå è àíèìàöèÿ193g l R o t a t e f ( CurAng / 2 , 1 , 0 , 1 ) ;// ×òîáû òåòðàýäð âðàùàëñÿ âîêðóã öåíòðà , å ã î// íàäî ñäâèíóòü âíèç ïî îñè ozg l T r a n s l a t e f ( 0 , − 0.33 , 0 ) ;// Çàäàåì öâåò äèôôóçíîãî îòðàæåíèÿ äëÿ òåòðàýäðàg l C o l o r 3 f v ( mat_diff2 ) ;// Ïðîâîäèì ïîñòðîåíèå òåòðàýäðà}g l C a l l L i s t (TETR_LIST ) ;void Display ( void ){// Èíèöèàëèçàöèÿ ( î÷èñòêà ) òåêóùåãî áóôåðà// êàäðà è ãëóáèíûg l C l e a r (GL_COLOR_BUFFER_BIT |GL_DEPTH_BUFFER_BIT) ;// Ïîñòðîåíèå îáúåêòîâDrawFigures ( ) ;// Ïåðåñòàíîâêà áóôåðîâ êàäðà}glutSwapBuffers ( ) ;void Redraw ( void ){// Óâåëè÷åíèå òåêóùåãî óãëà ïîâîðîòàCurAng+=1;// Ñèãíàë äëÿ âûçîâà ïðîöåäóðû ñîçäàíèÿ èçîáðàæåíèÿ// ( äëÿ îáíîâëåíèÿ )}glutPostRedisplay ( ) ;int main ( int argc , char{** argv )Ïðèëîæåíèå Á.
Äåìîíñòðàöèîííûå ïðîãðàììû194// Èíèöèàëèçàöèÿ ôóíêöèé áèáëèîòåêè GLUTg l u t I n i t (&argc , argv ) ;// Çàäàíèå ðåæèìà ñ äâîéíîé áóôåðèçàöèåé ,// ïðåäñòàâëåíèå öâåòà â ôîðìàòå RGB,// èñïîëüçîâàíèå áóôåðà ãëóáèíûg l u t I n i t D i s p l a y M o d e (GLUT_DOUBLE |GLUT_RGB |GLUT_DEPTH) ;// Ñîçäàíèå îêíà ïðèëîæåíèÿglutCreateWindow ( "Example o f u s i n g OpenGL" ) ;// Ðåãèñòðàöèÿ ôóíêöèè ïîñòðîåíèÿ èçîáðàæåíèÿglutDisplayFunc ( Display ) ;// Ðåãèñòðàöèÿ ôóíêöèè îáíîâëåíèÿ èçîáðàæåíèÿg l u t I d l e F u n c ( Redraw ) ;// Èíèöèàëèçàöèÿ ôóíêöèé OpenGLInit ();// Öèêë îáðàáîòêè ñîáûòèéglutMainLoop ( ) ;}return 0 ;Ðèñ. Á.3.
Ðåçóëüòàò ðàáîòû ïðîãðàììû Á.5.Á.5. Êëàññ äëÿ ðàáîòû ñ OPENGL â WIN32195Á.5. Êëàññ äëÿ ðàáîòû ñ OpenGL â Win32Ïðîãðàììà Á.6. Ôàéë glrc.h.#ifndef _GLRC_H_#define _GLRC_H_// çàãîëîâêè OpenGL#include <g l / g l . h>#include <g l / gl u . h>class GLRC{public :// ñîçäàíèå èç èäåíòèôèêàòîðà îêíàGLRC( HWND wnd ) ;// äåñòðóêòîð~GLRC( ) ;// óäàëåíèå (òàêæå âûçûâàåòñÿ èç äåñòðóêòîðà )void Destroy ( ) ;// Ñîçäàíèå êîíòåêñòà ðèñîâàíèÿ .// Íåîáõîäèìî âûçâàòü äî èñïîëüçîâàíèÿ OpenGLbool Create ( ) ;// Ñîçäàí ëè êîíòåêñò ðèñîâàíèÿ ?bool I s C r e a t e d ( ) ;// ßâëÿåòñÿ ëè êîíòåêñò ðèñîâàíèÿ òåêóùèì?bool I s C u r r e n t ( ) const ;// Äåëàåò êîíòåêò òåêóùèìbool MakeCurrent ( ) ;196Ïðèëîæåíèå Á.