# distance beetween 2 sphere

Hello, I have created 2 object with :
glNewList(List, GL_COMPILE);
gluSphere(Obj, size, 50, 25);
glEndList();

now I can rotate/traslate and show they with :
glTranslatef(X, Y, Z);
glRotatef(Angle, 0.0, 1.0, 0.0);
glCallList(List);

How can get the X,Y,Z point after rotation/translation to calculate the distance ?

How can I get the spere on the mouse pointer ?
thank you very much for help
Alfred

For the Second question you can call glutMouseFunc and glutMotion callbacks for selection or rotation of sphere

// glutMouseFunc call back routine

void mouse(int button,int state,int x, int y)
{
if(button == GLUT_LEFT_BUTTON)
{
if(state == GLUT_DOWN)
{
rotating = GL_TRUE;
xstart = x;
ystart = y;
}
else
rotating = GL_FALSE;
}

// motionFunc callback
void motion(int x, int y)
{
if(rotating)
{
yAngle += (x - xStart);
xAngle += (y - yStart);
xStart = x;
yStart = y;
}

}

With regards
RAJESH.R
Virtual Reality
IRIS,
Center for AI and Robotics
Bangalore - 1
rajeshr@cair.res.in

Sorry for my english…
I have 12 sphere on the screen. Each sphere has a X,Y,Z when the program start. Each sphere is animated with an individual rotation and translation. So , after few frames I would like to know the X,Y,Z of each sphere to calculate the distance. I dont know how to get the X Y Z coords after a rotation or translation.

And I would like to insert in my program a mouse function, where if I left mouse click , my program give me the pointer to the selected spere, so I can know what spere is selected by the user.

I hope my english is better now… sorry
Thank you very much
Alfred

To keep it really simple, and since you’re just rotating around the y-axis, we can dispence with the matrices and do something like

x’ = x cos(angle) + z sin(angle);
y’ = y;
z’ = -x sin(angle) + z cos(angle);

This gives you a point rotated around the y-axis by some angle, centered about the world-space origin. If you want to locate the origin of rotation somewhere else, just add something to the rotated point, like an initial point (x0,y0,z0).

x’ = x0 + x cos(angle) + z sin(angle);
y’ = y0 + y;
z’ = z0 - x sin(angle) + z cos(angle);

This is the same result you’d get with the matrices. Here’s the equivalent matrix form, with the corresponding opengl calls in order:

``````    glTranslatef(x0,y0,z0); glRotatef(angle,0,1,0); glVertex3f(x,y,z);
( x' )   ( 1 0 0 x0 ) ( cos(angle) 0   sin(angle) 0 ) ( x )
( y' )   ( 0 1 0 y0 ) ( 0          1   0          0 ) ( y )
( z' ) = ( 0 0 1 z0 ) (-sin(angle) 0   cos(angle) 0 ) ( z )
( 1  )   ( 0 0 0 1  ) ( 0          0   0          1 ) ( 1 ).
``````

Same result, and a lot easier to work with If you’d like some good reading on this stuff, google for “linear algebra”. And look at the redbook appendices. There you’ll find all the opengl transformation matrices and their inverses.
http://www.rush3d.com/reference/opengl-redbook-1.1/appendixg.html

To get the distance between 2 spheres, take the distance between the sphere origins, then subtract the sum of the 2 radii from the result.
Multiplying a few matrices together is hardly writing a 3D engine You can grab the current modelview matrix with glGetFloatv(GL_MODELVIEW_MATRIX,m). Keep in mind that the camera transforms are likely on the modelview stack at the time the model transforms are applied, so don’t hose your model transforms with the camera stuff.