¿Cómo puedo decirle programáticamente a una cámara dónde apuntar?

8

No tengo una cámara en particular en este momento, solo tengo curiosidad por saber cómo se hace esto, programáticamente / matemáticamente.

Tengo un espacio 3D, un rectángulo, con una cámara en una esquina mirando hacia adentro.
Tengo un objeto en movimiento en ese rectángulo que transmite coordenadas (x, y, z) de su posición actual.
Quiero tomar esas coordenadas y traducirlas en instrucciones para que la cámara apunte a esa posición.
¿Cómo se hace esta traducción típicamente?

bot_bot
fuente
Es posible que desee ver cómo los desarrolladores de juegos manejan sus cámaras en el juego. Es el mismo principio y han tenido que lidiar con todo bajo el sol, por así decirlo.
Harabeck
Vale la pena señalar que el objeto no tiene que transmitir sus coordenadas en un espacio literal en 3D, sino que podría transmitir al estar en el FOV de la cámara. Luego, utilizaría el reconocimiento de patrones para encontrar en qué parte del marco se encuentra el objeto y luego mover la cámara para centrar el objeto (o identificar un vector de movimiento en 2D al rastrear el cambio de posición en varios cuadros y moverse en esa dirección) . Por ejemplo, mi cámara PTZ en el porche escanea el porche en busca de movimiento no debido al movimiento panorámico, y luego se bloquea y sigue el elemento en movimiento hasta que se detiene el movimiento.
dannysauer
Mi caso de uso es un sistema de análisis deportivo, cada jugador lleva una etiqueta que transmite la posición actual, la velocidad, etc. en el campo. Entonces ya tenemos la información de posición. Sin embargo, definitivamente echaré un vistazo al reconocimiento de patrones. Suena util
bot_bot

Respuestas:

10

Trigonometría!

Mi cámara es una DLink 5020-L y tiene comandos de movimiento horizontal / vertical que se pueden dar a través de una API . También tiene posiciones predefinidas para establecer y también se puede activar a través de API

Pre-inicio

  • Defina una posición de su cámara a 0 ° Pan y 0 ° Tilt en su referencial => llamaremos a esta posición Position 1

En eso

  • Mueve tu cámara a Position 1
  • Almacene en algún lugar la panorámica / inclinación de su cámara, ya sea en variables 0 inicializadas o a través de su API

Mira el objeto

  • Ubique su objeto en dos planos, los planos X, Y e Y, Z
  • Luego puede obtener el ángulo de desplazamiento (izquierda / derecha) (¡por ejemplo, fórmulas matemáticas en un IoT SE!)

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

  • Entonces puede obtener el ángulo de inclinación (arriba / abajo)

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

  • No olvide guardar / actualizar el nuevo valor de panorámica / inclinación, ya que podría trabajar con un movimiento relativo ...

Puede negar los resultados anteriores dependiendo de cómo se coloque su cámara

(Agregaré algunos esquemas cuando tenga tiempo)

Goufalite
fuente
2
Golpeado por @hardillb;) Y tiene fórmulas más atractivas ...
Goufalite
2
Lamentablemente, el soporte de LaTeX no está disponible en este sitio. Si lo desea, puede exportarlo desde algún lugar como CodeCogs a una imagen como sustituto. (Lo he hecho por usted; ¡no dude en editarlo según sea necesario o eliminarlo si no lo desea!)
Aurora0001
Gracias a los dos por su ayuda. Esto es exactamente lo que estaba buscando.
bot_bot
Creo que olvidó tener en cuenta el hecho de que el arctan para el ángulo de inclinación tiene que ser con respecto al componente z sobre la hipotenusa: ponerlo sobre el componente y podría elevar / bajar la cámara de manera insuficiente ya que la cámara va a ser señaló a lo largo de la hipotenusa de un triángulo rectángulo entre el componente y y el componente x, no a lo largo del eje y. Corrígeme si estoy equivocado. :) Gran respuesta, sin embargo.
anónimo2
@ anonymous2 ese también fue mi pensamiento. No creo que ninguna de las respuestas presentadas sea realmente correcta, pero no tengo el ancho de banda para mostrar eso en este momento; parece que necesita dos triángulos y las tres coordenadas para obtener una variable (panorámica o inclinación). Puede probarse esto a sí mismo visualizando dos ejemplos extremos diferentes: x, y, z de 1,1,999 dará una panorámica muy diferente y una inclinación muy diferente de 1,1,1. La respuesta de Goufalite da la misma sartén para ambos.
dwizum
6

Grandes respuestas ya, solo me gustaría agregar algunas otras cosas que debe tener en cuenta. Como hardlib y Goufalite ya han mencionado, la forma de hacerlo es trigonométricamente. He dibujado una representación en 2-d de la cámara y el objeto IoT:

ingrese la descripción de la imagen aquí

Como puede ver, el campo de visión de la cámara será más grande que el objeto, si no está cerca, cuando el objeto se aleje más.

Ahora, es posible que desee que la cámara esté siempre centrada en el objeto. En ese caso, simplemente puede tomar los cálculos a los que hace referencia hardlib:

ϴ = arctan(y/x)

... que será el ángulo en sentido antihorario desde el eje x, por convención. También necesitará el ángulo alejado del nivel:

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

Obviamente, tendrá que calcular en función de la posición de la cámara en el origen en los tres ejes.

Por otro lado, es posible que prefiera no hacer que la cámara se mueva más de lo necesario, es decir, hacer que la cámara solo se mueva una vez que el objeto parece estar a punto de salir del marco. En ese caso, es probable que desee una variable de "presión" que hará que la cámara tenga más probabilidades de cambiar su ángulo en función de lo cerca que esté el objeto del borde del encuadre.

Si sigue esa ruta, necesitará saber el ángulo del campo de visión de la cámara en ambos campos de visión, para poder determinar dónde se compara el objeto con el campo de visión de la cámara.

anónimo2
fuente
¡Esto es genial! Gracias, por el momento querré mantener el objeto centrado en el campo de visión de las cámaras.
bot_bot
2
Cuando sacudo / inclino mi cámara tengo algo de latencia (~ 0.5 segundos) entre cada orden, tenga cuidado al mover su cámara
Goufalite
Buen punto: definitivamente es algo a considerar.
anónimo2
5

Esto normalmente se hace con trigonometría básica .

Comience trabajando en un solo plano plano 2D con la cámara en el origen (0,0) y el objeto en (x, y)

Dado que la distancia x será el lado adyacente del triángulo y la distancia y será el opuesto que obtienes:

tan (ángulo) = y / x

por lo que el ángulo de desplazamiento se puede encontrar con

Ángulo = invTan (y / x)

También puede calcular la distancia en línea recta (las hipotenusas) entre la cámara y el objeto con:

h ^ 2 = x ^ 2 + y ^ 2

Dando:

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

Ahora puede usar la distancia h con la altura z para calcular el ángulo de inclinación de la misma manera.

Una vez que tenga los ángulos, puede alimentarlos a lo que sea que esté controlando la panorámica / inclinación de la cámara.

hardillb
fuente