GluProject在C中未显示精确坐标
我试图从opengl坐标(投影在3D空间)中找到屏幕坐标。为此,我使用了glproject调用,在代码中使用了旋转和平移 在执行某些转换后的某个点,我调用glproject api来获取特定投影点p(x,y,z)的屏幕坐标 glproject(x,y,z,modelMatrix,projectionmatrix,viewport,*x_-s,*y_-s,*z_-s) 我能够在x_s中正确获得x屏幕坐标,但y坐标不同 y中唯一没有x的变化是最初我调用glperspective来设置fovy(y方向的视野角度,以度为单位)。透视图(60.0f,宽/高,0.0001f,1000.0f) 让我重新表述一下这个问题,我已经在屏幕上创建了一个3D点,现在我通过GLproject获得该点的2d(x,y)坐标,它们与鼠标坐标不同,获得正确坐标的可能解决方案是什么 下面是代码片段GluProject在C中未显示精确坐标,c,opengl,graphics,glut,C,Opengl,Graphics,Glut,我试图从opengl坐标(投影在3D空间)中找到屏幕坐标。为此,我使用了glproject调用,在代码中使用了旋转和平移 在执行某些转换后的某个点,我调用glproject api来获取特定投影点p(x,y,z)的屏幕坐标 glproject(x,y,z,modelMatrix,projectionmatrix,viewport,*x_-s,*y_-s,*z_-s) 我能够在x_s中正确获得x屏幕坐标,但y坐标不同 y中唯一没有x的变化是最初我调用glperspective来设置fovy(y方向
#include<GL/glut.h> /* Header File For The GLUT Library */
GLint Window; /* The number of our GLUT window */
float tmp_x,tmp_y,tmp_z;
GLfloat w = 1200; /* Window size. Global for use in rotation routine */
GLfloat h = 1200;
GLint prevx, prevy; /* Remember previous x and y positions */
GLfloat xt=1.0,yt=1.0,zt=1.0; /* translate */
int width = 1600;
int height = 1200;
//This function will set windowing transformation
void transform(GLfloat Width , GLfloat Height )
{
glViewport(0,0, (GLfloat)Width, (GLfloat)Height);
glPushMatrix();
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(60.0f, Width/Height,0.0001f,1000.0f);
glTranslatef(0.0, 0.0, -15.0f); /* Centre and away the viewer */
glMatrixMode(GL_MODELVIEW);
glPopMatrix();
}
GLvoid draw_room()
{
int i;
glPushMatrix();
glShadeModel(GL_SMOOTH);
glLineWidth(1.0);
glPointSize(4.0); /* Add point size, to make it clear */
glBegin(GL_POINTS); /* start drawing the cube.*/
glColor3f(0.0f,0.0f,1.0f); /* Set The Color To Orange*/
glColor3f(1.0f,0.0f,0.0f); /* Set The Color To Orange*/
glVertex3f(3.1f,2.1f,2.1f);
glEnd(); /* Done Drawing The Cube*/
glEnable(GL_DEPTH_TEST);
}
//OpenGl Display callback Function It call init room
void DrawGLScene()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
printf("%f %f %f\n",xt,yt,zt);
glPushMatrix();
glMatrixMode(GL_PROJECTION);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(xt,yt, zt);
draw_room();
glPopMatrix();
glutSwapBuffers(); /* Swap buffers */
glFlush();
}
GLvoid Mouse( int b , int s, int xx, int yy)
{
double a1,a2,a3;
GLint viewport[4];
GLdouble modelview[16];
GLdouble projection[16];
glGetIntegerv(GL_VIEWPORT, viewport);
glGetDoublev(GL_MODELVIEW_MATRIX, modelview);
glGetDoublev(GL_PROJECTION_MATRIX, projection);
//gluProject(xt+3.1f,yt+2.1f,zt+2.1f, modelview, projection, viewport, &a1, &a2, &a3);
gluProject(3.1f,2.1f,2.1f, modelview, projection, viewport, &a1, &a2, &a3);
printf("Mouse: %d %d\n",xx,yy); // Both Print are giving different coordinaes.
printf("Unproject %f %f %f\n",a1,a2,a3);
switch (b) {
case GLUT_LEFT_BUTTON: /* only stash away for left mouse */
prevx = xx - w/2;
prevy = h/2 - yy;
break;
case GLUT_MIDDLE_BUTTON:
break;
case GLUT_RIGHT_BUTTON:
break;
}
}
#包含GLUT库的/*头文件*/
闪烁窗口;/*我们过剩窗口的数量*/
浮动tmp_x,tmp_y,tmp_z;
GLfloat w=1200;/*窗口大小。在轮换例行程序中使用的全局*/
GLH=1200;
闪烁prevx,prevy;/*记住以前的x和y位置*/
GLfloat xt=1.0,yt=1.0,zt=1.0;/*翻译*/
整数宽度=1600;
内部高度=1200;
//此函数将设置窗口转换
空心变换(GLfloat宽度、GLfloat高度)
{
GLVIEW(0,0,(GLfloat)宽度,(GLfloat)高度);
glPushMatrix();
glMatrixMode(GL_投影);
glLoadIdentity();
透视图(60.0f,宽/高,0.0001f,1000.0f);
glTranslatef(0.0,0.0,-15.0f);/*居中并远离观看者*/
glMatrixMode(GLU模型视图);
glPopMatrix();
}
GLvoid绘图室()
{
int i;
glPushMatrix();
glShadeModel(GL_平滑);
glLineWidth(1.0);
glPointSize(4.0);/*添加点大小,使其更清晰*/
glBegin(GL_点);/*开始绘制立方体*/
glColor3f(0.0f、0.0f、1.0f);/*将颜色设置为橙色*/
glColor3f(1.0f,0.0f,0.0f);/*将颜色设置为橙色*/
glVertex3f(3.1f、2.1f、2.1f);
glEnd();/*绘制完立方体*/
glEnable(GLU深度试验);
}
//OpenGl显示回调函数它调用init room
void DrawGLScene()
{
glClear(GL_颜色_缓冲_位| GL_深度_缓冲_位);
printf(“%f%f%f\n”,xt,yt,zt);
glPushMatrix();
glMatrixMode(GL_投影);
glMatrixMode(GLU模型视图);
glLoadIdentity();
glTranslatef(xt,yt,zt);
画室();
glPopMatrix();
glutSwapBuffers();/*交换缓冲区*/
glFlush();
}
GLvoid鼠标(int b、int s、int xx、int yy)
{
双a1、a2、a3;
闪烁视口[4];
GLdouble modelview[16];
gl双投影[16];
glGetIntegerv(GL_视口,视口);
glGetDoublev(GL_模型视图_矩阵,模型视图);
glGetDoublev(GL_投影矩阵,投影);
//gluProject(xt+3.1f、yt+2.1f、zt+2.1f、模型视图、投影、视口、a1、a2和a3);
gluProject(3.1f、2.1f、2.1f、模型视图、投影、视口、a1、a2和a3);
printf(“鼠标:%d%d\n”,xx,yy);//两种打印都给出了不同的坐标。
printf(“取消项目%f%f%f\n”,a1、a2、a3);
开关(b){
case GLUT_左键:/*仅为鼠标左键隐藏*/
prevx=xx-w/2;
prevy=h/2-yy;
打破
机箱GLUT_中间按钮:
打破
案例过量右按钮:
打破
}
}
可能的解决方案是什么 OpenGL使用屏幕左下角作为坐标系原点。窗口系统通常使用左上角作为坐标系原点。你需要处理这个差异。例如:
printf("Mouse: %d %d\n",xx,yy);
printf("Unproject %f %f %f\n",a1,viewport[1]-a2,a3);
一个附带问题:
透视图(60.0f,宽/高,0.0001f,1000.0f)
你的近平面距离和远平面距离之间的比例很大。这对深度分辨率非常不利。通常,应根据场景的允许,尽可能远地设置“近剪裁平面距离”。由gluPerspective创建的投影的远剪裁平面应设置得尽可能近(如果投影矩阵的构建略有不同,也可以将远剪裁平面设置为无穷大)
无论如何,您的低深度分辨率将对鼠标指针屏幕位置反投影产生负面影响
让我重新表述一下这个问题,我已经在屏幕上创建了一个3D点,现在我通过GLproject获得该点的2d(x,y)坐标,它们与鼠标坐标不同,获得正确坐标的可能解决方案是什么
大多数窗口系统将指针坐标系原点置于左上角。OpenGL将视口坐标系原点设置为左下角。因此,您必须沿Y=向上轴反转窗口中的鼠标位置。经过少许修改后,谢谢您的帮助,我得到了结果