Advertisement

rotation problems...

Started by March 29, 2004 08:00 PM
4 comments, last by EToreo 20 years, 11 months ago
I am working on a simple idea. I want to build a solar system, complete with a sun and planets. As it stands now, I can create a sun and planets, but each planet I add ends up rotating the previously added planet. (And the name ends up rotating also) SpriteOrbittingPossition* spriteOrbittingPossition = new SpriteOrbittingPossition( Vector3D(0.0f, 0.0f, 0.0f), //Start Position 5000, //Mass 5.2, //Radius Vector3D(1.0f, 0.0f, 0.0f), //Rotation Vector3D(2.0f, 0.0f, 0.0f), //Rotation Speed "Sun"); … spriteOrbittingPossition->addPlannet( Vector3D(18.0f, 0.0f, 0.0f), //Start Position 1, //Mass 1.3, //Radius Vector3D(1.0f, 0.0f, 0.0f), //Rotation Vector3D(2.0f, 0.0f, 0.0f), //Rotation Speed 2, //Speed (orbit) "Plannet 1" //Name ); spriteOrbittingPossition->addPlannet( Vector3D(12.0f, -9.0f, 0.0f), //Start Position 1, //Mass 1.3, //Radius Vector3D(-1.0f, 0.0f, 0.0f), //Rotation Vector3D(2.0f, 0.0f, 0.0f), //Rotation Speed 2, //Speed (orbit) "Plannet 2" //Name ); … for (int a = 0; a < spriteOrbittingPossition->numPlannets+1; ++a) { Mass* mass = spriteOrbittingPossition->getMass(a); Vector3D* pos = &mass->pos; glPrint(pos->x, pos->y + mass->r + .5, pos->z, mass->massName); glBindTexture(GL_TEXTURE_2D, texture[2]); glTranslatef(pos->x,pos->y,pos->z); glRotatef(mass->xrot,0.0f,0.0f,1.0f); glRotatef(0,mass->yrot,0.0f,1.0f); glRotatef(0,0.0f,mass->zrot,1.0f); gluSphere(quadratic, mass->r,32,32); mass->xrot += mass->xrotSpeed; mass->yrot += mass->yrotSpeed; mass->zrot += mass->zrotSpeed; }
~EToreo
I think your problem can be solved using the functions glPushMatrix() and glPopMatrix(). Do something like: Draw Sun, then for each planet: call rotatef to rotate next planet around sun, push matrix, translate to position of next planet, draw planet, then pop matrix. Then rinse and repeat. If you want to rotate the planet on it''s axis also then do another rotate just before drawing it. Hope that helps!
"If all else fails, lower your standards."
Advertisement
I am working on a similar kind of thing, so let me tell you what I learned so you don''t literally spend DAYS correcting the slightest errors like I did (3d transformations are a real pain in the neck)

Use quaternions for rotations (and make sure you multiply them in the correct order... I can''t stress this enough). Then when drawing an object you should do as little calls of glRotatef() as possible... otherwise, beyond a certain scale the stuff you draw will start flickering, because of floating point rounding errors in matrix calculations. Again, as a rule make sure you do as little transformations as possible, trust me. You wouldn''t find that out just by drawing planets, but when you''d draw the planets'' satellites those glitches would creep up.

Like the previous poster said, use glPushMatrix() and glPopMatrix(), that will solve your problem in the meantime. But you''ll probably have to rewrite your code anyway if you will want to draw tiny asteroids along with the sun and the planets which are considerably larger objects.

Its all a matter of scale really. There was a nice oldish article on gamasutra about building a solar system, I suggest you take a look at it, it''s very good.
Thanks for the help guys! The push and pop functions took care of it.

I will look into quaternions, I hope they are easy, because I am kind of worn-out fixing my code.

Thanks again!


~EToreo
~EToreo
quote:

I will look into quaternions, I hope they are easy, because I am kind of worn-out fixing my code.



*snicker*
Well, it turns out that they are not *that* bad. just some math, and if you ignore that, they are cake!

~EToreo
~EToreo

This topic is closed to new replies.

Advertisement