我想在使用 gluProject() 从 3D 点计算的 2D 点处显示 2D 图像。所以我有我的 3D 点,我使用 gluProject 来获取它的 2D 坐标,然后在这一点上显示我的图像。它运作良好,但我的 Z 坐标存在问题,这使我的图像在屏幕上出现两次:它应该真正出现的位置和“相反的位置”。
举个例子:相机在(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 呢?