Judul cukup banyak mengatakan itu semua. Saya sedang mengerjakan proyek sederhana 'mari kita gunakan untuk lwjgl' yang melibatkan manipulasi kubus rubik, dan saya tidak tahu bagaimana cara menentukan sisi / kotak mana yang pengguna tunjuk.
9
Jawaban:
Anda akan ingin menggunakan pengambilan 3D. Berikut beberapa kode yang saya gunakan di game saya.
Pertama saya melemparkan sinar dari kamera saya. Saya menggunakan mouse, tetapi jika Anda hanya menggunakan tempat yang dilihat pengguna, Anda bisa menggunakan bagian tengah jendela. Ini adalah kode dari kelas kamera saya:
Lalu saya ikuti ray sampai bertemu dengan objek, Anda bisa melakukan ini dengan kotak pembatas atau yang serupa, karena ini khusus untuk gim Anda, saya akan membiarkan Anda mengatasinya. Umumnya ini dilakukan dengan mengikuti sinar keluar (menambahkan arah sinar ke titik mulai berulang-ulang 'sampai Anda menabrak sesuatu).
Selanjutnya Anda ingin melihat wajah mana yang dipetik, Anda bisa melakukannya dengan mengulangi segitiga di kubus Anda untuk melihat apakah sinar memotongnya. Fungsi berikut melakukan itu dan mengembalikan jarak ke wajah yang diambil, maka saya hanya menggunakan wajah berpotongan yang paling dekat dengan kamera (jadi Anda tidak memilih wajah belakang).
Segitiga dengan jarak terpendek adalah segitiga yang dipetik. Juga, plug tak tahu malu untuk gim saya, Anda harus memeriksanya, mengikutinya, dan memberikan suara di polling yang kadang-kadang saya keluarkan. Terima kasih! http://byte56.com
sumber
Teknik yang Anda cari disebut "picking" atau "3D picking." Ada beberapa cara untuk melakukannya; salah satu yang lebih umum adalah mengubah titik 2D pada layar menjadi ruang mata dengan menggunakan kebalikan dari transformasi proyeksi. Ini akan memungkinkan Anda untuk menghasilkan sinar dalam ruang tampilan, yang dapat Anda gunakan untuk menguji tabrakan dengan representasi fisik dari berbagai bit geometri pemandangan Anda untuk menentukan objek mana yang terkena 'pengguna'.
Anda juga dapat menggunakan "picking buffer" (atau "buffer pemilihan") yang didukung oleh GL. Ini pada dasarnya melibatkan penulisan beberapa pengidentifikasi objek unik ke dalam buffer untuk setiap piksel dan kemudian cukup menguji buffer itu.
FAQ OpenGL memiliki diskusi singkat tentang keduanya (ini lebih berfokus pada buffer pemilihan karena itu sepenuhnya fitur GL; picking ray adalah agnostik API kecuali mungkin untuk mengekstraksi matriks aktif dari pipa). Berikut adalah contoh yang lebih spesifik dari teknik memetik sinar (untuk iOS, tetapi harus menerjemahkan dengan cukup mudah). Situs ini memiliki beberapa kode sumber ke beberapa contoh Buku Merah OpenGL yang di-porting ke LWJGL, yang mencakup demo pengambilan.
Lihat juga pertanyaan ini di SO.
sumber