最終更新: mikk_ni3_92 2007年12月04日(火) 13:52:35履歴
現在地 >> メニュー >> サンプルコード::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座標は変換する。
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座標は変換する。