Saya memiliki proyeksi perspektif. Ketika pengguna mengklik pada layar, saya ingin menghitung sinar antara pesawat dekat dan jauh yang diproyeksikan dari titik mouse, sehingga saya dapat melakukan beberapa kode persimpangan sinar dengan dunia saya.
Saya menggunakan matriks dan vektor dan kelas ray saya sendiri dan mereka semua bekerja seperti yang diharapkan.
Namun, ketika saya mencoba dan mengkonversi sinar ke koordinat dunia saya jauh selalu berakhir sebagai 0,0,0 dan sinar saya pergi dari klik mouse ke pusat ruang objek, daripada melewatinya. (Koordinat x dan y dari dekat dan jauh identik, mereka hanya berbeda dalam koordinat z di mana mereka negatif satu sama lain)
GLint vp[4];
glGetIntegerv(GL_VIEWPORT,vp);
matrix_t mv, p;
glGetFloatv(GL_MODELVIEW_MATRIX,mv.f);
glGetFloatv(GL_PROJECTION_MATRIX,p.f);
const matrix_t inv = (mv*p).inverse();
const float
unit_x = (2.0f*((float)(x-vp[0])/(vp[2]-vp[0])))-1.0f,
unit_y = 1.0f-(2.0f*((float)(y-vp[1])/(vp[3]-vp[1])));
const vec_t near(vec_t(unit_x,unit_y,-1)*inv);
const vec_t far(vec_t(unit_x,unit_y,1)*inv);
ray = ray_t(near,far-near);
Apa yang salah? (Bagaimana Anda tidak memproyeksikan titik mouse?)
Jawaban:
Saya baru-baru ini harus menyelesaikan ini sendiri untuk aplikasi WebGL. Saya telah melampirkan kode sumber lengkap, tetapi memetikannya tidak berfungsi langsung untuk Anda di sini adalah beberapa kiat debug:
Juga, untuk membalas beberapa komentar di atas, Anda hampir tidak pernah ingin menggunakan API pilihan OpenGL. Itu membantu Anda memilih item yang ada, seperti jika Anda membuat menu, namun gagal untuk melakukan sebagian besar skenario dunia nyata seperti mengedit model 3D. Di mana Anda perlu menambahkan geometri sebagai hasil dari klik.
Ini implementasi saya. Tidak ada keajaiban yang terjadi di sini. Hanya JavaScript dan pustaka Penutupan Google.
gluUnProject
Pemakaian
sumber
Saya tidak melihat masalah dengan kode Anda. Jadi saya hanya punya beberapa saran:
Dan berusaha mengubah multiplacation matriks menjadi
(p*mv).inverse();
. Hanya karena glMatrices adalah nutaraly dalam memori. (ini salah satu besar mungkin, maaf)Raycasting lain Memproyeksikan
bukan hanya cara bagaimana mendapatkan sinar dari piksel. Ini adalah kode saya untuk raycaster:
Anda bisa mendapatkan cameraRight, Up dan Direction dari view matrix (yang sebagian besar berguna dalam shader) Lihat matrix di opengl
Color Picking
Color picking adalah teknik di mana Anda membuat setiap objek yang dapat diklik dengan warna lain (solid) dan kemudian membaca nilai warna pada titik yang diklik. Ini berfungsi sebagai GL_SELECTION di opengl. Tetapi sekarang sudah ditinggalkan. Tetapi pemilihan warna mudah dikodekan sebagai 1 render pass tambahan.
Gunakan penyangga bingkai dan render ke tekstur dengan resolusi yang sama dengan resolusi layar, gunakan shader sederhana yang hanya mengembalikan warna dalam fragmen shader. Setelah "color pass", baca nilai dari pengalamatan tekstur dengan clickedPoint x dan y. Temukan objek dengan warna yang Anda baca. Mudah dan cukup cepat.
sumber