//#pragma comment(linker, "/SUBSYSTEM:WINDOWS /ENTRY:mainCRTStartup")
#include <GL/freeglut/freeglut.h>
#include <math.h>
#include <stdio.h>
#define PI 3.1415926
#define WIDTH 320
#define HEIGHT 240
GLfloat modelview[16];
void matrix_print(char* text)
{
printf(text);
glGetFloatv(GL_MODELVIEW_MATRIX,modelview);
printf("\n%f,%f,%f,%f\n%f,%f,%f,%f\n%f,%f,%f,%f\n%f,%f,%f,%f\n",
modelview[0],modelview[4],modelview[8],modelview[12],
modelview[1],modelview[5],modelview[9],modelview[13],
modelview[2],modelview[6],modelview[10],modelview[14],
modelview[3],modelview[7],modelview[11],modelview[15]);
}
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glViewport(0, 0, WIDTH, HEIGHT);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
//視野角,アスペクト比(ウィンドウの幅/高さ),描画する範囲(最も近い距離,最も遠い距離)
gluPerspective(30.0, (double)WIDTH / (double)HEIGHT, 1.0, 1000.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
matrix_print("初期化状態");
//拡大縮小
glScalef(5.0,77.0,1.0);
matrix_print("スケーリングを適用した状態");
//平行移動
glTranslatef(100.0f,45.0f,39.0f);
matrix_print("平行移動を適用した状態");
//回転
glRotatef(60.0f,1.0f,0.0f,0.0f);
glRotatef(45.0f,0.0f,1.0f,0.0f);
glRotatef(120.0f,0.0f,0.0f,1.0f);
matrix_print("回転を適用した状態");
printf("合成行列から拡大縮小成分だけを抜き出す\nX軸 %f\nY軸 %f\nZ軸 %f\n",
sqrt(modelview[0]*modelview[0]+modelview[4]*modelview[4]+modelview[8]*modelview[8]),//X軸
sqrt(modelview[1]*modelview[1]+modelview[5]*modelview[5]+modelview[9]*modelview[9]),//Y軸
sqrt(modelview[2]*modelview[2]+modelview[6]*modelview[6]+modelview[10]*modelview[10])//Z軸
);
getchar();
glutSwapBuffers();
}
void idle(void)
{
glutPostRedisplay();
}
void Init(){
glClearColor(0.3f, 0.3f, 0.3f, 1.0f);
}
int main(int argc, char *argv[])
{
glutInitWindowPosition(100, 100);
glutInitWindowSize(WIDTH, HEIGHT);
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);
glutCreateWindow("拡大縮小成分の抜き出し");
glutDisplayFunc(display);
glutIdleFunc(idle);
Init();
glutMainLoop();
return 0;
}
|