opengl cpp 1ファイルで書いた例 サンプル コード例

f:id:peroon:20100926044727j:image

そろそろクラスに分けたくなってきたので、1ファイルにC言語的に関数の集合で書くのは終わりにしよう。
そこで、これまでに書いたコードを下記においておこうと思う。取っ掛かりには良いと思う。
【要素】
・マウス処理
・線や球の描画
・ウィンドウのサイズ変更
・透視投影 など
#include <gl/glut.h>
#include <stdio.h>
#include <string.h>

int mouseX=0;
int mouseY=0;

//文字列を指定位置に描画
void drawString(char* str, int x, int y){
	glRasterPos2d(x,y);
	void *font = GLUT_BITMAP_TIMES_ROMAN_24;
	for(unsigned int i=0; i<strlen(str); i++){
		glutBitmapCharacter(font, str[i]);
	}
}

//アイドル時に呼ばれる関数
void idle(void){
	glutPostRedisplay();//暇なら再描画せよ
}

//軸の描画
void drawAxis(void){
	glBegin(GL_LINES);
	
	glColor3d(1,0,0);
	glVertex3d(0,0,0);
	glVertex3d(100,0,0);

	glColor3d(0,1,0);
	glVertex3d(0,0,0);
	glVertex3d(0,100,0);

	glColor3d(0,0,1);
	glVertex3d(0,0,0);
	glVertex3d(0,0,100);

	glEnd();
}

//ディスプレイが変形されたときにのみ呼ばれる
void display(void)
{
	glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);

	char str[] = "helloOpenGL";
	drawString(str,mouseX,mouseY);

	glLoadIdentity();

	//lookAt
	gluLookAt(3.0, 4.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
	
	//図形の回転
	static float r = 0.0f; //回転角
	glRotated((double)r, 0.0, 1.0, 0.0);
	r += 1.00;
	if(r >= 360){r=0;}

	//図形の描画
	glColor3d(1,1,1);
	glBegin(GL_LINE_LOOP);
	glVertex2d(-1.0,-1.0);
	glVertex2d(+1.0,-1.0);
	glVertex2d(+1.0,+1.0);
	glVertex2d(-1.0,+1.0);
	glEnd();

	drawAxis();

	//球の描画
	glutWireSphere(1, 8, 8);

	glutSwapBuffers();
}

void init(void)
{
	glClearColor(0.7, 0.7, 0.7, 1.0);//背景色
	glEnable(GL_DEPTH_TEST);
}

//ウィンドウのサイズ変更時
void resize(int w, int h)
{
	glViewport(0,0,w,h);

	//透視変換行列の設定
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	gluPerspective(30.0, (double)w / (double)h, 1.0, 100.0);
	
	//モデルビュー変換行列の設定
	glMatrixMode(GL_MODELVIEW);
}

//マウス処理
void mouse(int button, int state, int x, int y)
{
	mouseX=x;
	mouseY=y;

	switch(button){
	case GLUT_LEFT_BUTTON:
		printf("left");
		break;
	case GLUT_MIDDLE_BUTTON:
		printf("middle");
		break;
	case GLUT_RIGHT_BUTTON:
		printf("right");
		break;
	default:
		break;
	}
	printf(" button is ");
	
	switch(state){
	case GLUT_UP:
		printf("up");
		break;
	case GLUT_DOWN:
		printf("down");

		//マウス押下時にidle関数が呼ばれる
		glutIdleFunc(idle);

		break;
	default:
		break;
	}
}

int main(int argc, char* argv[])
{
	glutInitWindowPosition(100,100);
	glutInitWindowSize(640,480);
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_RGBA|GLUT_DOUBLE|GLUT_DEPTH);
	glutCreateWindow("Display Size Trainer");
	glutDisplayFunc(display);
	glutReshapeFunc(resize);
	glutMouseFunc(mouse);
	init();
	glutMainLoop();
	return 0;
}