我有一个旋转对象旋转大约0,0,0。我现在想要另一个对象围绕另一个对象旋转。有点像地球围绕太阳旋转然后月球围绕地球旋转。 我不知道该怎么做。
void earth(){
glPushMatrix();
glRotatef(anglee, 1.0f, 0.0f, 0.0f);
glTranslatef(0.0,20,0);
glutSolidSphere(0.8,50,50);
glPopMatrix();
glPushMatrix();
glRotatef(anglee, 0.0f, 0.0f, 0.0f);
glTranslatef(0.0,20.0,8);
glutSolidSphere(0.4,50,50);
glPopMatrix();
anglee+=4.0f;
}
我的第一次旋转是正确的,但我不知道如何进行第二次旋转。
答案 0 :(得分:1)
这是一个提示..在显示回调函数中执行此操作:
void display()
{
glClearColor(0,0,0,0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
gluLookAt(10,10,10, 0,0,0, 0,1,0);
/* current position is by default the origin */
//draw sun
glutSolidSphere(1,100,100);
//draw planet
glRotated(angle1,0,1,0); //rotates position by angle1
glTranslated(0,0,5); //translates position by sun-planet distance
glutSolidSphere(0.7,100,100); //draw planet at this new position
//draw moon
glRotated(angle2,0,1,0); //rotates position by angle1+angle2
glTranslated(0,0,2); //translates position by planet-moon distance
glutSolidSphere(0.3,100,100); //draw moon at this new position
glutSwapBuffers();
angle1 += 0.2;
angle2 += 0.2;
if(angle1 > 360) angle1 = 0;
if(angle2 > 360) angle2 = 0;
}
尝试评论绘制行星和月亮部分的某些线条并查看差异,这将有助于您理解它。
希望这有帮助!
答案 1 :(得分:1)
您在第二次轮播中遇到的问题:
glRotatef(anglee, 0.0f, 0.0f, 0.0f);
你还没有指定NoRotation Axis !!
尝试:
glRotatef(anglee, 0.0f, 1.0f, 0.0f);
围绕 Y轴旋转 !!!
答案 2 :(得分:0)
这是一些伪代码:
宣布时间浮动。
在更新/绘制循环中将其增加一个小值,如.01
为变换Y值执行Math.cos(时间)*(您想要的半径),为变换Y值执行Math.sin(时间)*(您想要的半径)。这将导致基于零时间的进展速率的轨道运行。
如果你需要让它偏离“中心对象”的位置,那么只需将第一个对象的平移添加到每个平移轴。
答案 3 :(得分:0)
你实际上在做的是在太空中彻底改变两个球体。你需要做的是相对于地球的位置进行月球的定位 - >在绘制地球和月球之间不要做glPopMatrix()。通过这样做,您可以重置opengl转换矩阵。
我会尝试如下:
所以一切都可以在GPU上完成......
PS:我还没有尝试过您的代码。因此,为了按预期工作,可能需要对代码进行一些进一步的更改......