Saya sangat mengerti bahwa GLUT terbatas dan masalah berikut mungkin tidak dapat diselesaikan dengan OpenGL / GLUT, tetapi karena saya tidak tahu persis apakah itu bisa atau tidak, saya lebih baik bertanya. Mungkin saya melakukan sesuatu yang salah atau melupakan sesuatu yang penting. Atau mungkin tidak dan GLUT tidak lebih baik dari ini.
Masalah saya adalah saya tidak bisa menjebak mouse di dalam jendela. Sebenarnya saya bisa, kode di bawah tidak hanya itu. Saya menjebak mouse di dalam jendela dan saya dapat menggunakan mouse secara bebas untuk memutar dunia. Masalah? Jika saya menggerakkan mouse terlalu cepat saya bisa mendapatkan jalan dari penjara jendela.
Apakah ada cara untuk mengatasi hal ini dengan OpenGL / GLUT atau satu-satunya pilihan adalah pustaka lain atau langsung melakukan panggilan ke API Windows? Cukup kata-kata, ini kode saya saat ini:
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);
Dengan pencarian cepat melalui spesifikasi GLUT, GLUT tampaknya tidak memiliki kemampuan menangkap mouse. Yang terbaik yang dapat Anda lakukan (seperti yang tampaknya Anda lakukan) adalah untuk melengkung kursor ke pusat dan berharap pengguna tidak cukup cepat (atau tidak menggunakan tablet) =)
Atau, Anda dapat beralih ke SDL atau SFML , karena GLUT hanya dirancang untuk pengujian, bukan perangkat lunak "nyata".
sumber
Coba freeglut versi yang lebih baru; V2.6 saya, menjebak kursor dengan glutWarpPointer tanpa ada kemungkinan untuk melarikan diri dengan mouse.
sumber
Dalam kasus saya, modifikasi
untuk sesuatu seperti
memecahkan masalah dengan sempurna.
Masalahnya disebabkan oleh glutWarpPointer memicu peristiwa gerakan pasif lain ke (centerX, centerY), yang menghasilkan loop dan / atau membanjiri antrian acara. Untuk menghindarinya, cukup periksa apakah mouse berada di (centerX, centerY), jika demikian, jangan melengkung.
sumber