2011-06-18 64 views
5

Tôi đang cố gắng tạo một ứng dụng trong Qt-openGL. Ở đây, tôi phải biết đối tượng đã nhấp, dựa trên nhấp chuột. Ý tưởng của tôi là lưu trữ các điểm (khu vực của đối tượng trong QWidget), và phù hợp với cú click chuột chống lại những điểm này. Ai có thể nói làm thế nào để làm điều này ?, hoặc có thể bất kỳ cơ thể hiển thị bất kỳ cách nào khác?Qt OpenGL- Cách nhận đối tượng dựa trên click chuột

Trả lời

14

Sự cố này thường được gọi là "chọn". Bản thân OpenGL chỉ vẽ mọi thứ, không có quản lý đối tượng hình học để nói về (OpenGL có các đối tượng, nhưng chúng là, những gì bạn thường gọi là tài nguyên).

Cách thông thường để triển khai OpenGL chọn những ngày này là lấy giá trị độ sâu tại vị trí nhấp chuột (glReadPixels(x, y, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &depth)) và không đưa nó vào không gian thế giới (gluUnProject(...)). Điều này cung cấp cho bạn số (x,y,z) của điểm được nhấp.

Vì bạn thường quản lý hình học của mình trong một số cấu trúc phân đoạn không gian (BSP, Kd, ​​v.v.) bằng cách duyệt qua cấu trúc phân mục đến tọa độ nhấp, bạn có thể truy xuất đối tượng theo cách đó.

Phương pháp khác là chiếu tia theo sau lần nhấp vào cảnh và thực hiện kiểm tra giao cắt khối lượng/giới hạn.

Tôi mạnh mẽ không khuyến khích sử dụng cơ chế lựa chọn OpenGL cũ: Nó chậm và cồng kềnh để sử dụng.

+0

Bây giờ các trình đổ bóng phổ biến, không dễ để đặt một id đối tượng cho từng đối tượng và sử dụng trình đổ bóng phân đoạn để viết cho một mặt phẳng ẩn chưa? Chọn sau đó sẽ trở thành đọc từ mặt phẳng đó tại tọa độ chuột. Không cần unprojection hoặc tìm kiếm hình học. –

+1

@Ben Voigt: Miễn là bạn chỉ quan tâm đến một đối tượng dưới con trỏ chuột - tất nhiên điều này phù hợp với phương pháp không được chiếu - sau đó có. Tuy nhiên, nếu bạn quan tâm đến tất cả các đối tượng dưới con trỏ, thì bạn sẽ phải sử dụng phương pháp chọn tia, hoặc sử dụng một số lột sâu. Tuy nhiên, trong hầu hết các ứng dụng 3D nghiêm trọng, các đối tượng đang quản lý bằng cách sử dụng một số cấu trúc không gian nào đó, và việc kiểm tra này thường dễ dàng hơn. – datenwolf

+0

tôi chọn bằng cách sử dụng gluUnProject & glReadPixels, nhưng kết quả luôn là đối tượng xa nhất thay vì đối tượng gần nhất, bất kỳ lý do gì? – jondinham

Các vấn đề liên quan