Dengan XNA, saya menampilkan persegi panjang sederhana yang diproyeksikan ke lantai. Proyektor dapat ditempatkan pada posisi sewenang-wenang. Jelas, persegi panjang yang diproyeksikan akan terdistorsi sesuai dengan posisi dan sudut proyektor. A Kinect memindai lantai mencari empat sudut. Sekarang tujuan saya adalah untuk mengubah persegi panjang asli sehingga proyeksi tidak lagi terdistorsi oleh dasarnya pra-melengkung persegi panjang.
Pendekatan pertama saya adalah melakukan semuanya dalam 2D: Pertama menghitung transformasi perspektif (menggunakan OpenCV warpPerspective()
) dari titik yang dipindai ke titik persegi panjang internal dan menerapkan kebalikannya ke persegi panjang. Ini tampaknya berhasil tetapi terlalu lambat karena tidak dapat ditampilkan pada GPU.
Pendekatan kedua adalah melakukan segalanya dalam 3D untuk menggunakan fitur rendering XNA. Pertama, saya akan menampilkan pesawat, memindai sudut-sudutnya dengan Kinect dan memetakan Poin 3D yang diterima ke pesawat asli. Secara teoritis, saya bisa menerapkan kebalikan dari transformasi perspektif ke pesawat, seperti yang saya lakukan dalam pendekatan 2D. Namun, karena XNA bekerja dengan tampilan dan matriks proyeksi, saya tidak bisa begitu saja memanggil fungsi seperti warpPerspective()
dan mendapatkan hasil yang diinginkan. Saya perlu menghitung parameter baru untuk tampilan dan proyeksi matriks kamera.
Pertanyaan: Apakah mungkin untuk menghitung parameter ini dan membaginya menjadi dua matriks (tampilan dan proyeksi)? Jika tidak, apakah ada pendekatan lain yang bisa saya gunakan?
warpPespective
? Saya tidak terbiasa dengan OpenCV, tetapi membaca dokumen sepertinya fungsi ini hanya menerapkan perspektif pada gambar. Atau saya bingung? Bagaimanapun, mungkin menambahkan lebih banyak detail pada implementasi pertama Anda akan membantu.Jawaban:
Karena vektor aljabar ramah GPU, normalisasi dan produk titik dapat digunakan untuk menemukan empat sudut pesawat asli sebagai berikut:
Mengingat titik proyektor (P), titik proyeksi (B), satu titik sembarang pada bidang yang berisi persegi panjang terdistorsi (Q), dan vektor normal ke bidang itu (n), titik persimpangan (A) dari baris dari P ke B, dan pesawat diberikan oleh
Sumber http://geomalgorithms.com/a05-_intersect-1.html bagian Line-Plane Intersection
sumber