OpenGL模拟地月星系运动

运动规则:
-> 地球绕太阳公转, 公转半径为 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();

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值