文字表示関数を上に書いても物体の動きに引きずられて動いてしまいます。
開発環境はvisual studio 2012 言語はc++ ライブラリはglutです。
#pragma comment(linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"")
#include <stdlib.h>
#include <GL/glut.h>
#include<math.h>
////////////////////////////////////////////
//円周率
const double PI= 3.14159;
//ウィンドウの大きさ
double W=300;
double H=300;
//フォント
void *font = GLUT_BITMAP_HELVETICA_18;
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 f1(double t,double x,double v){
return -(g/l)*sin(x);
}
//ルンゲクッタ法
void caluclate(){
static double t=0; 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;
}
//文字表示関数
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);
render_string(-0.8, 0.8, "OpenGL");
render_string(-0.8, 0.7, "test");
glLoadIdentity();
gluLookAt(0,l/2,3,0,l/2,0,0,1,0);
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, red);
glutSolidSphere(l/10,30,30);
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_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);
glMatrixMode(GL_MODELVIEW);
display();
}
void timer(int value){
glutPostRedisplay();
caluclate();
glutTimerFunc(20 , timer , 0);
}
int main(){
glutCreateWindow("振り子");
glutDisplayFunc(display);
glutReshapeFunc(resize);
glutInitDisplayMode(GLUT_RGBA|GLUT_DOUBLE|GLUT_DEPTH);
glutInitWindowSize(W,H);
init();
glutTimerFunc(0,timer,0);
glutMainLoop();
return 0;
}