Jak mogę programowo powiedzieć kamerze, gdzie ma wskazywać?


8

Nie mam teraz na myśli konkretnego aparatu, jestem tylko ciekawy, jak to się robi, programowo / matematycznie.

Mam przestrzeń 3D, prostokąt, z kamerą skierowaną do góry w jednym rogu.
Mam ruchomy obiekt w tym prostokącie, który przesyła współrzędne (x, y, z) swojej aktualnej pozycji.
Chcę wziąć te współrzędne i przetłumaczyć je na instrukcje mówiące kamerze, aby wskazywała to położenie.
Jak zazwyczaj wykonuje się to tłumaczenie?


Możesz przyjrzeć się, jak twórcy gier radzą sobie z kamerami w grze. To ta sama zasada i że tak powiem, musieli poradzić sobie ze wszystkim pod słońcem.
— Harabeck

Warto zauważyć, że obiekt nie musi transmitować swoich współrzędnych w dosłownej przestrzeni 3D, ale raczej może transmitować będąc w polu widzenia kamery. Następnie użyjesz rozpoznawania wzorów, aby znaleźć miejsce w kadrze, w którym znajduje się obiekt, a następnie przesuń kamerę, aby wyśrodkować obiekt (lub w inny sposób zidentyfikuj wektor ruchu w 2D, śledząc zmianę położenia w wielu klatkach i poruszaj się w tym kierunku) . Na przykład moja kamera PTZ na ganku skanuje ganek, szukając ruchu nie z powodu ruchu panoramowania, a następnie blokuje się i podąża za ruchomym przedmiotem, aż ruch się zatrzyma.
— dannysauer

Mój przypadek użycia to sportowy system analityczny, każdy gracz ma na sobie metkę, która przesyła aktualną pozycję, prędkość itp. Na boisko. Mamy już informacje o pozycji. Zdecydowanie przyjrzę się jednak rozpoznawaniu wzorów. Brzmi użytecznie.
— bot_bot

Odpowiedzi:


10

Trygonometria!

Mój aparat to DLink 5020-L i ma polecenia panoramowania / pochylania, które można wydawać za pośrednictwem interfejsu API . Ma również predefiniowane pozycje do ustawienia, a także może być wyzwalane przez API

Przedinicjalizacja

  • Zdefiniuj pozycję kamery na 0 ° Pan i 0 ° Tilt w referencji => nazwiemy tę pozycję Position 1

W tym

  • Przenieś swój aparat do Position 1
  • Przechowuj gdzieś panoramę / pochylenie kamery, w zmiennych inicjowanych przez 0 lub za pośrednictwem interfejsu API

Spójrz na obiekt

  • Znajdź swój obiekt w dwóch płaszczyznach: X, Y i Y, Z
  • Możesz uzyskać kąt obrotu (lewy / prawy) (formuły matematyczne omg w IoT SE!)

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

  • Możesz wtedy uzyskać kąt pochylenia (góra / dół)

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

  • Nie zapomnij zapisać / zaktualizować nowej wartości obrotu / pochylenia, ponieważ możesz pracować z ruchem względnym ...

Możesz zanegować poprzednie wyniki w zależności od ustawienia aparatu

(Dodam trochę schematów, kiedy będę miał czas)


2
Pobity przez @hardillb;) I ma lepiej wyglądające formuły ...
— Goufalite

2
Niestety wsparcie LaTeX nie jest dostępne na tej stronie. Możesz jednak wyeksportować go skądś jak CodeCogs do obrazu jako zamiennik, jeśli chcesz. (Zrobiłem to dla ciebie; możesz edytować w razie potrzeby lub usunąć, jeśli nie chcesz!)
— Aurora0001

Dziękuje wam obojgu za waszą pomoc. Właśnie tego szukałem.
— bot_bot

