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

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

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

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

C++

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

解決済

openGLでのキーボード入力が反応しない

klyn
klyn

総合スコア3

OpenGL

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

C++

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

1回答

0グッド

0クリップ

531閲覧

投稿2022/05/25 08:09

編集2022/05/25 08:12

前提

c++ のopenGLを用いて物体をディスプレイ上に表示させ、クリックにより回転を、キーボード入力により視点の移動を行うプログラムです。エラーは出ないのですがキーボード入力が反映されず困っています。ご教授いただければ幸いです。

実現したいこと

wasdの入力により視点の移動を実現したい。

発生している問題・エラーメッセージ

キーボード入力をしても視点が動かず反応がない。

該当のソースコード

C++

1#include <gl/glut.h> 2#include <stdio.h> 3 4int mouse_rightclick_state = 0; 5int mouse_leftclick_state = 0; 6int up = 0, down = 0, right = 0, left = 0; 7 8void display(void) 9{ 10 int angle_left = mouse_leftclick_state * 30; 11 int angle_right = mouse_rightclick_state * 30; 12 13 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 14 15 if (mouse_leftclick_state >= 1) 16 { 17 glPushMatrix(); 18 glRotatef(angle_left, 0.f, 1.f, 0.f); 19 glColor3f(1.f, 0.f, 0.f); 20 glutWireTeapot(2); 21 glPopMatrix(); 22 } 23 if (mouse_rightclick_state >= 1) 24 { 25 glPushMatrix(); 26 glRotatef(-angle_right, 0.f, 1.f, 0.f); 27 glColor3f(0.f, 0.f, 1.f); 28 glutWireTetrahedron(); 29 glPopMatrix(); 30 } 31 32 glFinish(); 33} 34 35void reshape(int w, int h) 36{ 37 double a = 5 + 0.1 * (right - left), b = 5 + 0.1 * (up - down); 38 glViewport(0, 0, w, h); 39 40 glMatrixMode(GL_PROJECTION); 41 glLoadIdentity(); 42 gluPerspective(30.0, double(w) / h, 0.1, 200.0); 43 44 glMatrixMode(GL_MODELVIEW); 45 glLoadIdentity(); 46 gluLookAt(a, 5.0, b, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); 47} 48 49void mouse(int button, int state, int x, int y) { 50 if (button == GLUT_LEFT_BUTTON) { 51 printf("(%d, %d) で左クリックしました\n", x, y); 52 mouse_leftclick_state++; 53 } 54 else if (button == GLUT_RIGHT_BUTTON) { 55 printf("(%d, %d) で右クリックしました\n", x, y); 56 mouse_rightclick_state++; 57 } 58 display(); 59} 60 61void keyboard(unsigned char key, int x, int y) { 62 switch (key) 63 { 64 case 'w': 65 up++; 66 break; 67 case 's': 68 down++; 69 break; 70 case 'a': 71 left++; 72 break; 73 case 'd': 74 right++; 75 break; 76 77 default: 78 break; 79 } 80 display(); 81} 82 83 84void otherInit(void) 85{ 86 glClearColor(1.f, 1.f, 1.f, 1.f); 87 glClearDepth(1.f); 88 glEnable(GL_DEPTH_TEST); 89} 90 91int main(int argc, char* argv[]) 92{ 93 glutInit(&argc, argv); 94 glutInitDisplayMode(GLUT_RGBA | GLUT_DEPTH); 95 glutInitWindowSize(640, 480); 96 glutCreateWindow("Hello!"); 97 98 glutDisplayFunc(display); 99 glutReshapeFunc(reshape); 100 glutMouseFunc(mouse); 101 glutKeyboardFunc(keyboard); 102 103 otherInit(); 104 105 glutMainLoop(); 106 107 return 0; 108}

試したこと

変数名を変更した。

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

回答1

1

ベストアンサー

keyboard 関数では up 等の変数の値をいじってるけど,up 等が使われているのは reshape 関数の中だけみたいだから,reshape が実施されない限りは何も影響を及ぼさないのは当たり前なのでは.

(あと,display を直接呼ぶんじゃなくて, glutPostRedisplay を使うべきでは)


なので,up 等の値に基づき gluLookAt を実施する処理を display 内に持っていけばよいのでは.

投稿2022/05/25 08:45

編集2022/05/25 08:50
fana

総合スコア10630

Bull👍を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

klyn

2022/05/25 08:56

そうすると浅学で申し訳ないのですが reshape関数はどのように実施すればよいでしょうか。
fana

2022/05/25 08:59

> glutReshapeFunc(reshape); ってあなたがコールバック指定しているのだから,「然るべきときに実施される」というだけの話なのでは. reshapeの中身をどうすればいいのか? という話であれば,単に gluLookAt に関連する部分だけを取っ払えばよいのでは. (もちろん,取っ払った部分は然るべき場所に移植する)
fana

2022/05/25 09:07 編集

…とだけ言うと,下手すると glMatrixMode や glLoadIdentity が置いてけぼりにされるかもしれないから,下記のように言い換えておく. --- reshape の役目は ・ViewPort を設定する ・Projection Matrix を設定する だけ,ってことにして, 「 ModelView Matrix 側を弄る処理は全て display の役割!」って話にすれば,分かりやすいんじゃない?
klyn

2022/05/25 09:09

丁寧にありがとうございます。

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

同じタグがついた質問を見る

OpenGL

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

C++

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