Bẫy chuột bên trong cửa sổ trong OpenGL với GLUT?


8

Tôi hoàn toàn hiểu rằng GLUT bị hạn chế và vấn đề sau có lẽ không thể giải quyết được với OpenGL / GLUT, nhưng vì tôi không biết chính xác liệu nó có thể hay không, tốt hơn tôi chỉ nên hỏi. Có lẽ tôi đang làm gì đó sai hoặc quên điều gì đó quan trọng. Hoặc có lẽ là không và GLUT không trở nên tốt hơn thế này.

Vấn đề của tôi là tôi không thể nhốt con chuột bên trong cửa sổ. Vâng, thực sự, tôi có thể, mã dưới đây làm điều đó. Tôi nhốt con chuột bên trong cửa sổ và tôi có thể sử dụng chuột một cách tự do để xoay thế giới. Vấn đề? Nếu tôi di chuyển chuột quá nhanh, tôi có thể thoát khỏi cửa sổ nhà tù.

Có cách nào khác với OpenGL / GLUT hoặc tùy chọn duy nhất là một thư viện khác hoặc thực hiện một số cuộc gọi trực tiếp tới API Windows? Đủ từ, đây là mã hiện tại của tôi:

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);

Câu trả lời:


7

Theo hiểu biết của tôi, đây là đặc thù của Windows-API - chức năng này thậm chí không tồn tại trên tất cả các nền tảng. Nếu bạn muốn tìm hiểu mã của tôi, bạn có thể tìm thấy một triển khai Windows đang hoạt động (LockMouseCoder là điểm truy cập vào mô-đun hệ điều hành, ClipC bổng là chức năng thực tế của Windows thực hiện bẫy, nhưng có một số lỗi xung quanh chức năng đó - không nên quá khó để giải mã.)

Tôi cũng có một triển khai Linux trong X thuần túy (một lần nữa, bắt đầu với LockMouseCoder) nhưng tôi chưa bao giờ tìm thấy API OSX có thể sử dụng được cho nó. Nếu bạn cuối cùng cần một hoặc đến với một, hãy kiểm tra câu hỏi Stackoverflow của tôi về vấn đề này :)


Cảm ơn bạn, tôi sẽ ghi nhớ bài viết này như một tài liệu tham khảo. Bạn đang xử lý các API Windows vì tôi nghi ngờ là cách tốt duy nhất để đạt được điều này nhưng tôi không muốn đi theo con đường đó. Không phải là tôi không biết làm thế nào, bởi vì tôi đã làm như tôi đã làm trước đây, nhưng với những gì tôi buộc phải làm, nó không đáng để gặp rắc rối và đó không phải là ưu tiên.
rfgamaral

2

Với tìm kiếm nhanh thông qua thông số GLUT , GLUT dường như không có khả năng bắt chuột. Điều tốt nhất bạn có thể làm (giống như bạn đang làm) là đưa con trỏ vào trung tâm và hy vọng người dùng không đủ nhanh (hoặc không sử dụng máy tính bảng) =)

Hoặc, bạn có thể chuyển sang SDL hoặc SFML , vì GLUT chỉ được thiết kế để thử nghiệm, không phải phần mềm "thực".


Mặc dù tôi đồng ý với nhận xét của bạn nói chung, tôi muốn thúc giục mạnh mẽ chống lại SDL bởi vì người đàn ông SDL có vấn đề lớn. SFML là tuyệt vời, sử dụng đó!
ZorbaTHut

Cả hai đều có mặt của họ, và tôi thích SDL, vì vậy .. =)
Jari Komppa

1
Xin đừng hiểu sai ý này, nhưng đây là lần thứ hai bạn bảo tôi chuyển đổi. Mặc dù tôi đánh giá cao câu trả lời của bất kỳ ai, nếu tôi khăng khăng đăng các câu hỏi cụ thể của GLUT, có lẽ tôi có lý do chính đáng cho việc này và không thể chuyển đổi? Tôi đã nhận ra GLUT hút như thế nào, nhưng tôi phải chịu đựng nó, đó không phải là lựa chọn của tôi. Xin lỗi nếu tôi có vẻ khó nghe, nhưng tôi ghét khi mọi người khăng khăng như thế này, tôi đã "nghe" bạn lần đầu tiên.
rfgamaral

Tôi đang bỏ phiếu cho câu trả lời của bạn vì tôi bỏ qua đoạn cuối đó. :)
rfgamaral

2
Rất tiếc, xin lỗi nếu tôi dường như đang lặp lại mọi thứ, tôi thực sự không theo dõi câu hỏi mà tôi đang trả lời =). Ngoài ra, mọi người sẽ tìm thấy câu hỏi này thông qua các tìm kiếm và tôi cũng muốn trả lời cho họ, không chỉ cho bạn.
Jari Komppa

2

Hãy thử một phiên bản mới hơn của freeglut; Bản v2.6 của tôi, bẫy con trỏ bằng glutWarpPulum mà không có khả năng thoát bằng chuột.


1

Trong trường hợp của tôi, sửa đổi

glutWarpPointer(centerX, centerY);

đến một cái gì đó như

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

giải quyết hoàn hảo vấn đề.

Vấn đề được gây ra bởi glutWarpPulum kích hoạt một sự kiện chuyển động thụ động khác đến (centreX, centre), dẫn đến một vòng lặp và / hoặc làm ngập hàng đợi sự kiện. Để tránh điều đó, chỉ cần kiểm tra xem chuột có ở (centre, centre) không, nếu vậy, đừng cong vênh.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.