現在地 >> メニュー >> サンプルコード::OpenGL >> 座標変換1


問題


3D空間の(1,2,1)にある点が、
ウィンドウ座標系では、どこに対応するかを出力せよ。

その他条件:
 マウスでクリックでタイトルバーに座標を表示させ、出力結果と比較する。
 「w」を押すと、座標を計算する。


 → 座標変換1::改

答え


#include <strstream>
#include <iostream>
#include <cstdio>
#include <GL/glut.h>
#include <GL/glu.h>
#include <GL/gl.h>

void display();
void reshape(int w, int h);
void timer(int value);
void keyboard(unsigned char key, int x, int y);
void mouse(int button, int state,int x, int y);


void DRAW_XYZ();

inline void GET_WIN_COODINATE();
void CHANGE_TITLE(int *x, int *y);


using namespace std;


inline void GLUT_INIT()
{
glutInitDisplayMode(GLUT_RGBA| GLUT_DOUBLE | GLUT_DEPTH);
glutInitWindowSize(200,200);
}

inline void GLUT_CALL_FUNC()
{
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutTimerFunc(10,timer,0);
glutKeyboardFunc(keyboard);

glutMouseFunc(mouse);
}

inline void MY_INIT()
{
glClearColor(1.0, 1.0, 1.0, 1.0);
printf("<<< press [w] >>>\n\n");
}


int main(int argc, char **argv)
{
glutInit(&argc,argv);
GLUT_INIT();
glutCreateWindow("window name");
GLUT_CALL_FUNC();
MY_INIT();
glutMainLoop();

return 0;
}



/********[ここからコールバック]****************************************/
void display()
{

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

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

DRAW_XYZ();

glEnable(GL_DEPTH_TEST);

glPointSize(4);
glBegin(GL_POINTS);
glVertex3d(1,2,1);
glEnd();


glDisable(GL_DEPTH_TEST);

glutSwapBuffers();



}


void reshape(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);
glLoadIdentity();
gluLookAt(3.0, 4.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
}

void timer(int value)
{
glutPostRedisplay();
glutTimerFunc(1,timer,0);
}

void keyboard(unsigned char key, int x, int y)
{
switch(key)
{
case 'w':
GET_WIN_COODINATE();
break;

}
printf("\n<<< press [w] >>>\n");
}

void mouse(int button, int state,int x, int y)
{

if( button == GLUT_LEFT_BUTTON && state == GLUT_DOWN)
{
CHANGE_TITLE(&x, &y);
}


}


/******* ここから各種関数 *********************************/
void DRAW_XYZ()
{
glBegin(GL_LINES);

glColor3d(0,1,0);//x
glVertex2d(-100,0);
glVertex2d(100, 0);

glColor3d(1,0,0);//y
glVertex2d(0,0);
glVertex2d(0,100);

glColor3d(0,0,1);//z
glVertex3d(0,0,-100);
glVertex3d(0,0, 100);
glEnd();

}

inline void GET_WIN_COODINATE()
{

GLdouble modelview[16];
glGetDoublev(GL_MODELVIEW_MATRIX, modelview);

GLdouble projection[16];
glGetDoublev(GL_PROJECTION_MATRIX, projection);

GLint viewport[4];
glGetIntegerv(GL_VIEWPORT, viewport);

GLdouble winX;
GLdouble winY;
GLdouble winZ;

gluProject(1,2,1,modelview,projection,viewport,&winX,&winY,&winZ);


printf("%d,%d,%d\n",(int)winX, viewport[3]- (int)winY,(int)winZ);

}



void CHANGE_TITLE(int *x, int *y)
{
char ch[128];
strstream Strm(ch,128,ios::out);

Strm
<<'(' << *x << "," << *y <<')'
<< ends;

glutSetWindowTitle(ch);

}

メモ


ビューポート、透視投影行列、モデルビュー行列があれば、gluProject()で取得可。
doubleでの計算なので、intに変換して出力する。

参考
http://man.sourcentral.org/debian-unstable/ja/3+gl...


左下原点で計算するので、y座標は変換する。

目次

― その他 ―

Wiki内検索

計測中...(07.10.8〜)

Save The World






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


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

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