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

标签 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;
}

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

最佳答案

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

关于c++ - 地球opengl c++的旋转和平移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16591636/

相关文章:

c++ - 为什么我会收到 "was not declared in this scope"错误?

java - 必须实现继承的方法ApplicationListener.render()

c# - WPF 中的 OpenGL 控件因 OOM 异常而崩溃

c++ - 3d 立方体 opengl - 重叠边

c++ - 难以理解在头类声明中发现的这种模式正在做什么(C++、OpenGL)

c++ - 外部存储器上的 QDataStream?

c++ - glGetTexImage 读取过多纹理格式为 GL_ALPHA 的数据

c++ - OpenGL 游戏截屏

c++ - 是否可以在概念中指定模板类?

c++ - 包装 C++ 类 API 以供 C 使用时如何将异常转换为错误和错误消息?