эта перенасыщенная сфера не будет вращаться, почему? с использованием 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;
}

Кажется из моей строки отладки << угол;’ этот избыток вызывает функцию отображения только один раз.
Я использую Microsoft Visual C ++ 2010 с GLUT

-1

Решение

Есть несколько вариантов:

Вы можете вручную позвонить glutPostRedisplay попросить основной цикл снова вызвать функцию отображения, как задокументировано здесь.

Или вы можете настроить его на автоматический вызов вашего дисплея как можно чаще, установив его как функцию ожидания с glutIdleFunc, как задокументировано здесь.

Если вы собираетесь использовать Idle Func, я бы определенно предложил вам создать такую ​​функцию, как gameUpdate или же simulationUpdate где вы манипулируете своим углом и затем звоните glutPostRedisplay так что изменения могут быть представлены.

0

Другие решения

добавить это к основному

glutIdleFunc( display );

это говорит о переизбытке вызова вашей функции отображения, когда программа находится в режиме ожидания.

0

На самом деле сфера вращается правильно. Однако GLUT вызывает функции отображения как можно меньше раз: он будет вызываться только тогда, когда окно изменилось.

Чтобы решить эту проблему, вы должны использовать функцию простоя. Функция бездействия — это функция, вызываемая последовательно GLUT. Вы могли бы сделать что-то вроде:

void idle() {
angle += 1;
glutPostRedisplay();
}

И в вашей основной функции:

glutIdleFunc(idle);
0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector