3D font

Sample Image

In this article, I give a wrap class which encapsulate the OpenGL 3D Font functions. With this class, you can design any 3D letter as a 3D geometry object, translating, scaling, rotating, texture mapping, etc.

The key steps to display a 3D letter is:

1) Create a display list

2) Create and set a font to current windows context device, wglUseFontOutlines function can retrieve the 3d Font geometry data from the context device.

3) call glListBase and glCallLists to display 3D font letters.

The wglUseFontOutlines function calculate the 3D font geometry data from the mathmatic module of Windows system TrueType fonts library.

My 3D font class contain position, material color data and content string. It can be used as a separate geometry object in a multiple 3D objects scene.

Here is a small example:

class C3DFontView : public CView
{
...
CGLFont m_FontX; // Declare a font object in your view class
...
};

int CMy3DFontView::OnCreate(LPCREATESTRUCT lpCreateStruct) // Create view
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
/*
** Setup font attributes
*/
m_FontX.SetXOffset(-0.4f);
m_FontX.SetYOffset(-0.4f);
m_FontX.SetXScale(1.4f);
m_FontX.SetYScale(1.3f);
m_FontX.SetZScale(0.8f);
m_FontX.SetXRotate(-20.0f);
m_FontX.SetYRotate(-6.0f);
m_FontX.SetZRotate(90.0f);

wglMakeCurrent(m_pDC->m_hDC,m_hRC);
m_FontX.SetFontType(GL_FONT_SOLID); // Select font type
m_FontX.CreateFont(m_pDC, "Arial Black"); // Create the font
m_FontX.SetText("Xing"); // Select text to render

wglMakeCurrent(NULL,NULL);

}

void CMy3DFontView::OnDraw(CDC* pDC) // Draw method
{
CMy3DFontDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);

...

wglMakeCurrent(m_pDC->GetSafeHdc(), m_hRC);
DrawGLFont(); // Render the text
SwapBuffers(m_pDC->GetSafeHdc());
wglMakeCurrent(m_pDC->GetSafeHdc(), NULL);

}

void CMy3DFontView::DrawGLFont(void) // The render method
{
glShadeModel(GL_SMOOTH);
glEnable(GL_DEPTH_TEST);

//clear color buffer
glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

//set light model
glLightfv(GL_LIGHT0, GL_AMBIENT, m_Lightambient); //set light ambient
glLightfv(GL_LIGHT0, GL_DIFFUSE, m_Lightdiffuse); //set light specular
glLightfv(GL_LIGHT0, GL_SPECULAR, m_Lightspecular); //set light specular
glLightfv(GL_LIGHT0, GL_POSITION, m_Lightposition); //set light position

glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

glTranslatef(-0.5f, 0.0f, -5.0f);

m_FontX.GLDrawText(); // Render the text

glFlush();

}

Downloads

Download demo project – 175 Kb

Download source – 3 Kb

History

Date Posted: February 26, 1999
Last Updated: July 6, 1999

Latest Posts

Related Stories