Como posso dizer programaticamente a uma câmera para onde apontar?

8

Eu não tenho uma câmera em particular no momento, apenas estou curioso para saber como isso é feito, programaticamente / matematicamente.

Eu tenho um espaço 3D, um retângulo, com uma câmera em um canto, olhando para dentro.
Eu tenho um objeto em movimento naquele retângulo que está transmitindo (x, y, z) coordenadas de sua posição atual.
Quero pegar essas coordenadas e traduzi-las em instruções para que a câmera aponte para essa posição.
Como é feita essa tradução normalmente?

bot_bot
fonte
Você pode querer ver como os desenvolvedores de jogos lidam com suas câmeras no jogo. É o mesmo princípio e eles tiveram que lidar com tudo sob o sol, por assim dizer.
Harabeck 30/03
Pode ser interessante notar que o objeto não precisa transmitir suas coordenadas no espaço 3D literal, mas pode transmitir por estar no FOV da câmera. Você usaria o reconhecimento de padrões para descobrir onde o objeto está localizado no quadro e, em seguida, deslocaria a câmera para centralizar o objeto (ou, de outra forma, identificar um vetor de movimento em 2D, rastreando a mudança de posição em vários quadros e movendo-se nessa direção) . Por exemplo, minha câmera PTZ na varanda digitaliza a varanda procurando movimento não devido ao movimento panorâmico e, em seguida, trava e segue o item em movimento até que o movimento pare.
dannysauer
Meu caso de uso é um sistema de análise esportiva, cada jogador está usando uma etiqueta que transmite posição atual, velocidade, etc. em campo. Então, nós já temos as informações de posição. Definitivamente vou dar uma olhada no reconhecimento de padrões. Parece útil.
bot_bot

Respostas:

10

Trigonometria!

Minha câmera é uma DLink 5020-L e possui comandos de panorâmica / inclinação que podem ser dados por meio de uma API . Ele também possui posições predefinidas para definir e também pode ser acionado através da API

Pré-inicialização

  • Defina uma posição da sua câmera para um Pan 0 ° e uma Inclinação 0 ° em seu referencial => chamaremos essa posição Position 1

Iniciar

  • Mova sua câmera para Position 1
  • Armazene em algum lugar a panorâmica / inclinação da sua câmera, seja em variáveis ​​inicializadas com 0 ou através da sua API

Olhe para o objeto

  • Localize seu objeto em dois planos, os planos X, Y e Y, Z
  • Você pode obter o ângulo de panorâmica (esquerda / direita) (omg fórmulas matemáticas em um IoT SE!)

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

  • Você pode obter o ângulo de inclinação (para cima / para baixo)

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

  • Não se esqueça de salvar / atualizar o novo valor de panorâmica / inclinação, pois você pode trabalhar com movimento relativo ...

Você pode negar os resultados anteriores, dependendo de como sua câmera é colocada

(Vou adicionar alguns esquemas quando tiver tempo)

Goufalite
fonte
2
Batidos por @hardillb;) E ele tem que procuram melhor fórmulas ...
Goufalite
2
Infelizmente, o suporte ao LaTeX não está disponível neste site. Você pode exportá-lo de algum lugar como o CodeCogs para uma imagem como substituto, se quiser. (Eu fiz isso por você; sinta-se à vontade para editar conforme necessário ou removê-lo, se não quiser!)
Aurora0001
Obrigado a ambos por sua ajuda. Era exatamente isso que eu estava procurando.
bot_bot
Acho que você esqueceu de levar em conta o fato de que o arco para o ângulo de inclinação deve ser em relação ao componente z sobre a hipotenusa: colocá-lo sobre o componente y pode aumentar / diminuir sua câmera insuficientemente, pois a câmera será apontado ao longo da hipotenusa de um triângulo retângulo entre o componente y e o componente x, não ao longo do eixo y. Corrija-me se eu estiver errado. :) Ótima resposta, no entanto.
anonymous2
@ anonymous2 também foi o meu pensamento. Acho que nenhuma das respostas apresentadas ainda está correta, mas não tenho largura de banda para mostrar isso agora - parece que você precisa de dois triângulos e das três coordenadas para obter uma variável (panorâmica ou inclinação). Você pode provar isso para si mesmo visualizando dois exemplos extremos diferentes: x, y, z de 1.999.99 dará uma panorâmica muito diferente e uma inclinação muito diferente de 1,1,1. A resposta de Goufalite dá o mesmo tom para ambos.
Dwizum 30/0318
6

Ótimas respostas já, gostaria de acrescentar algumas outras coisas que você deve levar em consideração. Como hardlib e Goufalite já mencionaram, a maneira de fazer isso é trigonometricamente. Eu desenhei uma representação em 2D da câmera e do objeto IoT:

insira a descrição da imagem aqui

Como você pode ver, o campo de visão da câmera será maior que o objeto - se não estiver próximo, quando o objeto se afastar.

Agora, você pode querer que a câmera esteja sempre centrada no objeto. Nesse caso, você pode simplesmente fazer os cálculos que o hardlib referenciou:

ϴ = arctan(y/x)

... que será o ângulo no sentido anti-horário do eixo x, por convenção. Você também precisará do ângulo longe do nível:

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

Obviamente, você terá que calcular com base na posição da câmera que está na origem nos três eixos.

Por outro lado, você pode preferir não fazer a câmera se mover mais do que o necessário, ou seja, fazer a câmera se mover apenas quando o objeto parecer estar prestes a sair do quadro. Nesse caso, você provavelmente desejará uma variável de "pressão" que aumentará a probabilidade de a câmera mudar de ângulo com base na distância que o objeto está da borda do quadro.

Se você seguir esse caminho, precisará conhecer o ângulo do campo de visão da câmera nos dois campos de visão, para poder determinar onde o objeto é comparado ao campo de visão da câmera.

anonymous2
fonte
Isso é ótimo! Obrigado, no momento vou querer manter o objeto centralizado no campo de visão das câmeras.
bot_bot
2
Quando eu pan / tilt minha câmera que eu tenho alguma latência (~ 0,5 segundos) entre cada fim, cuidado com que ao mover a câmera
Goufalite
Bom ponto - isso é definitivamente algo a considerar.
anonymous2
5

Isso normalmente é feito com trigonometria básica .

Comece trabalhando em um único plano plano 2D com a câmera na origem (0,0) e o objeto em (x, y)

Dado que a distância x será o lado adjacente do triângulo e a distância y será o oposto que você obtém:

tan (ângulo) = y / x

para que o ângulo de panorâmica possa ser encontrado com

Ângulo = invTan (y / x)

Você também pode determinar a distância em linha reta (os hipotenos) entre a câmera e o objeto com:

h ^ 2 = x ^ 2 + y ^ 2

Dando:

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

Agora você pode usar a distância h com a altura z para calcular o ângulo de inclinação da mesma maneira.

Depois de ter os ângulos, você pode alimentá-los com o que estiver controlando a panorâmica / inclinação da câmera.

hardillb
fonte