地球opengl c ++的旋转和平移

时间:2013-05-16 15:30:02

标签: c++ opengl

我试图让一个球体围绕另一个模拟地球轨道的旋转。 我能让地球围绕太阳运行;但是,我不能让它绕自己旋转。 这是我到目前为止的代码:

//sun
glMaterialAmbientAndDiffuse(GLMaterialEnums::FRONT,GLColor<GLfloat,4>(1.5f,1.0f,0.0f));
glTranslate(0.0f, 0.0f, 0.0f);
glRotate(15.0, 1.0, 0.0, 0.0);
drawEllipsoid(10.0, 1.0, 4, 4);
glPushMatrix();


//Earth
glMaterialAmbientAndDiffuse(GLMaterialEnums::FRONT,GLColor<GLfloat,4>(0.5f,10.5f,10.5f));
glRotate(orbit,Vrui::Vector(0,0,1));
glTranslate(105.0, 0.0, 0.0);
drawPlanetGrid(5, 1, 4, 4, 1);
glPopMatrix();
orbit += .1;

if (orbit > 360)    
{
    orbit = 0;
}

有人能帮助我朝着正确的方向前进吗?我还需要知道如何让地球以倾斜的角度围绕太阳运行。

2 个答案:

答案 0 :(得分:2)

基本上,您需要管理一些模型矩阵。太阳的模型矩阵(如果以(0,0,0)为中心只有一个旋转部分)。围绕太阳旋转的地球需要一个模型矩阵,该矩阵首先旋转然后平移以放置在太阳的轨道上。因此,在计算新帧时,您需要增加旋转参数,创建旋转,然后应用平移。如果要添加月球,则需要另一个累积的模型矩阵。也就是说,月球需要单独的旋转和平移(如太阳),但你必须考虑到地球的变形。确保您了解转换矩阵的作用。在那种情况下,变换矩阵只是坐标变换。所以,你有一个局部框架中的太阳,地球和月亮。模型矩阵实现了从局部坐标系到世界坐标系的转换。视图矩阵将世界坐标转换为眼睛坐标。然后只有投影留给你。

答案 1 :(得分:2)

要解决这个问题,您需要了解协调系统的概念以及如何在OpenGL中使用它们。

坐标系统只是一组共享相同XYZ轴的点。在每个系统中,XYZ轴不一定指向相同的方向,因此在一个系统中,在正X中移动可以在其他系统中以负Y移动。要将点从一个系统转换为另一个系统,请使用转换矩阵。

场景由几个坐标系统组成: -

  1. 世界空间
  2. 相机空间(或视图空间)
  3. 对象空间
  4. 模型空间
  5. 因此,你的模型(地球,比如说)具有从模型空间到物体空间的转换 - 这是地球围绕垂直轴的旋转。然后它有一个从物体空间到世界空间的转换 - 这是关于太阳和倾斜的翻译​​。最终的转变是从世界空间到相机空间。

    因此,您需要三个矩阵才能将地球模型放在屏幕上的正确位置。这可能看起来像很多处理,但关于这些矩阵的事情是它们可以相乘以形成单个对象 - >相机空间矩阵。

    使用各种坐标系统和转换设置场景后,它应该可以正常工作。

    您可能希望使用立方体而不是球体开始,因为它们更容易跟踪顶点在变换时发生的情况。