質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
GCC

GCCはGNU Compiler Collectionの略です。LinuxのC言語コンパイラのデファクトスタンダードであり、数多くの他言語やプラットフォームサポートもします。

OpenGL

OpenGLは、プラットフォームから独立した、デスクトップやワークステーション、モバイルサービスで使用可能な映像処理用のAPIです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

1668閲覧

openGL gccのアニメーションについて

ssssssa

総合スコア4

GCC

GCCはGNU Compiler Collectionの略です。LinuxのC言語コンパイラのデファクトスタンダードであり、数多くの他言語やプラットフォームサポートもします。

OpenGL

OpenGLは、プラットフォームから独立した、デスクトップやワークステーション、モバイルサービスで使用可能な映像処理用のAPIです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2020/06/23 15:55

編集2020/06/24 03:57

このファイルを実行すると、速度が速すぎます。速度を遅くするにはどうしたらいいでしょうか。

#include "GL/glut.h" #include <math.h> #include <stdlib.h> #define MAX_DROPS 50000 #define GRAVITY -0.0005 #ifdef WIN32 //to correct ASCI deviations in Microsoft VC++ 6.0 #define M_PI (3.1415926535897932384626433832795) double drand48() { return (rand()%10000)/10000.0; } //end of corrections #endif typedef struct { int alive; GLfloat xpos, ypos; GLfloat xdir, ydir; GLfloat mass; } Particle; Particle water[MAX_DROPS]; int NumDrops; void draw_waterfall(void) { int i; glClear(GL_COLOR_BUFFER_BIT); glColor3f(1.0, 1.5, 1.0); glBegin(GL_POINTS); for ( i=0 ; i<NumDrops ; i++ ) if (water[i].alive) { glVertex2f(water[i].xpos, water[i].ypos); } glEnd(); glFlush(); glutSwapBuffers(); } void time_step(void) { int i; for ( i=0 ; i<NumDrops ; i++ ) { if (water[i].alive) { // set up an object to hit if (water[i].ypos + GRAVITY*water[i].mass < -5.75) { // bounce it off of the "floor" water[i].ydir = -water[i].ydir; } else { // let gravity do its thing water[i].ydir += GRAVITY * water[i].mass; } water[i].xpos += water[i].xdir; water[i].ypos += water[i].ydir; if (water[i].ypos < -1.0 || water[i].xpos > 1.0) water[i].alive = 0; } } } void drop_generator(void) { int i,newdrops = drand48()*2; if (NumDrops + newdrops > MAX_DROPS) newdrops = MAX_DROPS - NumDrops; for ( i=NumDrops ; i<NumDrops+newdrops ; i++ ) { water[i].alive = 1; water[i].xpos = -0.8 + 0.01*drand48(); water[i].ypos = 0.8 + 0.01*drand48(); water[i].xdir = 0.0075 + 0.0025*drand48(); water[i].ydir = 0.0; water[i].mass = 0.5 + 0.5*drand48(); } NumDrops += newdrops; } void display(void) { drop_generator(); draw_waterfall(); time_step(); } void keyboard(unsigned char key, int x, int y) { switch (key) { case 27: exit(0); break; } } void reshape (int w, int h) { glViewport(0, 0, (GLsizei) w, (GLsizei) h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); if (w <= h) glOrtho(-1.0, 1.0, -1.0*(GLfloat)h/(GLfloat)w, 1.0*(GLfloat)h/(GLfloat)w, -1.0, 1.0); else glOrtho(-1.0*(GLfloat)w/(GLfloat)h, 1.0*(GLfloat)w/(GLfloat)h, -1.0, 1.0, -1.0, 1.0); glMatrixMode(GL_MODELVIEW); } void idle(void) { glutPostRedisplay(); } int main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB); glutInitWindowSize (700, 700); glutInitWindowPosition(0, 0); glutCreateWindow ("Waterfall"); glClearColor (0.0, 0.0, 0.0, 0.0); glPointSize(5.0); glutDisplayFunc(display); glutReshapeFunc(reshape); glutIdleFunc(idle); glutKeyboardFunc(keyboard); glutMainLoop(); return 1; }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2020/06/23 22:02

このままではコードが見づらいです。質問を編集し、<code>ボタンを押し、出てきた’’’の枠の中にコードを貼り付けてください
ssssssa

2020/06/24 01:56

わかりました。試してみます。
ssssssa

2020/06/24 03:57

コードの編集をしました。よろしくお願いします。
guest

回答2

0

ベストアンサー

他の質問のコードでも同様ですが,

「速い」とか「遅い」とか言う前に,まず,
「あなたのプログラムのデータの更新」と「表示の更新」を切り離して,前者のタイミングを独立管理できるようにすることがまず必要.

「表示の更新」はあなた自身が望まないタイミングでも起こり得るのだから,「表示の更新」処理の中でデータをいじくっていては,いつまでたっても「速さ」をまともに管理できない.

glutDisplayFuncに指定しているコールバック内でデータを更新するということ自体をやめるべき.
言い換えれば,glutDisplayFuncに指定したコールバックは,単に「現在のデータの表示」を行うべき.

で,データの更新にはglutTimerFuncでも使えばどうか.glutidlefuncではなく.

投稿2020/06/24 09:46

編集2020/06/24 09:49
fana

総合スコア11632

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

今のコードではidle()が呼ばれるたびにglutPostRedisplay()を呼んで描画しています。
glutPostRedisplay()の呼び出し間隔を調整しましょう。


秒間60フレームのサンプルコードがありました。

投稿2020/06/24 08:26

編集2020/06/24 08:28
SHOMI

総合スコア4079

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問