現在地 >> メニュー >> 基本編08 >> 基本編08::fastSolidTeapot >>基本編08::まとめコード5

問題


fastSolidTeapot関数を使ってティーポットを描画せよ。

答え

#include <GL/glut.h>

//--------- プロトタイプ宣言 -----------//
void display();
void reshape(int w, int h);
void timer(int value);

void DRAW_XYZ();

//------------ ティーポット描画用 ---------------//
/* Copyright NVIDIA Corporation, 1999. */
static int patchdata[][16] =
{
	/* rim */
	{102, 103, 104, 105, 4, 5, 6, 7, 8, 9, 10, 11,
	12, 13, 14, 15},

	/* body */
	{12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23,
	24, 25, 26, 27},
	{24, 25, 26, 27, 29, 30, 31, 32, 33, 34, 35, 36,
	37, 38, 39, 40},
	
	/* lid */
	{96, 96, 96, 96, 97, 98, 99, 100, 101, 101, 101,
	101, 0, 1, 2, 3,},
	{0, 1, 2, 3, 106, 107, 108, 109, 110, 111, 112,
	113, 114, 115, 116, 117},
	
	/* bottom */
	{118, 118, 118, 118, 124, 122, 119, 121, 123, 126,
	125, 120, 40, 39, 38, 37},
	
	/* handle */
	{41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52,
	53, 54, 55, 56},
	{53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64,
	28, 65, 66, 67},
	
	/* spout */
	{68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
	80, 81, 82, 83},
	{80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91,
	92, 93, 94, 95}
};


