我想在使用gluProject()从3D点计算的2D点处显示2D图像。 所以我有我的3D点,我用gluProject获取它的2D坐标,然后我在这一点上显示我的图像。 它工作得很好,但我的Z坐标有问题,这使得我的图像在屏幕上出现两次:它应该在哪里出现,而在#34;相反的#34;。
让我们举一个例子:相机位于(0,0,0),我看(0,0,-1),所以在负Z方向。
我使用3D点(0,0,-1)作为我的对象,gluProject将我作为2D点指向我窗口的中心,这是一个好点。
因此,当我朝(0,0,-1)方向看时,我的2D图像出现,当我旋转时,它移动得很好,直到点(0,0,-1)不可见,这使得2D图像走出屏幕所以不显示。
但是当我看(0,0,1)时,它也出现了。因此,如果我使用3D点(0,0,-1)和(0,0,1),我得到相同的结果(用于显示我的2D图像)。我假设与GluProject返回的Z坐标有关,但我不知道是什么。
这是我的代码:我的zNear = 0.1和zFar = 1000
GLint viewport[4];
GLdouble modelview[16];
GLdouble viewVector[3];
GLdouble projection[16];
GLdouble winX, winY, winZ;//2D point
GLdouble posX, posY, posZ;//3D point
posX=0.0;
posY=0.0;
posZ=-1.0;//the display is the same if posZ=1 which should not be the case
//get the matrices
glGetDoublev( GL_MODELVIEW_MATRIX, modelview );
viewVector[0]=modelview[8];
viewVector[1]=modelview[9];
viewVector[2]=modelview[10];
glGetDoublev( GL_PROJECTION_MATRIX, projection );
glGetIntegerv( GL_VIEWPORT, viewport );
int res=gluProject(posX,posY,posZ,modelview,projection,viewport,&winX,&winY,&winZ);
if(viewVector[0]*posX+viewVector[1]*posY+viewVector[2]*posZ<0){
displayMyImageAt(winX,windowHeight-winY);
}
那么,我需要做些什么才能很好地展示我的2D图像,并考虑将Z考虑在内?
答案 0 :(得分:3)
gluProject工作正常,你在屏幕平面投影矩阵投影点,你应该检查点是否落后,你可以通过计算你的视图矢量和矢量的点积来实现这一点,如果它小于0然后点落后了。
答案 1 :(得分:0)
您的DisplayImageAt功能是什么?
它与我的代码中给出的这个显示功能类似吗? 我也试图获得一个选定的3d坐标点的2D坐标。
这是我的显示器几乎所有.. `void display() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glMultMatrixd(_matrix);
glColor3f(0.5,0.5,0.5);
glPushMatrix(); //draw terrain
glColor3f(0.7,0.7,0.7);
glBegin(GL_QUADS);
glVertex3f(-3,-0.85,3);
glVertex3f(3,-0.85,3);
glVertex3f(3,-0.85,-3);
glVertex3f(-3,-0.85,-3);
glEnd();
glPopMatrix();
glPushMatrix();
myDefMesh.glDraw(meshModel);
glPopMatrix();
glutSwapBuffers();
}“