本文在
第11篇文章
的基础上,为其加入显示各种二次曲面的代码;
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类中加入下列变量,用来表示二次曲面类型:
//
Quadric
GLuint m_Quadric;
2,加入四个控制二次曲面类型的菜单项及其事件处理函数
void
CCY457OpenGLView::OnQuadricSphere()
{
//
球体
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,绘制函数修改如下:
void
CCY457OpenGLView::RenderScene ()
{
//
绘制函数
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);
}