static float cpdata[][3] =
{
	{0.2, 0, 2.7}, {0.2, -0.112, 2.7}, {0.112, -0.2, 2.7}, {0,
	-0.2, 2.7}, {1.3375, 0, 2.53125}, {1.3375, -0.749, 2.53125},
	{0.749, -1.3375, 2.53125}, {0, -1.3375, 2.53125}, {1.4375,
	0, 2.53125}, {1.4375, -0.805, 2.53125}, {0.805, -1.4375,
	2.53125}, {0, -1.4375, 2.53125}, {1.5, 0, 2.4}, {1.5, -0.84,
	2.4}, {0.84, -1.5, 2.4}, {0, -1.5, 2.4}, {1.75, 0, 1.875},
	{1.75, -0.98, 1.875}, {0.98, -1.75, 1.875}, {0, -1.75,
	1.875}, {2, 0, 1.35}, {2, -1.12, 1.35}, {1.12, -2, 1.35},
	{0, -2, 1.35}, {2, 0, 0.9}, {2, -1.12, 0.9}, {1.12, -2,
	0.9}, {0, -2, 0.9}, {-2, 0, 0.9}, {2, 0, 0.45}, {2, -1.12,
	0.45}, {1.12, -2, 0.45}, {0, -2, 0.45}, {1.5, 0, 0.225},
	{1.5, -0.84, 0.225}, {0.84, -1.5, 0.225}, {0, -1.5, 0.225},
	{1.5, 0, 0.15}, {1.5, -0.84, 0.15}, {0.84, -1.5, 0.15}, {0,
	-1.5, 0.15}, {-1.6, 0, 2.025}, {-1.6, -0.3, 2.025}, {-1.5,
	-0.3, 2.25}, {-1.5, 0, 2.25}, {-2.3, 0, 2.025}, {-2.3, -0.3,
	2.025}, {-2.5, -0.3, 2.25}, {-2.5, 0, 2.25}, {-2.7, 0,
	2.025}, {-2.7, -0.3, 2.025}, {-3, -0.3, 2.25}, {-3, 0,
	2.25}, {-2.7, 0, 1.8}, {-2.7, -0.3, 1.8}, {-3, -0.3, 1.8},
	{-3, 0, 1.8}, {-2.7, 0, 1.575}, {-2.7, -0.3, 1.575}, {-3,
	-0.3, 1.35}, {-3, 0, 1.35}, {-2.5, 0, 1.125}, {-2.5, -0.3,
	1.125}, {-2.65, -0.3, 0.9375}, {-2.65, 0, 0.9375}, {-2,
	-0.3, 0.9}, {-1.9, -0.3, 0.6}, {-1.9, 0, 0.6}, {1.7, 0,
	1.425}, {1.7, -0.66, 1.425}, {1.7, -0.66, 0.6}, {1.7, 0,
	0.6}, {2.6, 0, 1.425}, {2.6, -0.66, 1.425}, {3.1, -0.66,
	0.825}, {3.1, 0, 0.825}, {2.3, 0, 2.1}, {2.3, -0.25, 2.1},
	{2.4, -0.25, 2.025}, {2.4, 0, 2.025}, {2.7, 0, 2.4}, {2.7,
	-0.25, 2.4}, {3.3, -0.25, 2.4}, {3.3, 0, 2.4}, {2.8, 0,
	2.475}, {2.8, -0.25, 2.475}, {3.525, -0.25, 2.49375},
	{3.525, 0, 2.49375}, {2.9, 0, 2.475}, {2.9, -0.15, 2.475},
	{3.45, -0.15, 2.5125}, {3.45, 0, 2.5125}, {2.8, 0, 2.4},
	{2.8, -0.15, 2.4}, {3.2, -0.15, 2.4}, {3.2, 0, 2.4}, {0, 0,
	3.15}, {0.8, 0, 3.15}, {0.8, -0.45, 3.15}, {0.45, -0.8,
	3.15}, {0, -0.8, 3.15}, {0, 0, 2.85}, {1.4, 0, 2.4}, {1.4,
	-0.784, 2.4}, {0.784, -1.4, 2.4}, {0, -1.4, 2.4}, {0.4, 0,
	2.55}, {0.4, -0.224, 2.55}, {0.224, -0.4, 2.55}, {0, -0.4,
	2.55}, {1.3, 0, 2.55}, {1.3, -0.728, 2.55}, {0.728, -1.3,
	2.55}, {0, -1.3, 2.55}, {1.3, 0, 2.4}, {1.3, -0.728, 2.4},
	{0.728, -1.3, 2.4}, {0, -1.3, 2.4}, {0, 0, 0}, {1.425,
	-0.798, 0}, {1.5, 0, 0.075}, {1.425, 0, 0}, {0.798, -1.425,
	0}, {0, -1.5, 0.075}, {0, -1.425, 0}, {1.5, -0.84, 0.075},
	{0.84, -1.5, 0.075}
};


void fastSolidTeapot(GLint grid, GLdouble scale)
{
	float p[4][4][3], q[4][4][3], r[4][4][3], s[4][4][3];
	long i, j, k, l;

	glEnable(GL_AUTO_NORMAL);
	glEnable(GL_MAP2_VERTEX_3);
	glRotatef(270.0, 1.0, 0.0, 0.0);
	glScalef(0.5 * scale, 0.5 * scale, 0.5 * scale);
	glTranslatef(0.0, 0.0, -1.5);
	for (i = 0; i < 10; i++) {
		for (j = 0; j < 4; j++) {
			for (k = 0; k < 4; k++) {
				for (l = 0; l < 3; l++) {
					p[j][k][l] = cpdata[patchdata[i][j * 4 + k]][l];
					q[j][k][l] = cpdata[patchdata[i][j * 4 + (3 - k)]][l];
					if (l == 1)
						q[j][k][l] *= -1.0;

					if (i < 6) 
					{
						r[j][k][l] = cpdata[patchdata[i][j * 4 + (3 - k)]][l];
						if (l == 0)	
							r[j][k][l] *= -1.0;
						
						s[j][k][l] = cpdata[patchdata[i][j * 4 + k]][l];
						if (l == 0)
							s[j][k][l] *= -1.0;
	
						if (l == 1)
							s[j][k][l] *= -1.0;
					}
				}
			}
		}

		glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 4,&p[0][0][0]);
		glMapGrid2f(grid, 0.0, 1.0, grid, 0.0, 1.0);
		glEvalMesh2(GL_FILL, 0, grid, 0, grid);
		glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 4,&q[0][0][0]);
		glEvalMesh2(GL_FILL, 0, grid, 0, grid);
		if (i < 6) {
			glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 4,&r[0][0][0]);
			glEvalMesh2(GL_FILL, 0, grid, 0, grid);
			glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 4,&s[0][0][0]);
			glEvalMesh2(GL_FILL, 0, grid, 0, grid);
		}

	}
}


