Bagaimana saya bisa secara programatik memberi tahu kamera ke mana harus mengarahkan?

8

Saya tidak memiliki kamera tertentu dalam pikiran saat ini, saya hanya ingin tahu bagaimana ini dilakukan, secara pemrograman / matematis.

Saya memiliki ruang 3D, persegi panjang, dengan kamera di satu sudut melihat ke dalam.
Saya memiliki objek bergerak dalam persegi panjang yang mentransmisikan (x, y, z) koordinat posisi saat ini.
Saya ingin mengambil koordinat itu dan menerjemahkannya ke dalam instruksi yang memberitahu kamera untuk menunjuk pada posisi itu.
Bagaimana terjemahan ini biasanya dilakukan?

bot_bot
sumber
Anda mungkin ingin melihat bagaimana pengembang game menangani kamera dalam game mereka. Itu prinsip yang sama dan mereka harus berurusan dengan semua yang ada di bawah matahari, untuk berbicara.
Harabeck
Mungkin perlu dicatat bahwa objek tidak harus mengirimkan koordinatnya dalam ruang 3D literal, tetapi dapat mentransmisikannya dengan berada di FOV kamera. Anda kemudian akan menggunakan pengenalan pola untuk menemukan di mana dalam bingkai objek berada, dan kemudian menggeser kamera untuk memusatkan objek (atau mengidentifikasi vektor gerakan dalam 2D ​​dengan melacak perubahan posisi di beberapa frame dan bergerak ke arah itu) . Sebagai contoh, kamera PTZ saya di teras memindai teras mencari gerakan bukan karena gerakan panning, dan kemudian mengunci dan mengikuti item bergerak sampai gerakan berhenti.
dannysauer
Kasing saya adalah sistem analisis olahraga, setiap pemain mengenakan tanda yang mentransmisikan posisi saat ini, kecepatan, dll di lapangan. Jadi kami sudah memiliki informasi posisi. Saya pasti akan melihat pengenalan pola. Kedengarannya bermanfaat.
bot_bot

Jawaban:

10

Trigonometri!

Kamera saya adalah DLink 5020-L dan memiliki perintah pan / tilt yang dapat diberikan melalui API . Ini juga memiliki posisi yang telah ditentukan untuk ditetapkan dan juga dapat dipicu melalui API

Pra-init

  • Tentukan posisi kamera Anda ke 0 ° Pan dan 0 ° Miringkan dalam referensi Anda => kami akan memanggil posisi ini Position 1

Init

  • Pindahkan kamera Anda ke Position 1
  • Simpan di suatu tempat pan / tilt kamera Anda, baik dalam variabel 0 diinisialisasi atau melalui API Anda

Lihatlah objek

  • Temukan objek Anda dalam dua bidang, bidang X, Y dan Y, Z
  • Anda bisa mendapatkan sudut pan (kiri / kanan) (omg rumus matematika dalam SE IoT!)

$$ \ arctan \ bigg (\ frac {y} {x} \ bigg) $$

  • Anda bisa mendapatkan kemiringan (atas / bawah)

$$ \ arctan \ bigg (\ frac {z} {y} \ bigg) $$

  • Jangan lupa untuk menyimpan / memperbarui nilai pan / tilt baru karena Anda mungkin bekerja dengan gerakan relatif ...

Anda mungkin meniadakan hasil sebelumnya tergantung pada bagaimana kamera Anda ditempatkan

(Saya akan menambahkan beberapa skema ketika saya punya waktu)

