強火で進め

このブログではプログラム関連の記事を中心に書いてます。

Macでの「The OpenGL Programming Guide」のサンプルの実行方法の解説をザックリと行う(15)

Example 6-2のサンプルが分かりづらいので代わりのサンプルを用意しました。こちらを参照下さい。

【手順】
1. こちらと同様にプロジェクトを作成し、 main.c の中身を以下のものと入れ替えて下さい。

#include <stdlib.h>
#include <stdio.h>
#include <OpenGL/gl.h>
#include <OpenGL/glu.h>
#include <GLUT/glut.h>

#define MAX_X 0.2
#define MIN_X -0.7
#define INC_X 0.03
static float solidX = MAX_X;
static float transparentX = MIN_X;
static GLuint sphereList, cubeList;

static void init(void)
{
	GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 0.15 };
	GLfloat mat_shininess[] = { 100.0 };
	GLfloat position[] = { 0.5, 0.5, 1.0, 0.0 };
	
	glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
	glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);
	glLightfv(GL_LIGHT0, GL_POSITION, position);
	
	glEnable(GL_LIGHTING);
	glEnable(GL_LIGHT0);
	glEnable(GL_DEPTH_TEST);
	
	sphereList = glGenLists(1);
	glNewList(sphereList, GL_COMPILE);
	glutSolidSphere (0.4, 16, 16);
	glEndList();
	
	cubeList = glGenLists(1);
	glNewList(cubeList, GL_COMPILE);
	glutSolidCube (0.6);
	glEndList();
}

void display(void)
{
	GLfloat mat_solid[] = { 0.75, 0.75, 0.0, 1.0 };
	GLfloat mat_zero[] = { 0.0, 0.0, 0.0, 1.0 };
	GLfloat mat_transparent[] = { 0.0, 0.8, 0.8, 0.6 };
	GLfloat mat_emission[] = { 0.0, 0.3, 0.3, 0.6 };
	
	glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	
	glPushMatrix ();
	glTranslatef (solidX, -0.15, 0.0);
	glMaterialfv(GL_FRONT, GL_EMISSION, mat_zero);
	glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_solid);
	glCallList (sphereList);
	glPopMatrix ();
	
	glPushMatrix ();
	glTranslatef (transparentX, 0.15, 0.0);
	glRotatef (15.0, 1.0, 1.0, 0.0);
	glRotatef (30.0, 0.0, 1.0, 0.0);
	glMaterialfv(GL_FRONT, GL_EMISSION, mat_emission);
	glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_transparent);
	glEnable (GL_BLEND);
	glDepthMask (GL_FALSE);
	glBlendFunc (GL_SRC_ALPHA, GL_ONE);
	glCallList (cubeList);
	glDepthMask (GL_TRUE);
	glDisable (GL_BLEND);
	glPopMatrix ();
	
	glutSwapBuffers();
}

void reshape(int w, int h)
{
	glViewport(0, 0, (GLint) w, (GLint) h);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	if (w <= h)
		glOrtho (-1.5, 1.5, -1.5*(GLfloat)h/(GLfloat)w,
				 1.5*(GLfloat)h/(GLfloat)w, -10.0, 10.0);
	else
		glOrtho (-1.5*(GLfloat)w/(GLfloat)h,
				 1.5*(GLfloat)w/(GLfloat)h, -1.5, 1.5, -10.0, 10.0);
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
}

void animate(int type)
{
	if (type == 0){
		if (solidX > MIN_X){
			solidX -= INC_X;
			transparentX += INC_X;
		}
	}else{
		if (solidX < MAX_X){
			solidX += INC_X;
			transparentX -= INC_X;
		}
	}
	display();
}

void keyboard(unsigned char key, int x, int y)
{
	switch (key) {
		case 'z':
			animate(0);
			break;
		case 'x':
			animate(1);
			break;
		case 27:
			exit(0);
    }
}

int main(int argc, char** argv)
{
	glutInit(&argc, argv);
	glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);
	glutInitWindowSize(500, 500);
	glutCreateWindow(argv[1]);
	init();
	glutReshapeFunc(reshape);
	glutKeyboardFunc(keyboard);
	glutDisplayFunc(display);
	glutMainLoop();
	return 0;
}

2. ビルドし、実行。以下のキー入力でテストできます。

 z : 球とボックスが移動。
 x : 球とボックスがzキーのときは逆に移動。