Как составить экспоненциальное уравнение, которое вычисляет поле зрения камеры в зависимости от расстояния?

Я работаю над модом игры, и мне нужно рассчитать настройку поля зрения на основе расстояния от объекта до камеры. Я уже написал тестовую программу (в основном программу, которая создает камеру на фиксированном расстоянии от объекта, а затем позволяет мне вручную настраивать FOV до значения, которое я считаю лучшим), которая дала мне следующие значения:

  • 1 - 90
  • 2 - 60
  • 3 - 40
  • 4 - 30
  • 5 - 24
  • 6 - 20

Где первое число - это расстояние от камеры, а второе значение - это параметр FOV, который мне нужно использовать, чтобы объект находился на полной высоте в пределах экрана. Единицы расстояния являются вымышленными и неспецифическими, а значения FOV не имеют реальной связи с реальными объективами.

Я не вижу очевидной взаимосвязи между значениями, поэтому подозреваю, что для ее определения требуется формула или уравнение. Подобная математика не является моей сильной стороной, и я даже не уверен, с чего начать формулировать что-то, подходящее к ситуации.

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

Итак, как мне сформулировать функцию, которая сопоставляет себя с этими определенными значениями?


person Community    schedule 25.08.2016    source источник
comment
Этот вопрос, вероятно, лучше подходит для программистов, который отвечает на более общие вопросы программирования, или Математика. На самом деле это не имеет ничего общего с C #.   -  person smead    schedule 26.08.2016
comment
Вы хотите интерполировать эти значения. Линейную интерполяцию легко реализовать, и она должна выглядеть нормально. Или вы можете попробовать полиномиальную интерполяцию, если хотите более плавную кривую.   -  person Blorgbeard    schedule 26.08.2016
comment
Этот ответ должен дать вам отправную точку (по крайней мере, чтобы решить, как вы собираетесь интерполировать между указанными вами точками)   -  person Kolichikov    schedule 26.08.2016
comment
@smead - Да, извините за то, что я думал, что попал в правильный раздел ... первый вопрос, и я ошибаюсь.   -  person    schedule 27.08.2016
comment
@Kolichikov Спасибо, посмотрю по этой ссылке.   -  person    schedule 27.08.2016


Ответы (2)


Высота экрана на глубине d составляет

h = 2d * tan(fov / 2)

, где fov - вертикальное поле зрения.

Вы можете решить fov с помощью

fov = 2 * arc tan(h / 2d)
person Nico Schertler    schedule 26.08.2016
comment
это кажется более гибким подходом, чем попытка определить фиксированную кривую для переменного сценария ... Я попробую, спасибо. - person ; 27.08.2016

Ответ Нико выше хорош - если вам нужно визуальное представление о том, откуда взялась функция tan, вы можете представить камеру сидящей на половине роста человека.

Формула основана на создании треугольника от камеры до талии человека и земли. На его талии угол треугольника составляет 90 градусов. pov - это угол обзора (в камеру) между головой и ногами человека. (Это означает, что половина угла между ступнями и талией - это наш треугольник).

Когда человек удаляется дальше, мы знаем, что высота (h) остается неизменной, и использование определения tan для прямоугольных треугольников дает вам уравнение между pov/2 (угол на камеру), h/2 (высота от земли до пояса человека) и d расстояние по земле от камеры до человека.

person Kevin C    schedule 26.08.2016