2010-03-21 17 views
6

Làm cách nào để sử dụng gl.gluUnproject trong ứng dụng Android OpenGL ES 1.1 của tôi để xác định nội dung được chọn khi người dùng chạm vào màn hình?Làm cách nào để xác định nội dung được chạm vào trong không gian 3D từ màn hình?

Sự hiểu biết của tôi là sự kiện chạm kết quả trong một dòng và tôi phải tìm "thứ" đầu tiên mà nó giao nhau.

Có hướng dẫn nào về cách thực hiện việc này không?

Trả lời

1

Một ý nghĩ tôi có là lưu vào bộ nhớ cache kết quả gọi gluProject. Điều này chỉ có thể thực tế khi bạn đang xử lý máy ảnh cố định. Vào cuối bất kỳ thay đổi nào trong phối cảnh máy ảnh, tôi có thể tạo lại bộ nhớ cache này của "touchables".

Điều này cũng có lợi ích bổ sung là đảm bảo rằng tôi chỉ kiểm tra đầu vào dựa vào những thứ sẽ phản hồi việc bị xúc động.

Tôi đánh giá cao mọi suy nghĩ về cách tiếp cận này!

1

Nó hoàn toàn phụ thuộc vào những gì bạn đang vẽ. Có thể bạn không nên sử dụng phương pháp chọn vì

a) Có vẻ như nó sẽ chậm, đặc biệt là trên Android. b) Bạn có thể muốn có một 'khu vực cảm ứng' lớn hơn cho các vật thể nhỏ, do đó bạn không cần phải chạm chính xác vị trí của chúng. c) Nó không thực sự trả lời đúng câu hỏi - nó cung cấp cho bạn kết quả "Mục đồ họa hàng đầu nhất đã được hiển thị chính xác ở nơi tôi chạm vào là gì?" trong khi bạn muốn biết "Người dùng đã chạm vào hoặc chạm vào thực thể trò chơi nào?"

Như tôi đã nói, nó hoàn toàn phụ thuộc vào trò chơi của bạn. Nếu nó là một trò chơi 2D hoặc gần 2D thì nó đơn giản và bạn chỉ cần đưa các tọa độ cảm ứng vào mô hình trò chơi của bạn. Đối với các trò chơi 3D, tôi sẽ đề xuất thuật toán đơn giản này mà tôi vừa mới đưa ra tại chỗ:

  1. Tạo danh sách tất cả các đối tượng trò chơi có thể chạm được.
  2. Chuyển tọa độ trung tâm thành tọa độ màn hình 3D. (Các tọa độ màn hình 2D được mô tả ở đây: http://www.flipcode.com/archives/Plotting_A_3D_Point_On_A_2D_Screen.shtml)
  3. Tìm khoảng cách 2D cho từng đối tượng, loại bỏ các đối tượng có khoảng cách lớn hơn ngưỡng tiếp xúc của bạn.
  4. Tìm đối tượng gần nhất theo một số chỉ số khoảng cách. Bạn sẽ phải thử nghiệm tại thời điểm này và một lần nữa, nó phụ thuộc vào bản chất của trò chơi.

Để có kết quả chính xác, điều giao điểm đường có thể được sử dụng. Có những thuật toán cho điều đó (tìm kiếm cho 'đường thẳng giao cắt đường ray').

+0

Do đó, bạn giả sử rằng hình dạng của tất cả các đối tượng giống nhau và khoảng cách của chúng trong 3D tới máy ảnh là như nhau. Tôi không nghĩ đây là những giả định hợp lệ trong hầu hết các trường hợp. – mnemosyn

4

Nếu bạn đang thực hiện lựa chọn 2D đến 3D, bạn cần phải khéo léo với ma trận và vectơ một chút. GlUnproject không tồn tại cho OpenGL ES 1.1, do đó bạn phải tự mình làm toán.

Giao lộ đối tượng Ray là một cách để thực hiện. Timmmms câu trả lời đã bao gồm một số của nó, nhưng có nhiều hơn nữa. Ý tưởng là tạo ra tia tới 3D ngoài tọa độ 2D. Đảo ngược ma trận xem và ma trận chiếu là cần thiết cho điều đó. Một khi bạn có tia, bạn có thể sử dụng phép kiểm tra giao điểm của sự lựa chọn của bạn và tất nhiên bạn cần chọn đối tượng gần nhất như tại điểm của Timmmm 4. Các hình cầu và hộp giới hạn dễ dàng thực hiện và internet có đầy đủ các hướng dẫn kiểm tra giao lộ cho chúng.

This picking tutorial dành cho DirectX, nhưng bạn có thể có ý tưởng. Ray-xây dựng một phần là quan trọng nhất.

Chỉnh sửa Android triển khai phiên bản gluUnproject riêng của nó. Nó có thể được sử dụng để tạo ra tia, bằng cách gọi nó cho máy bay gần và xa (0 và 1) và trừ các kết quả gần mặt phẳng từ kết quả mặt phẳng xa để có được hướng tia. Nguồn gốc Ray là vị trí xem. Thêm here.

+0

Tôi đã được ấn tượng rằng nó đã hỗ trợ gluUnProject(): http://developer.android.com/reference/android/opengl/GLU.html –

+1

Oh. Quả thực Android dường như đã thực hiện phiên bản riêng của nó rồi. Nó không phải là một phần của OpenGL ES 1.1 anyway. Bạn có thể sử dụng chức năng đó để tạo ra tia bằng cách gọi nó hai lần: http://www.opengl.org/resources/faq/technical/selection.htm – Virne

+0

Bất kỳ gợi ý nào về cách tôi tính toán những gì mà tia giao nhau? –

2

Tôi nghĩ rằng đối với hầu hết các ứng dụng bạn nên đi cho đúng cách tiếp cận 3D: Ray đúc.

Chọn vị trí trong tọa độ màn hình 2D do người dùng chọn và chiếu chúng vào không gian thế giới của bạn. Điều này cho phép một tia 3D bắt nguồn từ camera và chỉ vào cảnh. Bây giờ bạn cần thực hiện thử nghiệm va chạm trong 3D. Trong hầu hết các trường hợp, điều này có thể được thực hiện bằng cách giảm các đối tượng thành một tập hợp các hình học đơn giản như ellipsoids, hình cầu và hộp để tăng tốc.

Với độ chính xác của thiết bị cầm tay, điều đó phải đủ chính xác. Lưu ý rằng tùy thuộc vào hình thức của đối tượng, bạn có thể cần phải sử dụng nhiều hơn một nguyên thủy cơ bản. Ngoài ra, nó là vô nghĩa để luôn luôn sử dụng cùng một nguyên thủy: Một quả cầu bounding là một xấp xỉ rất xấu cho một thanh rất dài, rõ ràng.

+0

Bạn có biết bất kỳ hướng dẫn nào giải thích thực hiện các thử nghiệm này không? –

+1

Không thực sự, thật không may. Có bit và miếng ở đây và ở đó, nhưng tôi không thể tìm thấy một thực hiện ngắn gọn nào được nêu ra. Bạn cần nó bao lâu? Có lẽ tôi có thể viết một cái gì đó lên .... – mnemosyn

+0

Tôi sẽ không bao giờ nói không với một hướng dẫn mới được thực hiện! Nếu bạn kết thúc làm một, tôi rất muốn nhìn thấy nó thực hiện trong bối cảnh của Java + Android! –

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