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

問題


ウィンドウサイズ200×200、
視点は(3,4,5)から(0,0,0)を見ている。

ウィンドウの126,33の位置に物体が表示されている時、
オブジェクト座標系では、どこにあるか?


条件:
 この場合、答えはおよそ(1,2,1)になるが、
 座標の計算には、そこのZ値を必要とするので、(1,2,1)に点を描画。

 「w」を押すと計算し、計算した座標に点をうつ。
 (→物体の位置に点が打たれれば結果は正しい)

答え


#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 DRAW_XYZ();
inline void GET_WORLD_COODINATE();

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);

}

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

GLdouble objX;
GLdouble objY;
GLdouble objZ;

/********[ここからコールバック]****************************************/
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(3);
glBegin(GL_POINTS);
glVertex3d(1,2,1);
glEnd();


glDisable(GL_DEPTH_TEST);


glColor3d(1,0,0);
glPointSize(3);
glBegin(GL_POINTS);
glVertex3d(objX, objY,objZ);
glEnd();


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_WORLD_COODINATE();
break;
}

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

/******* ここから各種関数 *********************************/
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();

}

void DRAW_TRI()
{
glBegin(GL_TRIANGLES);

glVertex2d(0,1);
glVertex2d(-0.5, 0);
glVertex2d(0.5, 0);
glEnd();
}


inline void GET_WORLD_COODINATE()
{

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

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

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

float z;
glReadPixels(126,viewport[3]-33.0,1,1,
GL_DEPTH_COMPONENT,
GL_FLOAT,
&z);

gluUnProject(126.0,viewport[3]-33.0,z,modelview,projection,viewport,&objX,&objY,&objZ);

printf("%f,%f,%f\n",objX, objY,(double)objZ);

}


メモ


glReadPixelsがGL_DOUBLEを指定できないので、GL_FLOATで指定。

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

目次

― その他 ―

Wiki内検索

計測中...(07.10.8〜)

Save The World






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


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

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