GLUTを使用してOpenGLのウィンドウ内でマウスをトラッピングしますか?


8

GLUTが制限されており、次の問題はおそらくOpenGL / GLUTで解決できないことを私は完全に理解していますが、それができるかどうか正確にわからないので、私は尋ねるほうがよいでしょう。多分私は何か間違ったことをしている、または何か重要なことを忘れています。またはおそらくそうではなく、GLUTはこれより良くなりません。

私の問題は、ウィンドウ内にマウスを閉じ込められないことです。まあ、実際には、私はできる、以下のコードはそれだけを行います。マウスをウィンドウ内に閉じ込め、マウスを自由に使用して世界を回転させることができます。問題?マウスの動きが速すぎると、窓の刑務所から抜け出すことができます。

OpenGL / GLUTでこれを回避する方法はありますか、または唯一のオプションは別のライブラリか、Windows APIを直接呼び出すことですか?十分な言葉、これが私の現在のコードです:

void processPassiveMouseMotion(int x, int y) {
    static int centerX = glutGet(GLUT_WINDOW_WIDTH) / 2;
    static int centerY = glutGet(GLUT_WINDOW_HEIGHT) / 2;

    CameraAngle.x = -1.0f * (y - centerY);
    CameraAngle.y = -1.0f * (x - centerX);

    if(CameraAngle.x != 0.0f || CameraAngle.y != 0.0f) {
        SceneCamera.Rotate(CameraAngle);
        glutPostRedisplay();

        glutWarpPointer(centerX, centerY);
    }
}

glutPassiveMotionFunc(processPassiveMouseMotion);

回答:


7

私の知る限り、これはWindows-API固有です。この機能はすべてのプラットフォームに存在するわけではありません。私のコード掘り下げたい場合は、機能するWindows実装を見つけることができます(LockMouseCursorはOSモジュールへのエントリポイントであり、ClipCursorはトラッピングを実行する実際のWindows関数ですが、その関数を取り巻くいくつかの優れた点があります。解読するには難しすぎます。)

また、純粋なXでLinuxを実装しています(これもLockMouseCursorから始めます)が、そのための使用可能なOSX APIを見つけたことはありません。あなたが1つを必要とするか、1つを考え出すことになった場合は、問題に関する私のStackoverflowの質問を確認してください:)


参考までに、この投稿を覚えておきます。私はこれを達成するための唯一の良い方法だと思っていたので、あなたはWindows APIを扱っていますが、私はその道を進みたくありませんでした。以前と同じようにやっているので、方法がわからないわけではありませんが、私がやりたいことをするのであれば、問題はなく、優先事項でもありません。
rfgamaral

2

GLUTスペックをすばやく検索すると、GLUTにはマウスキャプチャ機能がないようです。あなたができる最善のこと(あなたがしているように見える)は、カーソルを中央にそらせ、ユーザーが十分に速くない(またはタブレットを使用していない)ことを期待することです=)

または、GLUTは「実際の」ソフトウェアではなくテスト用に設計されているため、SDLまたはSFMLに切り替えることもできます。


一般的にはあなたのコメントに同意しますが、SDLには大きな問題があるため、SDLに対して強くお勧めしたいと思います。SFMLは素晴らしいです、それを使ってください!
ZorbaTHut

どちらにも味方があり、私はSDLが好きなので.. =)
Jari Komppa

1
これを間違った方法で取得しないでください。ただし、これは切り替えるように指示している2回目です。私は誰かの答えに感謝しますが、GLUT固有の質問を投稿するように主張した場合、おそらくこれには十分な理由があり、切り替えることができませんか?GLUTがどのように機能するかはすでに理解していますが、我慢する必要があります。それは私の選択ではありません。耳障りに聞こえたら申し訳ありませんが、このように主張すると嫌いになります。
rfgamaral

最後の段落を無視しているので、私はあなたの回答に投票します。:)
rfgamaral

2
Nazgulled、申し訳ありませんが、繰り返しているように見えても、私が答えている質問は追跡しません=)。さらに、人々は検索を通じてこの質問を見つけることになるでしょう、そして私はあなただけでなくそれらにも答えたいです。
Jari Komppa、2011年

2

freeglutの新しいバージョンを試してください。私のv2.6は、マウスによるエスケープの可能性なしにglutWarpPointerでカーソルをトラップします。


1

私の場合、変更します

glutWarpPointer(centerX, centerY);

のようなものに

if (x != centerX || y != centerY) glutWarpPointer(centerX, centerY);

問題を完全に解決しました。

この問題は、glutWarpPointerが(centerX、centerY)への別のパッシブモーションイベントをトリガーしてループが発生したり、イベントキューがフラッディングしたりすることが原因で発生します。これを回避するには、マウスが(centerX、centerY)にあるかどうかを確認します。そうである場合は、ゆがまないでください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.