Goufalite
sumber
2
Dipukuli oleh @hardillb;) Dan dia memiliki formula yang terlihat lebih baik ...
Goufalite
2
Sayangnya dukungan LaTeX tidak tersedia di situs ini. Anda dapat mengekspornya dari suatu tempat seperti CodeCogs ke dalam gambar sebagai pengganti jika Anda mau. (Saya telah melakukan ini untuk Anda; silakan mengedit sesuai kebutuhan atau menghapusnya jika Anda tidak menginginkannya!)
Aurora0001
Terima kasih atas bantuannya. Inilah yang saya cari.
bot_bot
Saya pikir Anda lupa untuk mempertimbangkan fakta bahwa arctan untuk sudut kemiringan harus sehubungan dengan komponen z di atas sisi miring: meletakkannya di atas komponen y dapat menaikkan / menurunkan kamera Anda tidak cukup karena kamera akan menjadi menunjuk sepanjang sisi miring dari segitiga siku-siku antara komponen-y dan komponen-x, bukan di sepanjang sumbu y. Koreksi saya jika saya salah. :) Jawabannya bagus.
anonim2
@ anonim2 itu juga yang saya pikirkan. Saya tidak berpikir salah satu jawaban yang disajikan sebenarnya benar tetapi saya tidak memiliki bandwidth untuk benar-benar menunjukkan itu sekarang - sepertinya Anda memerlukan dua segitiga dan ketiga koordinat untuk mendapatkan variabel (pan atau tilt). Anda dapat membuktikan ini pada diri Anda sendiri dengan memvisualisasikan dua contoh ekstrem yang berbeda: x, y, z dari 1,1999 akan memberikan panci yang berbeda jauh dan kemiringan yang jauh berbeda dari 1,1,1. Jawaban Goufalite memberikan wajan yang sama untuk keduanya.
dwizum
6

Jawaban yang luar biasa, saya hanya ingin menambahkan beberapa hal lain yang harus Anda pertimbangkan. Seperti hardlib dan Goufalite telah sebutkan, cara untuk melakukan ini adalah trigonometri. Saya telah membuat gambar 2-d dari kamera dan objek IoT:

masukkan deskripsi gambar di sini

Seperti yang Anda lihat, bidang pandang kamera akan lebih besar dari objek - jika tidak dalam jarak dekat, ketika objek bergerak lebih jauh.

Sekarang, Anda mungkin ingin kamera selalu terpusat pada objek. Dalam hal ini, Anda cukup mengambil perhitungan yang dirujuk oleh hardlib:

ϴ = arctan(y/x)

... yang akan menjadi sudut berlawanan arah jarum jam dari sumbu x, per konvensi. Anda juga membutuhkan sudut menjauh dari level:

α = arctan(z / ((y^2+x^2)^1/2))

Jelas, Anda harus menghitung berdasarkan posisi kamera yang berada di titik asal dalam ketiga sumbu.

Di sisi lain, Anda mungkin memilih untuk tidak membuat kamera bergerak lebih dari yang diperlukan, yaitu membuat kamera hanya bergerak setelah objek tampak akan keluar dari bingkai. Dalam hal ini, Anda mungkin menginginkan variabel "tekanan" yang akan membuat kamera lebih cenderung untuk mengubah sudutnya berdasarkan seberapa dekat objek dengan tepi bingkai.

Jika Anda memilih rute itu, Anda harus mengetahui sudut bidang pandang kamera di kedua bidang pandang tersebut, sehingga Anda dapat menentukan di mana objek dibandingkan dengan bidang pandang kamera.

anonim2
sumber
Ini bagus! Terima kasih, pada saat ini saya ingin menjaga objek tetap di bidang pandang kamera.
bot_bot
2
Ketika saya menggeser / memiringkan kamera saya, saya memiliki latensi (~ 0,5 detik) antara setiap pesanan, berhati-hatilah ketika memindahkan kamera Anda
Goufalite
Poin bagus - itu pasti sesuatu yang perlu dipertimbangkan.
anonim2
5

Ini biasanya dilakukan dengan trigonometri dasar .

Mulailah dengan bekerja pada bidang datar 2d tunggal dengan kamera di titik asal (0,0) dan objek di (x, y)

Mengingat bahwa jarak x akan menjadi sisi yang berdekatan dari segitiga dan jarak y akan menjadi kebalikan yang Anda dapatkan:

tan (sudut) = y / x

sehingga sudut pan dapat ditemukan dengan

Angle = invTan (y / x)

Anda juga dapat mengetahui jarak garis lurus (sisi miring) antara kamera dan objek dengan:

h ^ 2 = x ^ 2 + y ^ 2

Memberi:

h = sqrt (x ^ 2 + y ^ 2)

Sekarang Anda dapat menggunakan jarak h dengan ketinggian z untuk menghitung sudut kemiringan dengan cara yang sama.

Setelah Anda memiliki sudut, Anda dapat mengumpankan ini ke apa yang mengontrol pan / tilt pada kamera.

hardillb
sumber