//------------- OpenGLの初期化 -------------//
void GLUT_CALL_FUNCs()
{
	glutDisplayFunc(display);
	glutReshapeFunc(reshape);
	glutTimerFunc(0,timer,17);

}


void OtherMyInit()
{
	glClearColor(1.0, 1.0, 1.0, 1.0);
	glEnable(GL_DEPTH_TEST);
	glEnable(GL_LIGHTING);//光源の有効化
	glEnable(GL_LIGHT0);

	glEnable(GL_NORMALIZE);
}


void GLUT_INITs(int *argcp, char **argv)
{
	glutInit(argcp,argv);
	glutInitDisplayMode(GLUT_RGBA| GLUT_DOUBLE | GLUT_DEPTH);
	glutInitWindowSize(640,480);
	glutCreateWindow("fastSolidTeapot");
	GLUT_CALL_FUNCs();
	OtherMyInit();
}


//-------------メイン関数-----------------//
int main(int argc, char **argv)
{
	GLUT_INITs(&argc,argv);
	glutMainLoop();
	return 0;
}


//------------- ここから各種コールバック -----------------//
void display()
{
	static float Light0Pos[]={-100.0, 100.0, 100.0,0}; //光源の位置
	static int r = 0;

	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

	glLoadIdentity();
	gluLookAt(3.0, 4.0, 5.0, 0,0,0, 0.0, 1.0, 0.0);

	glPushMatrix();
	glRotatef(static_cast<float>(r),0,1,0);
	glLightfv(GL_LIGHT0, GL_POSITION, Light0Pos);
	DRAW_XYZ();
	fastSolidTeapot(10, 1);//ティーポット描画
	glPopMatrix();
	
	glutSwapBuffers();
	
	if(++r > 360) 
		r = 0;
}

void reshape(int w, int h)
{
	glViewport(0, 0, w, h);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	gluPerspective(30.0, (double)w / (double)h, 0.1, 1000.0);
	glMatrixMode(GL_MODELVIEW);

}

void timer(int t)
{
	glutPostRedisplay();
	glutTimerFunc(t,timer,17); //タイマー関数
}


//------------ ここから各種関数 ---------------//
void DRAW_XYZ()
{
 
	glDisable(GL_LIGHTING);//光源の有効化
	glDisable(GL_LIGHT0);
	
	glBegin(GL_LINES);

	glColor3f(0,1,0);//x
	glVertex2f(-100,0);
	glVertex2f(100, 0);

	glColor3f(1,0,0);//y
	glVertex2f(0,0);
	glVertex2f(0,100);

	glColor3f(0,0,1);//z
	glVertex3f(0,0,-100);
	glVertex3f(0,0, 100);
	glEnd();
	
	glEnable(GL_LIGHTING);//光源の有効化
	glEnable(GL_LIGHT0);
}

【メモ】
「fastSolidTeapot.h」などを作成して、
ファイルを分割した方が使いやすいかもしれない。

目次

― その他 ―

Wiki内検索

計測中...(07.10.8〜)

Save The World






▲よろしければ広告のクリックもお願いします


▲ランキングに参加しました

管理人/副管理人のみ編集できます