2017-05-16 6 views
0

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であることに気付きました。

+3

あなたはこれがGLFWの欠陥だと思いますか?通常のコンソールアプリケーションでこれを試しても、それは機能しますか?また、どのOSを使用していますか?最後に、私はEOFのチェックが一般にこのフォームの継続入力を処理する最良の方法だとは思わない。 –

+0

@NicolBolasなぜこれは通常のコンソールアプリケーションでは機能しませんか? 'cin'の' >> '演算子の動作は、C++標準によって定義されています。私は、EOFについてのあなたの声明にどのように反応するかはわかりません。なぜなら、私は、EOFを行末に使用しないことを明示的に試みているからです。私はEOFを使用して入力の終わりを確認しようとしています。これはかなり標準的な使い方です。 –

+0

入力ストリームのバッファリングがラインからバッファに変更されている可能性がありますか? glfwを設定した後、 'stdin'で明示的な' setvbuf'を試してください。 – Cameron

答えて

0

GLFW issue trackerの人がこの動作の説明を提供しています。—が表示されます。—は実際にGLFWに起因していません。

どういうわけか、私のsttyの設定が骨抜きになっています(これはどういうことが起こったのかまだ分かりません)。解決方法は、アプリケーションを実行する前に

stty sane 

を実行する前に実行する必要があります。 sttyの現在の設定が、この場合

stty -a 

を使用してチェックすることができることに注意してください、問題がicrnl設定がオフになったことをされているように見えます。通常、キーボードから改行を改行に変換します。

関連する問題