freeglut (仮想マシンの Linux) を使用して、いくつかの簡単な描画とアニメーションを試してきました。今まで、すべてが構築され、機能していました。私の最近の試みは、 で正方形を動かしていましたglTimerFunc
。でエラーなくビルドできたgcc stack.c -lGL -lglut -o stack
のですが、アニメーション自体が動きません。大量のアニメーションを見つけることができるすべての例を調べましたが、コードに問題は見られませんでした。誰かが私の間違いを説明してもらえますか?
(編集:作業コードについては以下を参照)
#include <stdio.h>
#include <stdlib.h>
#include <GL/freeglut.h>
int dx = 0;
#define TIMERSECS 100
void animate(int value) {
glutTimerFunc(TIMERSECS, animate, 1);
if (dx > 0.5) {
dx = -0.5;
}
else {
dx += 0.1;
}
glutPostRedisplay();
}
void display(void) {
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(0.0, 0.0, 0.5);
glBegin(GL_POLYGON);
glVertex2d(-0.5+dx, 0.5);
glVertex2d(-0.5+dx, -0.5);
glVertex2d(0.5+dx, -0.5);
glVertex2d(0.5+dx, 0.5);
glEnd();
glutSwapBuffers();
}
void initialize(void) {
glClearColor(1.0, 1.0, 1.0, 1.0);
glShadeModel(GL_SMOOTH);
}
void main(int argc, char *argv[]) {
glutInit(&argc, argv);
glutInitWindowPosition(100, 100);
glutInitWindowSize(500, 500);
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);
glutCreateWindow(argv[0]);
initialize();
glutDisplayFunc(display);
glutTimerFunc(TIMERSECS, animate, 0);
glutPostRedisplay();
glutMainLoop();
}
編集
@datenwolf: 今回はあなたがより慎重に回答した他の質問を見て、そこからいくつかのコードを取得しました。
新しいバージョンは次のとおりです。
#include <stdio.h>
#include <stdlib.h>
#include <GL/freeglut.h>
int factor=100; // factor the animation is slowed down by
double dx = 0;
void animate(double speed);
static double ftime(void) {
struct timeval t;
gettimeofday(&t, NULL);
return 1.0*t.tv_sec + 1e-6*t.tv_usec;
}
static double last_T;
static void idle(void) {
const double now_T = ftime();
const double delta_T = now_T - last_T;
last_T = now_T;
const double speed = delta_T * 60;
animate(speed);
glutPostRedisplay();
}
void animate(double speed) {
if (dx > 1.5) {
dx = -1.5;
}
else {
dx += speed/factor;
}
glutPostRedisplay();
}
void display(void) {
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(0.0, 0.0, 0.5);
glBegin(GL_POLYGON);
glVertex2d(-0.5+dx, 0.5);
glVertex2d(-0.5+dx, -0.5);
glVertex2d(0.5+dx, -0.5);
glVertex2d(0.5+dx, 0.5);
glEnd();
glutSwapBuffers();
}
void initialize(void) {
glClearColor(1.0, 1.0, 1.0, 1.0);
glShadeModel(GL_SMOOTH);
}
void main(int argc, char *argv[]) {
glutInit(&argc, argv);
glutInitWindowPosition(100, 100);
glutInitWindowSize(500, 500);
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);
glutCreateWindow(argv[0]);
initialize();
glutDisplayFunc(display);
glutIdleFunc(idle);
glutPostRedisplay();
glutMainLoop();
}
Dankeschön für deine Hilfe!