0

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

//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;
}

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

4

2 回答 2

2

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

于 2013-05-16T15:50:23.633 回答
2

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

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

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

  1. 世界空间
  2. 相机空间(或视图空间)
  3. 对象空间
  4. 模型空间

所以,你的模型(比如地球)从模型空间到物体空间的转换——这是地球围绕垂直轴的旋转。然后它有一个从物体空间到世界空间的转换——这是关于太阳和倾斜的转换。最后的转换是从世界空间到相机空间。

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

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

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

于 2013-05-16T15:53:29.123 回答