マウスの動きを検出し、マウスの位置にボールを描画する必要があります。ボールがワールド座標にある必要があります。だから私はglUnProject
このタスクに使用しようとしていますが、今まで成功していないようです。これは私のmotionFunc
です:
void motionFunc( int x, int y)
{
GLint viewport[4];
GLdouble modelview[16];
GLdouble projection[16];
GLfloat winX, winY, winZ;
GLdouble posX, posY, posZ;
glGetDoublev( GL_MODELVIEW_MATRIX, modelview );
glGetDoublev( GL_PROJECTION_MATRIX, projection );
glGetIntegerv( GL_VIEWPORT, viewport );
winX = (float)x;
winY = (float)viewport[3] - (float)y;
glReadPixels( x, int(winY), 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &winZ );
gluUnProject( winX, winY, winZ, modelview, projection, viewport, &posX, &posY, &posZ); //printf("winz: %f posz: %f\n",winZ,posZ);
Ball.x=posX;
Ball.y=posY;
Ball.z=posZ;
//printf("%f %f %f\n",Ball.x,Ball.y,posZ);
glutPostRedisplay();
}
ここで、glutPostRedisplay にブレークポイントを追加しました。マウスをクリックしてドラッグすると、ボールの座標 (Ball.x,Ball.y,Ball.z) は次のようになります。
(Ball).x -727.175354
(Ball).y 407.310242
(Ball).z -865.000610
なぜz座標はこれまでですか?私のカメラは z=+135 にあります。私のモデルの他のオブジェクトは、z= -3 から +3 のようなものです。ボールの z 座標が同じ範囲にある必要があります。
さて、正確にはwinZ
何ですか?ここでは、常に 1.00 になることを確認しました。ハードコーディングを試みたところwinZ
、winZ=0.85
ボールが常にマウスの下にあるように見えます (マウスでボールをドラッグでき、ボールは常にポインターの下にあります)。しかし、ボールの座標は次のようになります。
(Ball).x -4.67813921
(Ball).y 2.57806134
(Ball).z 128.370895
これはカメラに非常に近いですが、x 座標と y 座標は私には適していません。それらは常に原点の近くにあることがわかります。これは私が望むものではありません。他のオブジェクトの x 座標と y 座標の範囲が広くなっています。
最後に、私の質問は、正しい方法glUnproject
または同じ種類のものは何ですか?