opengl+delphi 鼠标拾取
on a new matrix as not to affect any other spheres.
// We rotate the sphere by its current rotation value FIRST before we translate it.
// This makes it rotate around the origin, which is where the sun is.
// Then we rotate it again about the Y-axis to make it spin around itself.
glPushMatrix();// Push on a new matrix scope
glRotatef(EarthRotation / 3, 0, 1.0, 0);// Rotate the sphere around the origin (the sun)
glTranslatef(-2, 0, 0);// Translate this sphere to the left
glRotatef(EarthRotation, 0, 1.0, 0);// Rotate the sphere to make it spin
gluSphere(pObj, 0.2, 20, 20);// Draw the sphere with a radius of 0.2 so it's smaller than the sun
glPopMatrix();// End the current scope of this matrix
// We are done assigning the EARTH object, so we need
// to stop assigning polygons to the current ID.
glEnd();// Stop assigning polygons to the EARTH label (IMPORTANT)
// Bind the pluto texture to the last sphere
glBindTexture(GL_TEXTURE_2D, PlutoTex);
// Finally, we want to be able to click on Pluto, so we need a pluto ID.
glLoadName(PLUTO);// Push on our PLUTO label (IMPORTANT)
// Like we did with the earth, we rotate Pluto around the sun first,
// then we translate it farther away from the sun. Next, we rotate Pluto
// around the Y axis to give it some spin.
// Pass in our empty glBegin()/glEnd() statement because we are using Quadrics.
// If we don't do this when using glLoadName(), it will grind to a hault on some cards.
glBegin(GL_LINES);
glEnd();
glPushMatrix();// Push on a new matrix scope
glRotatef(PlutoRotation / 2, 0, 1.0, 0);// Rotate the sphere around the sun
glTranslatef(3, 0, 0);// Translate this sphere farther away from the sun than the earth
glRotatef(PlutoRotation, 0, 1.0, 0);// Rotate the sphere around itself to produce the spin
gluSphere(pObj, 0.1, 20, 20);// Draw the sphere with a radius of 0.1 (smallest planet)
glPopMatrix();// End the current scope of this matrix
// We are finished with the PLUTO object ID, so we need to pop it off the name stack.
glEnd();// Stop assigning polygons to our PLUTO label (IMPORTANT)
//SwapBuffers(h_DC);// Swap the backbuffers to the foreground
gluDeleteQuadric(pObj);// Free the Quadric
glPopName();// We pushed a name on the stack, we must pop it back off
// Below we increase the rotations for each sphere.
SunRotation := SunRotation + 0.2;// Rotate the sun slowly
EarthRotation := EarthRotation + 0.5;// Increase the rotation for the each
PlutoRotation := PlutoRotation + 0.6;// Make pluto go the fastest
end;
function RetrieveObjectID(x, y: integer): intege
r;
var
objectsFound: integer;
viewportCoords: array [0..3] of integer;
selectBuffer: array[0..31] of cardinal;
lowestDepth: cardinal;
sele