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

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

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

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

C++

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

Q&A

解決済

1回答

1335閲覧

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

klyn

総合スコア3

OpenGL

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

C++

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

0グッド

0クリップ

投稿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}

試したこと

変数名を変更した。

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

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

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

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

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

guest

回答1

0

ベストアンサー

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

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


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

投稿2022/05/25 08:45

編集2022/05/25 08:50
fana

総合スコア12151

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

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

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問