Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 这个过剩的球体赢得了';为什么不旋转?使用visualc++;2010_C++_Visual Studio 2010_Opengl_Animation_Glut - Fatal编程技术网

C++ 这个过剩的球体赢得了';为什么不旋转?使用visualc++;2010

C++ 这个过剩的球体赢得了';为什么不旋转?使用visualc++;2010,c++,visual-studio-2010,opengl,animation,glut,C++,Visual Studio 2010,Opengl,Animation,Glut,这是我正在使用的完整代码。球体不像我想象的那样旋转。通常我用java编程,所以可能是C++编程而不是GLUTU.p> #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

这是我正在使用的完整代码。球体不像我想象的那样旋转。通常我用java编程,所以可能是C++编程而不是GLUTU.p>
#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;
}
#包括“stdafx.h”
#包括
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
静态浮动角度=0;
void init(void)
{
GLfloat mat_镜面反射[]={1.0、.5f、.5f、.5f};
GLfloat mat_亮度[]={15.0};
GLfloat light_位置[]={1.0,1.0,1.0,0.0};
glClearColor(0.0,0.0,0.0,0.0);
glShadeModel(GLU平面);
GLMATERIALV(GL_前部、GL_镜面反射、mat_镜面反射);
GLMATERIALV(GL_正面、GL_反光、mat_反光);
glLightfv(GLU灯0、GLU位置、灯位置);
glEnable(德国劳埃德大学照明);
glEnable(GL_LIGHT0);
glEnable(GLU深度试验);
}
作废显示(作废)
{
不能将此添加到主菜单中

glutIdleFunc( display );

它告诉glut在程序处于空闲状态时调用显示功能。

有几个选项:

您可以手动调用
glutPostRedisplay
,要求主循环再次调用显示功能,如下所示

或者,您可以将其设置为尽可能频繁地自动调用显示器,方法是使用
glutIdleFunc
将其设置为空闲函数,如下所示


如果你使用Idle函数,我肯定会建议你创建一个函数,比如
gameUpdate
simulationUpdate
,在这里你可以操纵你的角度,然后调用
glutPostRedisplay
,这样就可以渲染变化了。

事实上,球体正在正确旋转。然而,GLUT调用display的功能尽可能少:只有在窗口更改时才会调用它

要解决这个问题,您应该使用空闲函数。空闲函数是GLUT连续调用的函数。您可以执行以下操作:

void idle() {
  angle += 1;
  glutPostRedisplay();
}
在你的主要职能中:

glutIdleFunc(idle);

我对GLUT不太熟悉,您是否尝试过使用一些事件强制刷新窗口(如调整其大小)以查看它是否会触发对
显示的新调用?@Charles Welton我已经尝试过了,但没有效果。这是我的第一个想法。我的变量是否在迭代范围内?我忘记了glutPostRedisplay()调用原始代码。有必要重新绘制屏幕。这是有效的。我想知道是否有重新显示功能。我只是不知道它被调用了什么。但是我复制并粘贴了简单的动画代码,没有使用这种方法。例如,这一个。有什么区别吗?我相信这一部分的代码是什么ge的工作是glutSwapBuffers,它将应用在begin/END之间之前发生的渲染。请记住,要交换缓冲区,您需要在init中指定GLUT_DOUBLE,但您已经这样做了,不用担心:)