OpenGLを酷使すると、さまざまな角度でオブジェクトの1つのスクリーンショットが表示されます。インタラクティブなGUIは必要ありません。私はちょうどコンソールからそれを開始し、stdin
経由で態度情報を入力できるようにする必要があります。この方法で動作させるには、Pythonアプリケーションからpopen
経由で呼び出されるため、この関数が必要です。GLFWアプリケーションでは、std :: cinが奇妙な動作をします
残念ながら、これを達成するためにstd::cin
を使用すると、\n
という文字を入力しても入力を登録できないようです。代わりに、私は\n
をCtrl + Dで続ける必要があります。これにより、期待どおり追加入力を提供し続けることができます。
最初の入力(qw
)でCtrl + Dを押すと、期待通りに終了します(cin.eof()
が来るのでtrue
)。
it appears Python won't allow me to send a Ctrl+D to the OpenGL app without closing the stream entirely(私が欲しいものではない)を除き、その動作は許容されます。私はまたcurses.ascii.EOT
(送信終了文字、0x04)を代わりに(per this forum question)送信しようとしましたが、それはどちらかと思われません。この特定のユースケースは、人々が通常のOpenGLで何をすべきか外にあるかのように思え
glfwSwapBuffers(window);
std::cerr << "Waiting for input ? " << std::flush;
// priming read
std::cin >> qw;
/*
* Main event loop
*/
while (!std::cin.eof()) {
//glfwPollEvents(); // Seems to make no difference
std::cin >> qx;
std::cin >> qy;
std::cin >> qz;
object = glm::normalize(glm::dquat(qw, qx, qy, qz));
std::cerr << "Quaternion: " << object.w << ',' << object.x << ',' << object.y << ',' << object.z << std::endl;
scene.render(&shader_program, object, translation, sensor);
pixels = scene.projected_area(width, height);
projected_area = pixels * box_width * box_width/(double)(width * height);
std::cout << std::setprecision(17) << projected_area << std::endl;
glfwSwapBuffers(window);
// next priming read
std::cin >> qw;
}
glfwTerminate();
:
はここに関連するコードです。誰でも何が起こっているのか説明できますか、GLFWを使用していなかった場合と同じように動作させる方法を教えてください。
更新:glfw opens multiple threadsが原因で発生する可能性があるのでしょうか。
$ ls -l /proc/16051/task
total 0
dr-xr-xr-x 7 mohawkjohn mohawkjohn 0 May 16 19:18 16051
dr-xr-xr-x 7 mohawkjohn mohawkjohn 0 May 16 19:18 16052
dr-xr-xr-x 7 mohawkjohn mohawkjohn 0 May 16 19:18 16053
dr-xr-xr-x 7 mohawkjohn mohawkjohn 0 May 16 19:18 16054
dr-xr-xr-x 7 mohawkjohn mohawkjohn 0 May 16 19:18 16055
アップデート2:私は任意の GLFWメソッドを呼び出す前にも、私は私のプロセスのための5つのスレッドを参照してください私が確認した私は、ファイルを開いて、代わりにifstream
から読んだときに、正常な動作が発生していることOpenGLアプリケーションのコンソールでEnterキーを押したときに、私がLinuxに入っていても、私が得られるフィードバックは改行ではなく^M
であることに気付きました。
あなたはこれがGLFWの欠陥だと思いますか?通常のコンソールアプリケーションでこれを試しても、それは機能しますか?また、どのOSを使用していますか?最後に、私はEOFのチェックが一般にこのフォームの継続入力を処理する最良の方法だとは思わない。 –
@NicolBolasなぜこれは通常のコンソールアプリケーションでは機能しませんか? 'cin'の' >> '演算子の動作は、C++標準によって定義されています。私は、EOFについてのあなたの声明にどのように反応するかはわかりません。なぜなら、私は、EOFを行末に使用しないことを明示的に試みているからです。私はEOFを使用して入力の終わりを確認しようとしています。これはかなり標準的な使い方です。 –
入力ストリームのバッファリングがラインからバッファに変更されている可能性がありますか? glfwを設定した後、 'stdin'で明示的な' setvbuf'を試してください。 – Cameron