Как программно сказать камере, куда указывать?

8

Я не имею в виду конкретную камеру прямо сейчас, мне просто любопытно, как это делается программно / математически.

У меня есть трехмерное пространство, прямоугольник с камерой в углу, смотрящей внутрь.
У меня есть движущийся объект в этом прямоугольнике, который передает (x, y, z) координаты его текущей позиции.
Я хочу взять эти координаты и перевести их в инструкции, указывающие камере указывать на это положение.
Как обычно выполняется этот перевод?

bot_bot
источник
Возможно, вы захотите посмотреть, как разработчики игр обращаются со своими игровыми камерами. Это тот же принцип, и им пришлось иметь дело со всем под солнцем, так сказать.
Харабек
Возможно, стоит отметить, что объект не должен передавать свои координаты в буквальном трехмерном пространстве, а может передавать его, находясь в поле зрения камеры. Затем вы можете использовать распознавание образов, чтобы найти, где в кадре находится объект, а затем сдвинуть камеру, чтобы отцентрировать объект (или иначе идентифицировать вектор движения в 2D, отслеживая изменение положения в нескольких кадрах и двигаясь в этом направлении). , Например, моя PTZ-камера на крыльце сканирует крыльцо в поисках движения не из-за движения панорамирования, а затем фиксируется и следует за движущимся элементом, пока движение не остановится.
dannysauer
Мой пример использования - система спортивной аналитики, каждый игрок носит ярлык, который передает текущую позицию, скорость и т. Д. На поле. Таким образом, у нас уже есть информация о местоположении. Я определенно взгляну на распознавание образов. Звучит полезно.
bot_bot

Ответы:

10

Тригонометрия!

Моя камера - DLink 5020-L и имеет команды панорамирования / наклона, которые могут быть переданы через API . Он также имеет предопределенные позиции для установки и может быть запущен через API

Pre-INIT

  • Определите положение вашей камеры для панорамы 0 ° и наклона 0 ° в вашей референции => мы назовем эту позицию Position 1

В этом

  • Переместите камеру в Position 1
  • Сохраните где-нибудь панорамирование / наклон вашей камеры, либо в 0-инициализированных переменных, либо через ваш API

Посмотрите на объект

  • Найдите свой объект в двух плоскостях, X, Y и Y, Z плоскости
  • Затем вы можете получить угол панорамирования (влево / вправо) (OMG математические формулы в IoT SE!)

$$ \ агс \ Bigg (\ гидроразрыва {у} {х} \ Bigg) $$

  • Вы можете получить угол наклона (вверх / вниз)

$$ \ агс \ Bigg (\ гидроразрыва {г} {у} \ ​​Bigg) $$

  • Не забудьте сохранить / обновить новое значение панорамирования / наклона, поскольку вы можете работать с относительным движением ...

Вы можете отрицать предыдущие результаты в зависимости от расположения вашей камеры

(Я добавлю некоторые схемы, когда у меня будет время)

Goufalite
источник
2
Избит @hardillb;) И у него лучше выглядят формулы ...
Гуфалит
2
К сожалению, поддержка LaTeX не доступна на этом сайте. Вы можете экспортировать его из любого места, например CodeCogs, хотя в качестве замены, если хотите. (Я сделал это для вас; не стесняйтесь редактировать по мере необходимости или удалять его, если вы этого не хотите!)
Aurora0001
Спасибо вам обоим за помощь. Это именно то, что я искал.
bot_bot
Я думаю, что вы забыли принять во внимание тот факт, что арктан для угла наклона должен быть по отношению к компоненту z над гипотенузой: размещение его над компонентом y может недостаточно поднять / опустить вашу камеру, так как камера будет указал вдоль гипотенузы прямоугольного треугольника между компонентом y и компонентом x, а не вдоль оси y. Поправьте меня если я ошибаюсь. :) Отличный ответ, хотя.
anonymous2
@ anonymous2 это тоже была моя мысль. Я не думаю, что какой-либо из представленных ответов на самом деле является правильным, но у меня нет пропускной способности, чтобы показать это прямо сейчас - кажется, вам нужны два треугольника и все три координаты, чтобы получить либо переменную (панорамирование или наклон). Вы можете доказать это себе, представив два разных крайних примера: x, y, z, равное 1,1999, даст совершенно разные панорамы и наклон, чем у 1,1,1. Ответ Гуфалита дает одинаковую сковороду для обоих.
dvizum
6

Хорошие ответы уже, я просто хотел бы добавить несколько других вещей, которые вы должны принять во внимание. Как уже упоминали hardlib и Goufalite, способ сделать это - тригонометрически. Я нарисовал 2-е изображение камеры и объекта IoT:

введите описание изображения здесь

Как вы можете видеть, поле зрения камеры будет больше, чем объект - если не на близком расстоянии, когда объект удаляется дальше.

Теперь вы можете захотеть, чтобы камера всегда была в центре объекта. В этом случае вы можете просто взять вычисления, на которые ссылается hardlib:

ϴ = arctan(y/x)

... который будет углом против часовой стрелки от оси x, в соответствии с соглашением. Вам также понадобится угол вдали от уровня:

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

Очевидно, вам придется рассчитывать, исходя из положения камеры в исходной точке по всем трем осям.

С другой стороны, вы можете предпочесть не заставлять камеру двигаться больше, чем необходимо, то есть заставлять камеру двигаться только после того, как объект, по-видимому, собирается выйти из кадра. В этом случае вам, вероятно, понадобится переменная «давление», которая увеличит вероятность изменения угла камеры в зависимости от того, насколько близко объект находится к краю кадра.

Если вы идете по этому маршруту, вам нужно знать угол поля зрения камеры в обоих полях обзора, чтобы вы могли определить, где объект сравнивается с полем зрения камеры.

анонимный2
источник
Это замечательно! Спасибо, сейчас я хочу, чтобы объект был в центре поля зрения камеры.
bot_bot
2
Когда я поворачиваю / наклоняю свою камеру, у меня появляется задержка (~ 0,5 секунды) между каждым заказом, остерегайтесь этого при перемещении камеры
Goufalite
Хороший вопрос - это определенно что-то для рассмотрения.
anonymous2
5

Обычно это делается с помощью базовой тригонометрии .

Начните с работы на одной плоской плоскости 2d с камерой в начале координат (0,0) и объектом в точке (x, y)

Учитывая, что расстояние x будет смежной стороной треугольника, а расстояние y будет противоположным, вы получите:

tan (угол) = y / x

так что угол панорамирования можно найти с

Угол = invTan (у / х)

Вы также можете определить расстояние по прямой линии (гипотенузы) между камерой и объектом с помощью:

ч ^ 2 = х ^ 2 + у ^ 2

Предоставление:

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

Теперь вы можете использовать расстояние h с высотой z, чтобы таким же образом рассчитать угол наклона.

Когда у вас есть углы, вы можете подать их на то, что когда-либо контролирует панорамирование / наклон камеры.

hardillb
источник