这个过剩的球体不会旋转,为什么?使用 Visual C++ 2010
this glut sphere won't spin, why? using Visual c++ 2010
这是我正在使用的完整代码。球体不会像我期望的那样旋转。通常我用Java编程,所以也许是我的c ++编程而不是GLUT。
#include "stdafx.h"
#include <stdlib.h>
#include <stdio.h>
#include <GL/glut.h>
#include <GL/glu.h>
#include <GL/gl.h>
#include <iostream>
using namespace std;
static float angle = 0;
void init(void)
{
GLfloat mat_specular[] = { 1.0, .5f, .5f, .5f };
GLfloat mat_shininess[] = { 15.0 };
GLfloat light_position[] = { 1.0, 1.0, 1.0, 0.0 };
glClearColor (0.0, 0.0, 0.0, 0.0);
glShadeModel (GL_FLAT);
glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);
glLightfv(GL_LIGHT0, GL_POSITION, light_position);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glEnable(GL_DEPTH_TEST);
}
void display(void)
{
cout << angle;
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glRotatef(90, 1, 0, 0);
glRotatef(angle, 0, 0, 1);
glutSolidSphere (.5, 24, 24);
glPopMatrix();
glFlush ();
angle += 1;
glutSwapBuffers();
}
void reshape (int w, int h)
{
glViewport (0, 0, (GLsizei) w, (GLsizei) h);
glMatrixMode (GL_PROJECTION);
glLoadIdentity();
glOrtho (-1.5*(GLfloat)w/(GLfloat)h, 1.5*(GLfloat)w/(GLfloat)h, -1.5, 1.5, -10.0, 10.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowSize (500, 500);
glutInitWindowPosition (100, 100);
glutCreateWindow (argv[0]);
init ();
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutMainLoop();
return 0;
}
从我的调试行"cout <<角度"来看,glut 只调用显示函数一次。我正在使用带有 GLUT
有几个选项:
您可以手动调用 glutPostRedisplay
以要求主循环再次调用显示函数,如此处所述。
或者,您可以将其设置为尽可能频繁地自动调用显示器,方法是将其设置为带有glutIdleFunc
的空闲功能,如此处所述。
如果你要使用 Idle Func,我绝对建议您创建一个函数,例如 gameUpdate
或 simulationUpdate
来操纵角度,然后调用glutPostRedisplay
以便可以渲染更改。
将其添加到主
glutIdleFunc( display );
这告诉 glut 在程序处于空闲状态时调用您的显示函数。
事实上,球体正在正确旋转。但是,GLUT 尽可能少地调用显示函数:仅当窗口更改时才会调用它。
要解决此问题,您应该使用空闲函数。空闲函数是由 GLUT 连续调用的函数。您可以执行以下操作:
void idle() {
angle += 1;
glutPostRedisplay();
}
在您的主要功能中:
glutIdleFunc(idle);
相关文章:
- 为什么使用 "this" 指针调用派生成员函数?
- 为什么使用SFINAE而不是函数重载
- 为什么使用 P/Invoke 调用 dll 时,某些计算机中的 LoadLibrary 失败?
- 为什么使用__LINE_的代码在发布模式下在MSVC下编译,而不是在调试模式下
- 为什么使用 NDK 不能存在不同的 stl 实现?
- 如果我重新定义 sqrt 函数,为什么使用 std::sqrt 失败?
- 为什么使用析构函数会使类不可复制?
- 为什么使用数组元素查找最大数字的程序不起作用?
- 我应该在 C++ 中何时/为什么使用 STATIC?
- 为什么 g++ 使用 movabs 和一个奇怪的常数来简单还原?
- 当键值是 std 向量时,为什么使用 at in C++ 访问映射值如此缓慢?
- 为什么使用Pool和Bool而不是int8_t或char
- 为什么使用EnTT进程无法编译
- 为什么使用 size_t 来索引/表示数组的大小?
- 为什么使用 std::istream_iterator 构造函数返回指针
- 为什么使用 QString::right 在字符串开头省略逗号?
- 为什么使用 std::vector 的代码不能编译,但使用 std::unique_ptr 如果没有 noexcept
- 为什么使用不匹配的参数调用重载函数仍然有效
- 为什么使用存储在虚拟方法表中的地址调用虚拟函数的函数会返回垃圾?
- C ++分割错误,为什么使用"long long"我没有得到答案?