1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
| //---------------------------------------------------------------------------
void __fastcall TGL_Form::FormMouseDown(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{
if (Button==mbLeft)
{
MouseMovesScreen=true;
StatusBar->Panels->Items[1]->Text="Mouse moves screen";
OldMouseX=X;
OldMouseY=Y;
// recherche du robot pointé
glPushMatrix();
glLoadIdentity();
glTranslatef(0, 0, -zpos);
glRotatef(xrot,1,0,0);
// marque "en altitude ypos" du point de vision
glTranslatef(0,-yv, 0);
// marque au sol de l'ombre du point de vision
//------- fin point de vision
glRotatef(yrot,0,1,0);
glTranslatef(-xv, 0, -zv);
glRotatef (-90.0, (GLfloat)1.0, (GLfloat)0.0, (GLfloat)0.0); // repere xy au sol !
glGetDoublev (GL_MODELVIEW_MATRIX, modelview);
glGetDoublev( GL_PROJECTION_MATRIX, projection );
glGetIntegerv( GL_VIEWPORT, viewport );
winX = X;
winY = viewport[3] - Y;
winZ=0;
// glReadPixels( (GLint) winX, (GLint)winY , 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &winZ );
gluUnProject( winX, winY, winZ, modelview, projection, viewport, &mireX, &mireY, &mireZ);
glPopMatrix();
// recherche d'un pt sur la meme droite de viion
glPushMatrix();
glLoadIdentity();
glTranslatef(0, 0, -zpos);
glRotatef(xrot,1,0,0);
// marque "en altitude ypos" du point de vision
glTranslatef(0,-yv, 0);
// marque au sol de l'ombre du point de vision
//------- fin point de vision
glRotatef(yrot,0,1,0);
glTranslatef(-xv, 0, -zv);
glRotatef (-90.0, (GLfloat)1.0, (GLfloat)0.0, (GLfloat)0.0); // repere xy au sol !
glGetDoublev (GL_MODELVIEW_MATRIX, modelview);
glGetDoublev( GL_PROJECTION_MATRIX, projection );
glGetIntegerv( GL_VIEWPORT, viewport );
winX = X;
winY = viewport[3] - Y;
winZ=0.5;
// glReadPixels( (GLint) winX, (GLint)winY , 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &winZ );
gluUnProject( winX, winY, winZ, modelview, projection, viewport, &mireX0, &mireY0, &mireZ0);
glPopMatrix();
// mireX, mireY et mireZ retournées par gluUnProject sont vraiment des coordonées sur le terrain.
StatusBar->Panels->Items[1]->Text=AnsiString("X="+IntToStr(X)+" Y="+ IntToStr(Y)
+" mireX="+FloatToStr(mireX)+" mireY="+FloatToStr(mireY)+" mireZ="+FloatToStr(mireZ));
} |
Partager