openglの文字表示について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
tim
記事: 5
登録日時: 12年前

openglの文字表示について

#1

投稿記事 by tim » 12年前

この前 お世話になりましたtimです。 またまた初歩的な事で質問があります。 現在opengl&glutで動画を再生してる所に文字を表示させるプログラムを作成中なのですが何故か文字が振り子の動き(glRotatedで動かしている)に連動して動いてしまいます。  僕が参考にした資料ではglRotatedが作用するのはglRotatedに下にある関数のみと書いてあるのですが、、 
文字表示関数を上に書いても物体の動きに引きずられて動いてしまいます。
開発環境は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;
}

アバター
usao
記事: 1889
登録日時: 12年前
連絡を取る:

Re: openglの文字表示について

#2

投稿記事 by usao » 12年前

glLoadIdentity()とかglRotated()とかglTranslated()とかの影響は,それらをコールした関数を抜けてもそのまま残っています.
(これらの関数は OpenGL側が管理している(?)変換マトリクスを変化させるもので,その変換マトリクスの状態が保持されているから)
そのコードで言えば,display()内のglRotated()とかの影響は,次回のdisplay()呼び出し時も生きているということです.

例えば64行目のglLoadIdentity()を,61行目のrender_string()の直前に持って来れば
(文字の表示位置が所望の場所になるかどうかは別として)とりあえず文字が動くことはなくなるのではないでしょうか.

tim
記事: 5
登録日時: 12年前

Re: openglの文字表示について

#3

投稿記事 by tim » 12年前

usao さんが書きました:glLoadIdentity()とかglRotated()とかglTranslated()とかの影響は,それらをコールした関数を抜けてもそのまま残っています.
(これらの関数は OpenGL側が管理している(?)変換マトリクスを変化させるもので,その変換マトリクスの状態が保持されているから)
そのコードで言えば,display()内のglRotated()とかの影響は,次回のdisplay()呼び出し時も生きているということです.
そういう事だったんですね。 おかげさまでどこが問題なのか理解できました。

コード:

void display(){

	
	glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
	glLoadIdentity();
	gluLookAt(0,l/2,3,0,l/2,0,0,1,0);
	glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, red);
	
	render_string(-0.8, 0.8, "OpenGL");
	render_string(-0.8, 0.7, "test");

	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();
}
とコードを書き直したら、動かない文字が表示できました。 ありがとうございました!

閉鎖

“C言語何でも質問掲示板” へ戻る