更新:2007/08/09 12:14:48
GLUT の文字表示関数 glutStrokeCharacter( ) および glutBitmapCharacter( ) は, 大きな文字を美しく表示できませんし,日本語にも対応していません. そこで,FTGL を導入し,文字を美しく表示できるようにしました.
まず,ソースファイル ftgl-2.1.2.tar.gz を Henry Maddocks' Home Page からダウンロードしました.
次のようにして,インストールしました.
% tar zxvf ftgl-2.1.2.tar.gz
FC5 の場合,コンパイラが新しすぎる(厳格すぎる)ようで, コンパイルするためにはソースの修正が必要でした. include/FTTextureGlyph.h の 55 行目を
static void FTTextureGlyph::ResetActiveTexture(){ activeTextureID = 0;}
static void ResetActiveTexture(){ activeTextureID = 0;}
% cd FTGL/unix % ./configure % make % su # make install
標準の設定では, ヘッダファイルは /usr/local/include/FTGL/ へ, ライブラリは /usr/local/lib/ へ入りました.
なお,FTGL をインストールするには,freetype2 が必要なようです. FC5 では,普通にインストールされていると思いますが, もし入っていなければ,入れておきましょう.
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 プログラム
文字コードについて, 私は 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( ) などと同様の描画オブジェクトです.