Баяковский.Начальный курс OpenGL (1124482), страница 17
Текст из файла (страница 17)
Èñïîëüçîâàíèå OPENGL C VCL}153m_glRC−>SwapBuffers ( ) ;// ç ä å ñ ü ïðîèñõîäèò îñâîáîæäåíèå ð å ñ ó ð ñ î âafx_msg void OpenGLWindow : : OnDestroy ( ){m_glRC−>Destroy ( ) ;delete m_glRC ;}CWnd : : OnDestroy ( ) ;11.6. Èñïîëüçîâàíèå OpenGL c VCLÈñïîëüçîâàíèå OpenGL ñ VCL äðóãîé ïîïóëÿðíîé áèáëèîòåêîé äëÿ ðàçðàáîòêè Windows-ïðèëîæåíèé, îòëè÷àåòñÿ îòïðåäûäóùåãî ïðèìåðà òîëüêî äåòàëÿì è íàçâàíèÿìè êëàññîâ.Âîò ïðèìåð ìèíèìàëüíîãî êîäà íà Ñ++, êîòîðûé äîáàâèòOpenGL ê ôîðìå (îêíó) VCL:class OpenGLForm : public TForm{public :_ _ f a s t c a l l OpenGLForm( TComponent * owner ) ;// îòêðûòûå ÷ëåíû êëàññà...private :// çàêðûòûå ÷ëåíû êëàññàGLRC* m_pGLRC;...// êîíòåêñò óñòðîéñòâà îêíàpublished :// ñèãíàòóðû ýòèõ ìåòîäîâ îïðåäåëåíû çàðàíååvoid _ _ f a s t c a l l FormCreate ( TObject * se nder ) ;void _ _ f a s t c a l l FormDestroy ( TObject * se nder ) ;154};Ãëàâà 11.
Èñïîëüçîâàíèå OPENGL â MFC è VCLvoid _ _ f a s t c a l l FormPaint ( TObject * se nder ) ;// êîíñòðóêòîð_ _ f a s t c a l l OpenGLForm : : OpenGLForm(TComponent * owner ): TForm( owner ) ,m_pGLRC(NULL){}// â ýòîì ìåòîäå ðåàëèçóåì èíèöèàëèçàöèþvoid _ _ f a s t c a l l OpenGLForm : : FormCreate ({}TObject * se nder )m_pGLRC = new GLRC( Handle ) ;bool r e s = m_pGLRC−>Create ( ) ;assert ( res );// ç ä å ñ ü ðèñóåìvoid _ _ f a s t c a l l OpenGLForm : : FormPaint ({TObject * se nder )// äåëàåì òåêóùèìm_glRC−>MakeCurrent ( ) ;g l C l e a r (GL_COLOR_BUFFER_BIT |GL_DEPTH_BUFFER_BIT) ;// ðèñóåì òî, ÷òî õîòèì íàðèñîâàòü<ìåòîäû ðèñîâàíèÿ OpenGL>}m_glRC−>SwapBuffers ( ) ;// ç ä å ñ ü ïðîèñõîäèò äåèíèöèàëèçàöèÿ11.6. Èñïîëüçîâàíèå OPENGL C VCLvoid _ _ f a s t c a l l OpenGLForm : : FormDestroy ( ){}m_glRC−>Destroy ( ) ;delete m_glRC ;155Ãëàâà 12.OpenGL â .NET ýòîì ðàçäåëå ðàññìàòðèâàåòñÿ ïîñòðîåíèå îêîííîãî ïðèëîæåíèÿ ñ ïîääåðæêîé OpenGL íà ïëàòôîðìå Microsoft .NET.Íåñìîòðÿ íà òî, ÷òî OpenGL íå èìååò âñòðîåííîé ïîääåðæêè â .NET, â íàñòîÿùåå âðåìÿ ñóùåñòâóåò äîñòàòî÷íî ìíîãî ðåøåíèé, ïîçâîëÿþùèõ ïîäêëþ÷àòü OpenGL ê .NET-ïðîãðàììàì.Ìû ðàññìîòðèì ðàáîòó ñ îäíîé èç íèõ ñâîáîäíî-ðàñïðîñòðàíÿåìîé áèáëèîòåêîé Tao Framework.Tao Framåwork (http://www.taoframework.com) ðåàëèçóåò ïðîìåæóòî÷íûé óðîâåíü ìåæäó .NET ïðèëîæåíèåì è ðàçëè÷íûìèWin32-áèáëèîòåêàìè, â ÷àñòíîñòè GL, GLU, GLUT, WGL.12.1.
GLUT â ñðåäå Microsoft Visual C# 2005Ïðîñòåéøèì ñïîñîáîì ñîçäàíèÿ OpenGL-ïðèëîæåíèÿ ñ ñðåäå.NET ìîæíî ñ÷èòàòü èñïîëüçîâàíèå áèáëèîòåêè GLUT, äîñòóïíîé ÷åðåç .NET-êîìïîíåíòó Tao.FreeGlut.Äàëåå ïðèâîäÿòñÿ øàãè, íåîáõîäèìûå äëÿ ñîçäàíèÿ êîíñîëüíîãî .NET-ïðèëîæåíèÿ â ñðåäå Microsoft Visual C# 2005 íà C#ñ GLUT è OpenGL:157Ãëàâà 12. OPENGL â .NET158Óáåäèòüñÿ, ÷òî íà ìàøèíå óñòàíîâëåí GLUT (glut32.dll ëåæèò â Windows\System32). Ñîçäàíèå ïðîåêòà êîíñîëüíîãî ïðèëîæåíèÿ: FileProjectsVisual C#Windowsáðàòü èìÿ ïðîåêòà, OK.NewConsole Application, íà-Äîáàâëåíèå Tao ê ïðîåêòó: ProjectAdd Reference.NET,íàéòè â ñïèñêå ¾Tao Framework OpenGL Binding For .NET¿è ¾Tao Framework FreeGLUT Binding For .NET¿, âûäåëèòüîáà, ÎÊ. Åñëè êîìïîíåíò íåò â ñïèñêå, íåîáõîäèìî íàéòèèõ â èíñòàëëÿöèîííîì êàòàëîãå áèáëèîòåêè Tao Frameworkè äîáàâèòü ÷åðåç âêëàäêó Browse.Ïðîãðàììèðîâàíèå ñ èñïîëüçîâàíèå GLUT è OpenGL â .NETíà C# ïðàêòè÷åñêè íå îòëè÷àåòñÿ îò âàðèàíòà äëÿ Win32 è C++.Íèæå ïðèâåäåí ïðèìåð ïðîñòîé ïðîãðàììû, àíàëîãè÷íîé ïðèìåðó èç ï.2.5:Ïðîãðàììà 12.1.
Ïðîñòîé ïðèìåð OpenGL â C#.using Tao . FreeGlut ;using Tao . OpenGl ;namespace gl_glut_net{class Program{private static int Width = 5 1 2 ;private static int Height = 5 1 2 ;public const int CubeSize = 2 0 0 ;static void Display ( ){int l e f t , r i g h t , top , bottom ;12.1. GLUT â ñðåäå MICROSOFT VISUAL C# 2005l e f t = ( Width − CubeSize ) / 2 ;r i g h t = l e f t + CubeSize ;bottom = ( Height − CubeSize ) / 2 ;top = bottom + CubeSize ;Gl . g l C l e a r C o l o r ( 0 . 7 f , 0 . 7 f , 0 . 7 f , 1 ) ;Gl . g l C l e a r ( Gl .GL_COLOR_BUFFER_BIT) ;Gl . glColor3ub ( 2 5 5 , 0 , 0 ) ;Gl . g l B e g i n ( Gl .GL_QUADS) ;Gl .
g l V e r t e x 2 f ( l e f t , bottom ) ;Gl . g l V e r t e x 2 f ( l e f t , top ) ;Gl . g l V e r t e x 2 f ( r i g h t , top ) ;Gl . g l V e r t e x 2 f ( r i g h t , bottom ) ;Gl . glEnd ( ) ;}Gl . g l F i n i s h ( ) ;static void Reshape ( int w, int h ){Width = w;Height = h ;Gl .
glViewport ( 0 , 0 , w, h ) ;Gl . glMatrixMode ( Gl .GL_PROJECTION) ;Gl . g l L o a d I d e n t i t y ( ) ;Gl . glOrtho ( 0 , w, 0 , h , − 1.0 , 1 . 0 ) ;}Gl . glMatrixMode ( Gl .GL_MODELVIEW) ;Gl . g l L o a d I d e n t i t y ( ) ;static void Keyboard ( byte key , int x , int y )159Ãëàâà 12.
OPENGL â .NET160{const int ESCAPE = 2 7 ;i f ( key == ESCAPE)Glut . glutLeaveMainLoop ( ) ;}static void Main ( s t r i n g [ ] a r g s ){Glut . g l u t I n i t ( ) ;Glut . g l u t I n i t D i s p l a y M o d e ( Glut .GLUT_RGB) ;Glut . glutInitWindowSize ( Width , Height ) ;Glut . glutCreateWindow ( "Red square example " ) ;Glut . glutDisplayFunc ( Display ) ;Glut . glutReshapeFunc ( Reshape ) ;Glut . glutKeyboardFunc ( Keyboard ) ;}}}Glut . glutMainLoop ( ) ;Îáðàòèòå âíèìàíèå, ÷òî âñå êîìàíäû è êîíñòàíòû GL, GLUè GLUT íàõîäÿòñÿ â ïðîñòðàíñòâàõ èìåíGl, Glu è Glut, ñîîòâåò-ñòâåííî.12.2.
Èñïîëüçîâàíèå OpenGL â WindowsFormsOpenGL â WindowsForms òðåáóåò èíèöèàëèçàöèè, àíàëîãè÷íîé ðàññìîòðåííîé äëÿ áèáëèîòåê MFC è VCL (ñì. ï.11). ÂTao Framework óæå ðåàëèçîâàí ïðîñòîé êëàññ îêíà OpenGL Tao.Platform.Windows.SimpleOpenGlControl.Ðàññìîòðèì ïîñëåäîâàòåëüíîñòü äåéñòâèé, íåîáõîäèìóþ äëÿ12.2. Èñïîëüçîâàíèå OPENGL â WINDOWSFORMS161ñîçäàíèÿ ïðîñòîãî îêîííîãî ïðèëîæåíèÿ â WindowsForms è ñïîääåðæêîé OpenGL: Ñîçäàíèå ïðîåêòà ïðèëîæåíèÿ: FileC#Windowsòà, OK.NewProjectsVisualWindows Application, íàáðàòü èìÿ ïðîåê-Äîáàâëåíèå Tao ê ïðîåêòó: ProjectAdd Reference.NET,íàéòè â ñïèñêå ¾Tao Framework OpenGL Binding For .NET¿è ¾Tao Framework Windows Platform API Binding For .NET¿,âûäåëèòü îáà, ÎÊ.
Åñëè êîìïîíåíò íåò â ñïèñêå, íåîáõîäèìî íàéòè èõ â èíñòàëëÿöèîííîì êàòàëîãå áèáëèîòåêè TaoFramework è äîáàâèòü ÷åðåç âêëàäêó Browse.×òîáû óäîáíî ñîçäàòü îêíî OpenGL, íåîáõîäèìî äîáàâèòüñîîòâåòñòâóþùèé îáúåêò íà ïàíåëü èíñòðóìåíòîâ. Äëÿýòîãî íóæíî â êîíòåêñòíîì ìåíþ ïàíåëè ¾Toolbox¿ âûáðàòü ïóíêò ¾Choose Items...¿, â ïîÿâèâøåìñÿ ñïèñêå íàéòè ¾SimpleOpenGLControl¿, ïîñòàâèòü ãàëî÷êó îêîëî íåãî,ÎÊ.Äîáàâëåíèå îêíà OpenGL íà ôîðìó: íà ïàíåëè ¾Toolbox¿íàéäèòå ¾SimpleOpenGLControl¿ è ïåðåòàùèòå íà ôîðìóïðèëîæåíèÿ. Îêíî äîëæíî çàïîëíÿòüñÿ ÷åðíûì öâåòîì.Èíèöèàëèçàöèÿ OpenGL: â êîíñòðóêòîðå ôîðìû ïîñëå âû-InitializeComponent() äîáàâèòü âûçîâ ôóíêöèè ñîçäàíèÿêîíòåêñòà simpleOpenGlControl1.InitializeContexts().çîâàÔóíêöèè ðèñîâàíèÿ OpenGL ìîæíî äîáàâëÿòü â îáðàáîò÷èêñîáûòèÿPaintîêíà OpenGL (íå ïóòàòü ñPaintôîðìû).×àñòü IVÏðèëîæåíèÿ163Ïðèëîæåíèå À.Ïðèìèòèâû áèáëèîòåêGLU è GLUTÐàññìîòðèì ñòàíäàðòíûå êîìàíäû ïîñòðîåíèÿ ïðèìèòèâîâ,êîòîðûå ðåàëèçîâàíû â áèáëèîòåêàõ GLU è GLUT.×òîáû ïîñòðîèòü ïðèìèòèâ èç áèáëèîòåêè GLU, íàäî ñíà÷àëà ñîçäàòü óêàçàòåëü íà quadric-îáúåêò ñ ïîìîùüþ êîìàí-gluNewQuadric(), à çàòåì âûçâàòü îäíó èç êîìàíä gluSphere(),gluCylinder(), gluDisk(), gluPartialDisk() .
Ðàññìîòðèì ýòè êîìàíäûäûîòäåëüíî:void gluSphere ( GLUquadricObj* qobj , GLdouble radius ,GLint s l i c e s , GLint s t a c k s )Ýòà ôóíêöèÿ ñòðîèò ñôåðó ñ öåíòðîì â íà÷àëå êîîðäèíàò èðàäèóñîìradius.Ïðè ýòîì ÷èñëî ðàçáèåíèé ñôåðû âîêðóã îñè zçàäàåòñÿ ïàðàìåòðîìslices ,à âäîëü îñè z ïàðàìåòðîìvoid g l u C y l i n d e r ( GLUquadricObjstacks .* qobj ,GLdouble baseRadius ,GLdouble topRadius ,GLdouble height , GLint s l i c e s ,GLint s t a c k s )165Ïðèëîæåíèå À. Ïðèìèòèâû áèáëèîòåê GLU è GLUT166Äàííàÿ ôóíêöèÿ ñòðîèò öèëèíäð áåç îñíîâàíèé (êîëüöî),ïðîäîëüíàÿ îñü ïàðàëëåëüíà îñè z, çàäíåå îñíîâàíèå èìååò ðàäèóñbaseRadius,è ðàñïîëîæåíî â ïëîñêîñòètopRadiusîñíîâàíèå èìååò ðàäèóñz = 0,ïåðåäíååè ðàñïîëîæåíî â ïëîñêîñòèz = height.
Åñëè çàäàòü îäèí èç ðàäèóñîâ ðàâíûì íóëþ, òî áóäåòïîñòðîåí êîíóñ. Ïàðàìåòðûslicesèstacksèìåþò àíàëîãè÷íûéñìûñë, ÷òî è â ïðåäûäóùåé êîìàíäå.void gluDisk ( GLUquadricObj* qobj ,GLdouble innerRadius ,GLdouble outerRadius ,GLint s l i c e s ,GLint l o o p s )Ôóíêöèÿ ñòðîèò ïëîñêèé äèñê (êðóã) ñ öåíòðîì â íà÷àëå êîîðäèíàò è ðàäèóñîìouterRadius.
Åñëè çíà÷åíèå innerRadius îòëè÷-íî îò íóëÿ, òî â öåíòðå äèñêà áóäåò íàõîäèòüñÿ îòâåðñòèå ðàäèóñîìinnerRadius.slices çàäàåò ÷èñëî ðàçáèåíèé äèñêàloops ÷èñëî êîíöåíòðè÷åñêèõ êîëåö,Ïàðàìåòðâîêðóã îñè z, à ïàðàìåòðïåðïåíäèêóëÿðíûõ îñè z.void g l u P a r t i a l D i s k ( GLUquadricObj* qobj ,GLdouble innerRadius ,GLdouble outerRadius ,GLint s l i c e s ,GLint loops ,GLdouble s t a r t A n g l e ,GLdouble sweepAngle ) ;Îòëè÷èå ýòîé êîìàíäû îò ïðåäûäóùåé çàêëþ÷àåòñÿ â òîì,÷òî îíà ñòðîèò ñåêòîð êðóãà, íà÷àëüíûé è êîíå÷íûé óãëû êîòîðîãî îòñ÷èòûâàþòñÿ ïðîòèâ ÷àñîâîé ñòðåëêè îò ïîëîæèòåëüíîãî íàïðàâëåíèÿ îñè y è çàäàþòñÿ ïàðàìåòðàìèsweepAngle.startAngleèÓãëû èçìåðÿþòñÿ â ãðàäóñàõ.Êîìàíäû, ïðîâîäÿùèå ïîñòðîåíèå ïðèìèòèâîâ èç áèáëèîòåêè GLUT, ðåàëèçîâàíû ÷åðåç ñòàíäàðòíûå ïðèìèòèâû OpenGL167è GLU.
Äëÿ ïîñòðîåíèÿ íóæíîãî ïðèìèòèâà äîñòàòî÷íî ïðîèçâåñòè âûçîâ ñîîòâåòñòâóþùåé êîìàíäû.void g l u t S o l i d S p h e r evoid glutWireSphereÊîìàíäà( GLdouble radius ,GLint s l i c e s ,GLint s t a c k s )( GLdouble radius ,GLint s l i c e s ,GLint s t a c k s )glutSolidSphere()ñòðîèò ñôåðó, àglutWireSphere() êàðêàñ ñôåðû ðàäèóñîì radius. Îñòàëüíûå ïàðàìåòðû òå æå, ÷òîè â ïðåäûäóùèõ êîìàíäàõ.void g lu t So l id Cu b e ( GLdouble s i z e )void glutWireCube ( GLdouble s i z e )Êîìàíäû ñòðîÿò êóá èëè êàðêàñ êóáà ñ öåíòðîì â íà÷àëåêîîðäèíàò è äëèíîé ðåáðà size.void g l u t S o l i d C o n evoid glutWireCone( GLdouble base , GLdouble height ,GLint s l i c e s , GLint s t a c k s )( GLdouble base , GLdouble height ,GLint s l i c e s , GLint s t a c k s )Ýòè êîìàíäû ñòðîÿò êîíóñ èëè åãî êàðêàñ âûñîòîéheightèðàäèóñîì îñíîâàíèÿ base, ðàñïîëîæåííûé âäîëü îñè z.
Îñíîâàíèå íàõîäèòñÿ â ïëîñêîñòè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.