Quadrics
Every quadric has a few settings associated with it. We have to create a quadric first and then customize its settings to render the shape we want. The gluNewQuadric function creates a state variable that describes the current drawing style, orientation, lighting mode, texturing mode and the callback functions. Once we use this function to create a new quadric, we can customize the drawing of shapes by changing its state using functions such as
gluQuadricDrawStyle - which selects the type of OpenGL drawing primitives that are used to drw the shape.
gluQuadricOrientation - which controls the direction of the lighting normals.
gluQuadricNormals - which controls the generation of lighting normals.
gluQuadricTexture - which generates texture coordinates automatically for the quadric.
1,在CCY457OpenGLView类中加入下列变量,用来表示二次曲面类型:
GLuint m_Quadric;
2,加入四个控制二次曲面类型的菜单项及其事件处理函数
{ // 球体
m_Quadric = 0 ;
InvalidateRect(NULL,FALSE);
}
void CCY457OpenGLView::OnUpdateQuadricSphere(CCmdUI * pCmdUI)
{
if (m_Quadric == 0 )
pCmdUI -> SetRadio(TRUE);
else
pCmdUI -> SetRadio(FALSE);
}
void CCY457OpenGLView::OnQuadricCone()
{ // 圆锥
m_Quadric = 2 ;
InvalidateRect(NULL,FALSE);
}
void CCY457OpenGLView::OnUpdateQuadricCone(CCmdUI * pCmdUI)
{
if (m_Quadric == 2 )
pCmdUI -> SetRadio(TRUE);
else
pCmdUI -> SetRadio(FALSE);
}
void CCY457OpenGLView::OnQuadricCylinder()
{ // 柱体
m_Quadric = 1 ;
InvalidateRect(NULL,FALSE);
}
void CCY457OpenGLView::OnUpdateQuadricCylinder(CCmdUI * pCmdUI)
{
if (m_Quadric == 1 )
pCmdUI -> SetRadio(TRUE);
else
pCmdUI -> SetRadio(FALSE);
}
void CCY457OpenGLView::OnQuadricDisk()
{ // 圆盘
m_Quadric = 3 ;
InvalidateRect(NULL,FALSE);
}
void CCY457OpenGLView::OnUpdateQuadricDisk(CCmdUI * pCmdUI)
{
if (m_Quadric == 3 )
pCmdUI -> SetRadio(TRUE);
else
pCmdUI -> SetRadio(FALSE);
}
void CCY457OpenGLView::OnQuadricPartialdisk()
{ /// /半圆盘
m_Quadric = 4 ;
InvalidateRect(NULL,FALSE);
}
void CCY457OpenGLView::OnUpdateQuadricPartialdisk(CCmdUI * pCmdUI)
{
if (m_Quadric == 4 )
pCmdUI -> SetRadio(TRUE);
else
pCmdUI -> SetRadio(FALSE);
}
3,绘制函数修改如下:
{ // 绘制函数
glTranslatef( 0.0f , 0.0f , - 5.0f );
glRotatef(m_xRot, 1.0f , 0.0f , 0.0f );
glRotatef(m_yRot, 0.0f , 1.0f , 0.0f );
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D,m_Texture[ 0 ]);
GLUquadricObj * obj;
obj = gluNewQuadric();
gluQuadricNormals(obj, GLU_SMOOTH);
gluQuadricTexture(obj, GL_TRUE);
switch (m_Quadric)
{
case 0 : gluSphere(obj, 1 , 20 , 20 );
break ;
case 1 : gluCylinder(obj, 1 , 1 , 3 , 20 , 20 );
break ;
case 2 : gluCylinder(obj, 0.1 , 1 , 3 , 20 , 20 );
break ;
case 3 : gluDisk(obj, 0.5 , 1 , 20 , 20 );
break ;
case 4 : gluPartialDisk(obj, 0.5 , 1 , 20 , 20 , 10 , 180 );
break ;
}
glDisable(GL_TEXTURE_2D);
}