更新:2007/08/09 12:14:48

FTGL による文字表示

GLUT の文字表示関数 glutStrokeCharacter( ) および glutBitmapCharacter( ) は, 大きな文字を美しく表示できませんし,日本語にも対応していません. そこで,FTGL を導入し,文字を美しく表示できるようにしました.

Fig. FTGL 利用デモプログラムのスクリーンショット

FTGL のインストール

まず,ソースファイル ftgl-2.1.2.tar.gz Henry Maddocks' Home Page からダウンロードしました.

次のようにして,インストールしました.

標準の設定では, ヘッダファイルは /usr/local/include/FTGL/ へ, ライブラリは /usr/local/lib/ へ入りました.

なお,FTGL をインストールするには,freetype2 が必要なようです. FC5 では,普通にインストールされていると思いますが, もし入っていなければ,入れておきましょう.


FTGL の基本的な利用方法

FTGL は,C++ のクラスライブラリなので, アプリケーションのソースコードも C++ で書かなきゃならないようです. えーと,私,C++ で書いた経験が無かったのですが... ま,gcc ならば,C のコードと混在していても無問題なので, 恐れることはありませんでした.

基本的には,次のようなコードで OK. (もちろん実際には,この他に, OpenGL によって位置や色などを指定してやる必要があります.)

#include <FTGL/FTGLPolygonFont.h>
#define FONT "/usr/share/fonts/japanese/TrueType/sazanami-gothic.ttf"
#define SIZE  1.0
#define DEPTH 0.5

FTFont *font;
font = new FTGLPolygonFont(FONT);
if (font->Error()) exit(1);                        // can't open font file
if (!font->FaceSize(SIZE)) exit(1);                // can't set font size
if (!font->CharMap(ft_encoding_unicode)) exit(1);  // can't set charmap 
// font->Depth(DEPTH);    // for FTGLExtrdFont()
font->Render((wchar_t *)"Hello World.");

FTGLPolygonFont の代わりに FTGLExtrdFont を使えば, 立体的な(厚みのある)文字を描けます. 詳しくはヘッダファイルを参照.

コンパイル方法は次の通りです.

% g++ -c ソース.c -I/usr/local/include -I/usr/include/freetype2
% g++ オブジェクト.o -lglut -lftgl -lfreetype -o プログラム

FTGL の簡単な利用方法

文字コードについて, 私は LANG=ja_JP.eucJP として運用しているんですが... FTGL は EUC を取り扱えないようです. 文字列を Render( ) する前に, 文字コードをユニコードか Shift-JIS へ変換しなきゃなりません.

また,文字列の表示位置の基準点は, ベースラインの左端に設定されています. しかし,センタリングしておく方が便利な場合が多いでしょう.

というわけで,FTGL を(自分にとって)便利に使うための関数を作りました.

#include <GL/gl.h>
#include <iconv.h>
#include <FTGL/FTGLPolygonFont.h>

int convert(char *inbuf, char *outbuf, size_t os)
{
	iconv_t conv;
	char    *in, *out;
	size_t  is;

	in = inbuf;
	out = outbuf;
	is = (size_t)(strlen(inbuf)+1);

	if ((conv = iconv_open("WCHAR_T", "EUC-JP")) == (iconv_t)(-1)) return (1);	// can't open 
	if (iconv(conv, &in, &is, &out, &os) == (size_t)(-1)) return (2);	// can't convert
	iconv_close(conv);
	return (0);
}

void drawString(FTFont *font, char *str)
{
	char   outstr[256];
	float  llx, lly, llz;
	float  urx, ury, urz;

	if (convert(str, outstr, 256)) return;

	font->BBox((wchar_t *)outstr, llx, lly, llz, urx, ury, urz);
	glPushMatrix();
		glTranslatef(-(llx+urx)/2.0, -(lly+ury)/2.0, 0.0);
		font->Render((wchar_t *)outstr);
	glPopMatrix();
}

FTFont *font;
...

glTranslatef(...);
glRotatef(...);
glScalef(...);
glColor3f(...);
drawString(font, "お晩です");

drawString( ) は, glutSolidCube( ) などと同様の描画オブジェクトです.


(c) 2006, yanagawa@kushiro-ct.ac.jp