OpenGL 恒定旋转角度
OpenGL constant rotation angle
我最近在做一些 openGL 编程,它涉及基本的矩阵变换,例如平移、旋转和缩放。我在做轮换时遇到了一些问题。这是我的问题。
现在我使用变量 rotationDegree 和变量 rotationStepSize 来控制旋转。当旋转标志打开时
//inside paintGL function
if(rotationFlag is on)
rotationDegree += rotationStepSize
if(rotationDegree > 360.0f)
rotationDegree -= 360.0f
奇怪的是,由于我将 rotationStepSize 定义得非常小,旋转开始时非常慢,但随着时间的增加,它变得越来越快!
对于这种现象我有两种解释:
- 360f 不是 glm::rotate
中 degree 参数的取值范围
- 程序启动缓慢,导致 paintGL 绘制到屏幕的次数减少。然后随着程序变得稳定(或者其他参数没有变化),mainLoopEvent执行的越来越快,导致paintGL被绘制得越来越多。
有谁知道如何解决这个问题?我用 google 搜索了关于使用 glutget(GL_TIME_ELAPSED) 的信息,但是在我的机器上,这个函数报告 "glutget: missing ENUM handle",这表明我的 glut 文件不完整,我猜?
那么有谁知道如何解决枚举问题或如何解决这个问题以创建一个让物体以恒定速度旋转的场景?
非常感谢!
根据freeglut_state.c,定义了glutGet函数
int FGAPIENTRY glutGet( GLenum eWhat )
{
#if TARGET_HOST_WIN32 || TARGET_HOST_WINCE
int returnValue ;
GLboolean boolValue ;
#endif
switch (eWhat)
{
case GLUT_INIT_STATE:
return fgState.Initialised;
case GLUT_ELAPSED_TIME:
return fgElapsedTime();
}
我没有使用 freeglut,但请查看文档,也许您应该尝试 GLUT_ELAPSED_TIME
而不是 GL_TIME_ELAPSED
?
并像这样计算增量时间:
int preTime= 0;
while( ... )
{
int currentTime= glutGet(GLUT_ELAPSED_TIME);
int deltaTime = currentTime- preTime;
preTime = currentTime;
//... pass the deltaTime to whatever you want...
}
我最近在做一些 openGL 编程,它涉及基本的矩阵变换,例如平移、旋转和缩放。我在做轮换时遇到了一些问题。这是我的问题。
现在我使用变量 rotationDegree 和变量 rotationStepSize 来控制旋转。当旋转标志打开时
//inside paintGL function
if(rotationFlag is on)
rotationDegree += rotationStepSize
if(rotationDegree > 360.0f)
rotationDegree -= 360.0f
奇怪的是,由于我将 rotationStepSize 定义得非常小,旋转开始时非常慢,但随着时间的增加,它变得越来越快!
对于这种现象我有两种解释:
- 360f 不是 glm::rotate 中 degree 参数的取值范围
- 程序启动缓慢,导致 paintGL 绘制到屏幕的次数减少。然后随着程序变得稳定(或者其他参数没有变化),mainLoopEvent执行的越来越快,导致paintGL被绘制得越来越多。
有谁知道如何解决这个问题?我用 google 搜索了关于使用 glutget(GL_TIME_ELAPSED) 的信息,但是在我的机器上,这个函数报告 "glutget: missing ENUM handle",这表明我的 glut 文件不完整,我猜?
那么有谁知道如何解决枚举问题或如何解决这个问题以创建一个让物体以恒定速度旋转的场景?
非常感谢!
根据freeglut_state.c,定义了glutGet函数
int FGAPIENTRY glutGet( GLenum eWhat )
{
#if TARGET_HOST_WIN32 || TARGET_HOST_WINCE
int returnValue ;
GLboolean boolValue ;
#endif
switch (eWhat)
{
case GLUT_INIT_STATE:
return fgState.Initialised;
case GLUT_ELAPSED_TIME:
return fgElapsedTime();
}
我没有使用 freeglut,但请查看文档,也许您应该尝试 GLUT_ELAPSED_TIME
而不是 GL_TIME_ELAPSED
?
并像这样计算增量时间:
int preTime= 0;
while( ... )
{
int currentTime= glutGet(GLUT_ELAPSED_TIME);
int deltaTime = currentTime- preTime;
preTime = currentTime;
//... pass the deltaTime to whatever you want...
}