FTGLの導入その4

なんかよくわからないけど

freetype.lib ftgl_static_D.lib

をリンクしたらコンパイルできました。freetype235.libとかわけのわからないライブラリをリンクしてたからコンパイルが通らなかったようです。はい。
というわけで作成したサンプルプログラムをのっけときます。
無断複製、転載許可。ただし自己責任でにょろ。

/**
 * @file FTGLのサンプルファイル
 *
 * @author HOSHIMI's WORKS 2008
 * @note 無断転載改変許可。ただし何が起きても責任は自分でおとりください。
 */
#include "stdafx.h"
#include <math.h>
#include <glut.h>
#include <FTGL/FTGLPolygonFont.h>
#define FONT "C:/WINDOWS/Fonts/MSGOTHIC.ttc"
#define SIZE  1.0
#define DEPTH 0.5

//MouseAction
enum MouseMode{
	MOUSE_TUMBLE,	//回転
	MOUSE_TRACK,	//平行移動
	MOUSE_DOLLY		//ズーム
} s_nMode;

static int s_nWidth,s_nHeight;

static int s_nX,s_nY;
//ズーム
static double s_nZoom,s_nZoomOld;
//平行移動
static double s_nTransX,s_nTransY,s_nTransZ,s_nTransOldX,s_nTransOldY,s_nTransOldZ;
//角度
static double s_nPhi,s_nTheta,s_nPhiOld,s_nThetaOld;

static FTFont *font;

void initLight(){
	GLfloat mat_specular[] = {1.0,1.0,1.0,1.0};
	GLfloat mat_shininess[] = {50.0};
	GLfloat lightPosition[] = {1.0,1.0,1.0,0.0};
	GLfloat white_light[] = {1.0,1.0,1.0,1.0};
	GLfloat lmodel_ambient[] = {0.1,0.1,0.1,1.0};

	glClearColor(0.0,0.0,0.0,0.0);
	glShadeModel(GL_SMOOTH);
	glMaterialfv(GL_FRONT,GL_SPECULAR,mat_specular);
	glMaterialfv(GL_FRONT,GL_SHININESS,mat_shininess);
	glLightfv(GL_LIGHT0,GL_POSITION,lightPosition);
	glLightfv(GL_LIGHT0,GL_DIFFUSE,white_light);
	glLightfv(GL_LIGHT0,GL_SPECULAR,white_light);
	glLightModelfv(GL_LIGHT_MODEL_AMBIENT,lmodel_ambient);

	glEnable(GL_LIGHTING);
	glEnable(GL_LIGHT0);
	glEnable(GL_DEPTH_TEST);
}

void init(){
	initLight();

	s_nZoom = 1.0;

	s_nTheta = 30.0;
	s_nPhi = 0.0;

	s_nTransX = s_nTransY = s_nTransZ = 0.0;

	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()

}
void myDisplay(void)
{
	
	glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
	glColor3f(1.0,1.0,1.0);
	glLoadIdentity();
	gluLookAt(0.0,0.0,5.0,
		0.0,0.0,0.0,
		0.0,1.0,0.0);
	glTranslatef(s_nTransX/50.0,s_nTransY/50.0,s_nTransZ/50.0);
	glScaled(s_nZoom,s_nZoom,s_nZoom);
	glRotatef(s_nTheta,1.0,0.0,0.0);
	glRotatef(s_nPhi,0.0,1.0,0.0);

	font->Render((wchar_t *)L"私のたわし");

	glPushMatrix();
	glTranslatef(0.0,-1.0,0.0);
	glEnable(GL_LIGHTING);
	glColor4d(1.0,1.0,1.0,1.0);
	glutSolidTeapot(1.0);
	glDisable(GL_LIGHTING);
	glPopMatrix();

	glutSwapBuffers();
}

void mouseEvent(int button,int state,int nX,int nY){
	s_nX = nX;
	s_nY = nY;
	switch(button){
		case GLUT_LEFT_BUTTON:
			if(state == GLUT_DOWN){
				s_nPhiOld = s_nPhi;
				s_nThetaOld = s_nTheta;

				s_nMode = MOUSE_TUMBLE;
			}
			break;
		case GLUT_MIDDLE_BUTTON:
			if(state == GLUT_DOWN){
				s_nMode = MOUSE_TRACK;

				s_nTransOldX = s_nTransX;
				s_nTransOldY = s_nTransY;
				s_nTransOldZ = s_nTransZ;
			}
			break;
		case GLUT_RIGHT_BUTTON:
			if(state == GLUT_DOWN){
				s_nZoomOld = s_nZoom;
				s_nMode = MOUSE_DOLLY;
			}
			break;
	}
}

void mouseMove(int nX,int nY){
	switch(s_nMode){
		case MOUSE_TUMBLE:
			s_nPhi = s_nPhiOld + 90.0*( s_nX - nX )/s_nWidth;
			s_nTheta = s_nThetaOld + 90.0*( s_nY - nY )/s_nHeight;
			break;
		case MOUSE_TRACK:
			s_nTransX = s_nTransOldX + s_nZoom*(s_nX - nX)*cos(s_nPhi/180)*cos(s_nTheta/180);
			s_nTransY = s_nTransOldY + s_nZoom*(s_nY - nY)*sin(s_nTheta/180);
			s_nTransZ = s_nTransOldZ + s_nZoom*(s_nX - nX)*sin(s_nPhi/180)*cos(s_nTheta/180);
			break;
		case MOUSE_DOLLY:
			s_nZoom = s_nZoomOld*exp((double)(nY-s_nY)/s_nHeight);
			break;
	}
}


void myIdle()
{
	glutPostRedisplay();
}

void reshape(int w,int h){
	s_nWidth = w;
	s_nHeight = h;
	
	glViewport(0,0,(GLsizei)w,(GLsizei)h);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	glFrustum(-1.0,1.0,-1.0,1.0,1.5,20.0);
	glMatrixMode(GL_MODELVIEW);
}
void myKeyboard(unsigned char key, int x, int y)
{
	if( key == '\033' )
	{
		return;
	}else{
	}
	glutPostRedisplay();
}

int _tmain(int argc, char* argv[])
{
	//サイズの初期化
	s_nWidth =1024;
	s_nHeight = 600;

	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA|GLUT_DEPTH);
	glutInitWindowSize(s_nWidth,s_nHeight);
	glutInitWindowPosition(100,100);
	glutCreateWindow("test");

	init();

	glutDisplayFunc(myDisplay);
	glutIdleFunc(myIdle);
	glutReshapeFunc(reshape);
	glutMouseFunc(mouseEvent);
	glutMotionFunc(mouseMove);
	glutKeyboardFunc(myKeyboard);
	glutMainLoop();
	return 0;
}

マウスでぐりぐりといじれます。仕様はAutodeskMayaのマウス操作と同じはず。

実行結果はこちら。