Myślę, że zapomniałeś wziąć pod uwagę fakt, że arctan dla kąta pochylenia musi być w odniesieniu do komponentu z ponad przeciwprostokątną: umieszczenie go nad komponentem y może niewystarczająco podnieść / obniżyć kamerę, ponieważ kamera będzie skierowany wzdłuż przeciwprostokątnej prostokąta trójkąta między składnikiem y i składnikiem x, a nie wzdłuż osi y. Popraw mnie, jeśli się mylę. :) Świetna odpowiedź.
— anonimowy2

@ anonymous2 to też była moja myśl. Nie wydaje mi się, aby którakolwiek z przedstawionych odpowiedzi była w rzeczywistości prawidłowa, ale nie mam przepustowości, aby faktycznie to pokazać - wydaje się, że potrzebujesz dwóch trójkątów i wszystkich trzech współrzędnych, aby uzyskać zmienną (panoramowanie lub pochylanie). Możesz to sobie udowodnić, wizualizując dwa różne ekstremalne przykłady: x, y, z 1,1,999 da znacznie inne panoramowanie i inne pochylenie niż 1,1,1. Odpowiedź Goufalite daje tę samą patelnię dla obu.
— dwizum

6

Świetne odpowiedzi, chciałbym tylko dodać kilka innych rzeczy, które powinieneś wziąć pod uwagę. Jak wspomniano już o Hardlib i Goufalite, sposób na zrobienie tego jest trygonometryczny. Narysowałem dwuwymiarowy obraz kamery i obiektu IoT:

wprowadź opis zdjęcia tutaj

Jak widać, pole widzenia kamery będzie większe niż obiekt - jeśli nie będzie z bliskiej odległości, gdy obiekt poruszy się dalej.

Teraz może chcą aparat zawsze na środku obiektu. W takim przypadku możesz po prostu wykonać obliczenia, do których odnosi się hardlib:

ϴ = arctan(y/x)

... który będzie kątem w kierunku przeciwnym do ruchu wskazówek zegara od osi x, zgodnie z konwencją. Będziesz także potrzebował kąta od poziomu:

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

Oczywiście musisz obliczyć na podstawie położenia kamery znajdującego się na początku we wszystkich trzech osiach.

Z drugiej strony, możesz nie chcieć, aby kamera poruszała się bardziej niż to konieczne, to znaczy, aby kamera poruszała się tylko wtedy, gdy obiekt wydaje się być bliski wyjścia z ramki. W takim przypadku prawdopodobnie będziesz potrzebować zmiennej „ciśnienia”, która zwiększy prawdopodobieństwo, że kamera zmieni kąt w zależności od odległości obiektu od krawędzi ramki.

Jeśli wybierzesz tę trasę, musisz znać kąt pola widzenia kamery w obu polach widzenia, abyś mógł określić, gdzie obiekt jest porównywany z polem widzenia kamery.


To jest świetne! Dzięki, w tej chwili chcę utrzymać obiekt w centrum pola widzenia kamery.
— bot_bot

2
Kiedy przesuwam / przechylam aparat, mam pewne opóźnienie (~ 0,5 sekundy) między każdym zamówieniem, uważaj na to podczas przenoszenia aparatu
— Goufalite

Dobra uwaga - to zdecydowanie coś do rozważenia.
— anonimowy2

5

Zwykle odbywa się to za pomocą podstawowej trygonometrii .

Zacznij od pracy nad pojedynczą płaską płaszczyzną 2D z kamerą na początku (0,0) i obiektem na (x, y)

Biorąc pod uwagę, że odległość x będzie sąsiadującym bokiem trójkąta, a odległość y będzie przeciwna do otrzymanej:

tan (kąt) = y / x

dzięki czemu można znaleźć kąt obrotu

Kąt = invTan (t / x)

Możesz także obliczyć odległość w linii prostej (przeciwprostokątne) między kamerą a obiektem za pomocą:

h ^ 2 = x ^ 2 + y ^ 2

Dający:

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

Teraz możesz użyć odległości h z wysokością z, aby obliczyć kąt pochylenia w ten sam sposób.

Po ustawieniu kątów możesz je karmić tym, co kiedykolwiek kontroluje panoramowanie / pochylanie w kamerze.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.