运动规则:
-> 地球绕太阳公转, 公转半径为 R
-> 月球绕地球公转, 公转半径为 r
-> 太阳、地球、月球各自自转
OpenGL模型变换原则, 对当前模型坐标系进行操作,无论是旋转、平移、缩放。可以想象成有很多模型坐标系,起初模型坐标系与世界坐标系重合。
glRotated 当前坐标系(相对于世界坐标系)进行旋转
glTranslated 当前坐标(相对于世界坐标系)进行平移
glScale 当前坐标系(相对于世界坐标系)缩放
double R = 900;
double r = 300;
double publicEarth; // 地球公转角度
double publicMoon; // 月球公转角度
double ownerEarth; // 太阳自传角度
double ownerMoon; // 月球自转角度
double ownerSun; // 太阳自转角度
CStlObject earth, moon, sun;
// 太阳
glPushMatrix();
{
glRotated(ownerSun, 0.0, 0.0, 1.0);
sun.Draw();
}
glPopMatrix();
// 地球
glPushMatrix();
{
glRotated(publicEarth, 0.0, 0.0, 1.0);
glTranslated(R, 0.0, 0.0); // 旋转之后再平移, 效果是以R为半径,(0, 0, 0)为中心,旋转publicEarth度
glRotated(ownerEarth, 0.0, 0.0, 1.0); // 平移之后旋转, 以(R, 0, 0)为中心,旋转ownerEarth度
earth.Draw();
}
glPopMatrix();
// 月球
glPushMatrix();
{
// 月球绕地球转,地球是动态的
// 月球首先要执行与地球一样的模型变换
glRotated(publicEarth, 0.0, 0.0, 1.0);
glTranslated(R, 0.0, 0.0);
glRotated(ownerEarth, 0.0, 0.0, 1.0);
// 月球再执行自己的公转与自转
glRotated(publicMoon, 0.0, 0.0, 1.0);
glTranslated(r, 0.0, 0.0); // 以r为半径, (R, 0, 0)绕(0,0,0)旋转后的位置为中心, 旋转publicMoon度
glRotated(ownerMoon, 0.0, 0.0, 1.0);
moon.Draw();
}
glPopMatrix();