所有行星在动画时都以相同的速度围绕太阳运行
OpenGL: All planets have the same speed around the sun when animating
我试图在GLUT中制作一个太阳系的动画,但不知怎么的,所有的行星都以相同的速度围绕太阳飞行,而它们都有不同的值。
我是OpenGL/GLUT的新手,所以如果你能解释一下你的答案,我会很感激:)
这是我的动画方法:
void renderScene(void)
{
glClearDepth(1);
glClearColor(0.0, 0.0, 0.0, 1.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
if (spinMode) {
// Update the animation state
HourOfDay += AnimateIncrement;
DayOfYear += AnimateIncrement/24.0;
HourOfDay = HourOfDay - ((int)(HourOfDay/24))*24;
DayOfYear = DayOfYear - ((int)(DayOfYear/365))*365;
}
glLoadIdentity();
glLightfv(GL_LIGHT1, GL_POSITION,LightPosition);
glRotatef(15.0, 1.0, 0.0, 0.0 );
//Drawing the sun
glTranslatef(0.0f, 0.0f, f);
glColor3f(1.0, 1.0, 0.0);
//glPushMatrix();
gluSphere(quad[0], 1.0f, 64, 64);
glRotatef(360.0*DayOfYear/365.0, 0.0, 1.0, 0.0);
glPopMatrix();
//Drawing mercurius
glColor3f(0.5, 0.5, 0.5);
glPushMatrix();
glTranslatef(2.0, 0.0, 0.0); //eerste parameter afstand tot zon
gluSphere(quad[1], 0.2f, 64, 64);
glRotatef(360.0*DayOfYear/365.0, 0.0, 1.0, 0.0);
glPopMatrix();
//Drawing the earth
glColor3f(0.2, 0.2, 1.0);
glPushMatrix();
glTranslatef(3.0, 0.0, 0.0); //eerste paramater afstand tot zon
gluSphere(quad[2], 0.4f, 64, 64);
glRotatef(360.0*DayOfYear/365.0, 0.0, 1.0, 0.0);
glPopMatrix();
//Drawing the earth1
glColor3f(0.2, 0.2, 1.0);
glPushMatrix();
glTranslatef(3.0, 0.0, 0.0); //eerste paramater afstand tot zon
gluSphere(quad[2], 0.6f, 64, 64);
glRotatef(360.0*3*DayOfYear/365.0, 0.0, 1.0, 0.0);
glPopMatrix();
//Drawing the earth2
glColor3f(0.2, 0.2, 1.0);
glPushMatrix();
glTranslatef(4.0, 0.0, 0.0); //eerste paramater afstand tot zon
gluSphere(quad[2], 0.3f, 64, 64);
glRotatef(360.0*4*DayOfYear/365.0, 0.0, 1.0, 0.0);
glPopMatrix();
//Drawing the earth3
glColor3f(0.2, 0.2, 1.0);
glPushMatrix();
glTranslatef(4.3, 0.0, 0.0); //eerste paramater afstand tot zon
gluSphere(quad[2], 0.75f, 64, 64);
glRotatef(360.0*2*DayOfYear/365.00, 0.0, 1.0, 0.0);
glPopMatrix();
// Flush the pipeline, and swap the buffers
glFlush();
glutSwapBuffers();
if ( singleStep ) {
spinMode = GL_FALSE;
}
glutPostRedisplay(); // Request a re-draw for animation purposes
}
您的呼叫顺序不对。所以每个行星都会绕着它的中心沿y轴旋转。以水星为例。
glTranslatef(2.0, 0.0, 0.0);//Move to new position
gluSphere(quad[1], 0.2f, 64, 64);
glRotatef(360.0*DayOfYear/365.0, 0.0, 1.0, 0.0); //Rotate y axis
正确的顺序应为
glRotatef(360.0*DayOfYear/365.0, 0.0, 1.0, 0.0); //Rotate y axis
glTranslatef(2.0, 0.0, 0.0); //Move to new position
gluSphere(quad[1], 0.2f, 64, 64);
然而,如果这是唯一的错误,你的行星将不会围绕太阳旋转。让你的行星绕太阳旋转的是第二个错误,你忘了在与太阳进行变换之前推动矩阵。因此,每个星球都继承了这些转变。正确的代码应该是
//Put every global transformation here
//Drawing the sun
glPushMatrix();
glColor3f(1.0, 1.0, 0.0);
glRotatef(360.0 * DayOfYear / 365.0, 0.0, 1.0, 0.0); //This will self-rotate the sun
gluSphere(quad[0], 1.f, 64, 64);
glPopMatrix();
//Drawing mercurius
glPushMatrix();
glColor3f(0.5, 0.5, 0.5);
glRotatef(360.0*DayOfYear/365.0, 0.0, 1.0, 0.0);
glTranslatef(2.0, 0.0, 0.0); //eerste parameter afstand tot zon
gluSphere(quad[1], 0.2f, 64, 64);
glPopMatrix();
//Drawing the earth1
glPushMatrix();
glColor3f(0.2, 0.2, 1.0);
glRotatef(360.0*3*DayOfYear/365.0, 0.0, 1.0, 0.0);
glTranslatef(3.0, 0.0, 0.0); //eerste paramater afstand tot zon
gluSphere(quad[2], 0.6f, 64, 64);
glPopMatrix();
你也应该只在你的主渲染函数中使用glutSwapBuffers(),在回调函数中使用glutPostRedisplay()。
注意360.0*DayOfYear/365.0是在你的行星的每一个旋转。如果你想让它们以不同的速度旋转那么你旋转它们的量就需要不同。将365.0更改为不同的数字以生成不同长度的年份。数字越大,年份越长,数字越小,年份越短。
你必须在之后实际渲染球体,你称之为glTranslate
和glRotate
。现在,你在中间做,所以它会忽略旋转!
glTranslatef(2.0, 0.0, 0.0); //eerste parameter afstand tot zon
gluSphere(quad[1], 0.2f, 64, 64);
glRotatef(360.0*DayOfYear/365.0, 0.0, 1.0, 0.0);
应该glRotatef(360.0*DayOfYear/365.0, 0.0, 1.0, 0.0);
glTranslatef(2.0, 0.0, 0.0); //eerste parameter afstand tot zon
gluSphere(quad[1], 0.2f, 64, 64); // <-- after you rotate!
你确定你不是在旋转对象本身,而是旋转它们相对于中心点的位置吗?试着改变glPushMatrix()
和glPopMatrix()
之间语句的顺序。
你实际上是在旋转和翻译你所渲染的所有对象。我建议单独增加每个行星,使它们以不同的速度旋转。你可以创建一个包含所有必要信息的结构,如旋转和公转速度,并使用结构数据来创建所有的行星。这样,在if(spinMode)中,您可以执行类似mars.revolve()的操作。
相关文章:
- 为什么这些算法的运行速度比它们应该的要快?
- Windows 7 应用程序在未聚焦时运行速度较慢
- 当 2 个线程共享同一物理内核时,具有错误共享的易失性增量在发布中的运行速度比在调试中慢
- O(NlogN)算法运行速度快于O(n)..等等,什么
- C++openssl SHA256运行速度比JDK SHA256实现慢
- 有人可以解释为什么使用 OpenMP 部分的运行速度比单个线程慢吗?
- 为什么这个简单的 C++ SIMD 基准测试在使用 SIMD 指令时运行速度较慢?
- 为什么C 运行速度比Python慢
- 通过创建单个线程来运行一段代码可加快执行速度
- QWebView 用于在桌面应用程序中运行 javascript (D3) - 当 HTML 更改时重新加载速度很慢
- cl 生成的可执行文件在第一次运行时运行速度非常慢
- JIT 编译的运行速度能否比编译时模板实例化更快?
- Python的运行速度比C和C 更快
- 将变量从Python转移到C ,并全速运行C (不是Python速度)
- 我的OpenCL测试的运行速度不超过CPU
- 如果我用代码块编译代码,为什么我的代码运行速度更快
- 具有`k`线程的多线程程序的运行速度都比其顺序版本快
- 在Visual Studio上运行时程序速度变慢
- 如何使程序在不同计算机上以相同的速度运行
- 如何使动态数组或矢量以与标准阵列相似的速度运行?C++