また手抜きopenglを参考にしてglutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH)をgluiinitの後ろにおいても同じ現象が起こってしまいます。 これは何故でしょうか 私の調べた範囲では説明がありませんでした。 恐らくダブルバッファ・モードになってないためglutswapbuffersが仕事をしてくれないからだと思います。。。
申し訳ありません glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH);を先頭においた状態でdisplay関数内のglflushをglutSwapBuffersに変更したら問題が解決しました。
以下が正常に動いたコードで開発環境はvisual studioです osはwindows7です。
#pragma comment(linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"")
#include <stdlib.h>
#include <stdio.h>
#include <GL/glut.h>
#include<math.h>
////////////////////////////////////////////
//円周率
const double PI= 3.14159;
#define N 256
//ウィンドウの大きさ
double W=300;
double H=300;
//フォント
void *font = GLUT_BITMAP_HELVETICA_18;
char s1[N] = {'\0'};
GLfloat red[]={1,0,0,0};
// 初期の振り子の角度と角速度
double r=0,ω=90;
//ラジアンに変換
double x=r*PI/180;
double v=ω*PI/180;
//振り子の糸の長さと重力定数
const double l=1;
const double g=9.8;
double t=0;
//////////////////////////////////////////////
//運動方程式
double f1(double t,double x,double v){
return -(g/l)*sin(x);
}
//ルンゲクッタ法
void calculate(){
double dt=0.01;
double k1=0,k2=0,k3=0,k4=0;
k1=dt*f1(t,x,v);
k2=dt*f1(t+dt/2.0,x+k1/2.0,v+k1/2.0);
k3=dt*f1(t+dt/2.0,x+k2/2.0,v+k2/2.0);
k4=dt*f1(t+dt,x+k3,v+k3);
v+=(k1+2.0*k2+2.0*k3+k4)/6.0;
x+=v*dt;
r=x*180/PI;
t+=dt;
sprintf_s(s1, "%lf", t);
}
//文字表示関数
void render_string(float s, float k, const char* string){
float z = -1.0f;
glColor3f(1,0,0);
glRasterPos3f(s, k, z);
char* p = (char*) string;
while (*p != '\0') glutBitmapCharacter(GLUT_BITMAP_HELVETICA_18, *p++);
}
void display(){
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
render_string(-0.8, 0.8, "OpenGL");
render_string(-0.9, 0.7, "t=");
render_string(-0.8, 0.7, s1);
glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, red);
glTranslated(0,l,0);
glRotated(r,0,0,1);
glTranslated(0,-l,0);
glBegin(GL_LINES);
glVertex3d(0,l,0);
glVertex3d(0,0,0);
glEnd();
glutSolidSphere(l/10,30,30);
glFlush();
}
void init(){
glClearColor(1,1,1,1);
glEnable(GL_DEPTH_TEST);
glEnable(GL_CULL_FACE);
glCullFace(GL_BACK);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
}
void resize(int w,int h){
glViewport(0,0,w,h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(30,(double)w/(double)h,1,100);
gluLookAt(0,l/2,3,0,l/2,0,0,1,0);
glMatrixMode(GL_MODELVIEW);
display();
}
void timer(int value){
glutPostRedisplay();
calculate();
glutTimerFunc(10 , timer , 0);
}
int main(int argc, char *argv[]){
glutInit(&argc, argv);
glutInitWindowSize(W,H);
glutCreateWindow("振り子");
glutDisplayFunc(display);
glutReshapeFunc(resize);
glutTimerFunc(0,timer,0);
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH);
init();
glutMainLoop();
return 0;
}