gluProject() を使用して 3D 点から計算された 2D 点に 2D 画像を表示したいと考えています。3D ポイントがあり、gluProject を使用してその 2D 座標を取得し、この時点で画像を表示します。それはうまくいきますが、私の画像が画面上に2回表示される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 を考慮するにはどうすればよいでしょうか?