行列:合成行列から拡大縮小成分を抜き出す

平行移動、回転、拡大縮小成分が合成された行列から
拡大縮小成分だけを抽出します。

 具体的なやり方は、合成行列の平行移動成分を除いた各列の3要素の
ベクトルの大きさを計算すると拡大縮小成分が抽出されます。

//#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;
}

 

最終更新:2014年04月16日 18:51
添付ファイル