Bagaimana cara mengubah gerakan 2D (dari mouse) ke perpindahan di sepanjang sumbu 3d?

8

Saya membuat editor adegan 3D kecil (yang hanya memungkinkan untuk mengubah posisi objek).

Setiap objek menggambar dengan sumbu X / Y / Z 3d:

masukkan deskripsi gambar di sini

Cara kerjanya: pengguna memilih sumbu (X, Y atau Z) dengan mengklik kiri padanya, lalu, sambil menahan klik kiri, ia menggerakkan mouse (untuk memindahkan objek ke arah sumbu). memilih sudah ok, tetapi saya ingin tahu how muchobjek harus diterjemahkan untuk sumbu yang dipilih, tergantung pergerakan mouse 2D.

Sebagai contoh, pada gambar ini, memilih sumbu X dan menggerakkan mouse kiri-kanan harus memberikan perpindahan yang lebih besar daripada menggerakkannya ke atas (hampir nol untuk yang ini)

Itu harus sangat sederhana tetapi saya tidak bisa mengetahuinya.

Input harus: perpindahan mouse sejak klik kiri pertama (vektor 2D), vektor sumbu yang dipilih (vektor 3d), modelview / matriks proyeksi.

Output: jumlah (float atau double)

tigrou
sumber
Anda dapat membandingkan arah gerakan pengguna relatif mouse ke objek dengan membandingkan orientasi objek vs orientasi kamera.
MichaelHouse

Jawaban:

5

Bagaimana Anda ingin ini berperilaku? Ada berbagai cara untuk melakukan ini.

Pilihan sederhana adalah dengan hanya memindahkan objek dengan sejumlah unit ruang dunia tetap untuk setiap unit ruang layar (pixel, katakanlah) bahwa mouse bergerak.

Pilihan lain adalah mengambil vektor gerakan mouse dan memproyeksikannya ke sumbu gerakan melalui matriks proyeksi / kamera normal. Proyeksikan vektor gerakan mouse melalui viewport terbalik, proyeksi, dan matriks kamera (berikan Z awal jarak pesawat pandangan dekat, Anda harus berakhir dengan offset pada bidang dekat). Ini memberi Anda vektor gerakan mouse di ruang dunia. Proyeksikan vektor itu ke sumbu yang diinginkan. Ini memberi Anda gerakan di ruang dunia. Objek akan pindah ke tempat pengguna menunjuk, terlepas dari orientasi objek itu. Jika sumbu sebagian besar vertikal, diperlukan gerakan vertikal untuk memindahkannya.

Anda juga dapat mengambil titik awal dan akhir mouse dalam ruang layar, memproyeksikan keduanya, dan dari situ menghitung vektor pergerakan ruang dunia. Saya tidak, tetapi Anda mungkin menemukan itu lebih mudah.

Pilihan lain adalah mengambil kekuatan gerakan mouse, sehingga gerakan yang lebih cepat menyebabkan offset yang lebih besar.

Menggunakan varian dari opsi pertama, Anda juga dapat mengambil pointer sehingga pengguna dapat terus menggerakkan mouse-nya (mengambilnya naik dan turun kembali). Itu sangat populer untuk kontrol rotasi dan skala.

Sean Middleditch
sumber
Teknik menarik. Bagaimanapun, akan lebih baik untuk mengetahui apakah teknik RobCurr juga valid (menurut saya tetapi tidak ada down atau upvotes ...)
tigrou
Ketika saya membacanya, dia mengatakan hal yang sama dengan satu opsi yang saya daftarkan. Hitung titik akhir yang diproyeksikan dan bentuk vektor di ruang dunia, proyeksikan itu ke sumbu yang diinginkan. Dia baru saja membuat daftar beberapa matematika yang membingungkan untuk proyeksi vektor.
Sean Middleditch
0

Saya mungkin akan memproyeksikan titik akhir sumbu yang dipilih ke dalam ruang 2d, kurangi mereka untuk menghasilkan vektor 2d. Kemudian ambil produk titik dari vektor dinormalisasi dari gerakan mouse 2d dengan vektor pertama dinormalisasi untuk menentukan bagian dari gerakan yang harus diterapkan.

Jadi pada dasarnya, hitung 2 vektor:

Va = perbedaan normal dari titik akhir sumbu yang diproyeksikan

Vb = vektor dinormalisasi yang dibuat dari gerakan mouse delta x dan y

Va.Vb = | Va || Vb | cos @

Va.Vb / (| Va | Vb |) = cos @ - yang merupakan komponen gerakan mouse yang harus diterapkan di sepanjang sumbu.

Hanya pilihan lain.

RobCurr
sumber