最終更新: mikk_ni3_92 2007年10月24日(水) 16:18:02履歴
現在地 >> メニュー >> サンプルコード::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);
}
ウィンドウサイズ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);
}