2016-06-24 4 views
1

Я имею дело с экспериментальной установкой, где простая картина отображается на модифицированную генами муху. Изображение проецируется на экран с определенными расстояниями до этой мухи.Как настроить коррекцию перспективы OpenGL?

Теперь настало время настроить коррекцию перспективы, так что отображаемое изображение, например горизонтальная полоса, становится более широким на большем расстоянии от точки зрения мухи (experimental setup). Код теперь выглядит следующим образом:

glMatrixMode(GL_PROJECTION);       
glLoadIdentity(); 

if(!USEFRUSTUM) 
    gluPerspective(90.0f, 2 * width/height, 0.1f, 100.0f); 
else 
    glFrustum(92.3f, 2.3f, -25.0f, 65.0f, 50.0f, 1000.0f); 

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

Я подумал о тех значениях:

  • fovy = угол между а и с
  • ширины и высоты мера на проекционном экране
  • но что такое zNear? Должен ли я измерять расстояние от мухи до верхней или нижней части экрана? Я не понимаю, почему кто-то вошел в 0.1f, потому что это кажется мне слишком близко.
  • Как узнать значение zFar? Является ли это максимальным расстоянием объекта на лету?

Я получил информацию о glPerspective от: https://www.ntu.edu.sg/home/ehchua/programming/opengl/CG_BasicsTheory.html Я также проверил Simplest way to set up a 3D OpenGL perspective projection, но этот пост не относится к моей экспериментальной установке, которая является источником моего замешательства.

Благодарим за помощь!

ответ

0

Это один из главных примеров, когда метод усечения проще в использовании, чем в перспективе. Усечка - это, по сути, обрезанная пирамида. Представьте себе свою муху на кончике четырехсторонней, наклоненной пирамиды. Ближайшее значение дает расстояние до основания пирамиды и слева, справа, снизу и сверху перпендикулярного расстояния каждой стороны основания пирамид до кончика. Совершенно разумно, что наконечник «снаружи» от базовой области. Или в случае вашей мухи центр может быть чуть выше «левого» края.

Так предполагается, что ваш оригинальную картину мы имеем это:

fly frustum

«Рядом» дает «расстояние» на проекционном экране и вправо (и, конечно, также сверху, снизу и слева) соответствующие расстояния вершины, err, летают перпендикулярно краям экрана.

«далеко» не имеет значения для проективных характеристик и используется исключительно для определения диапазона глубины.

Так что вы можете запрограммировать в следующий:

double near = ${distance to screen in mm}; 
double left = ${perpendicular to left screen edge in mm}; 
double right = ${perpendicular to right screen edge in mm}; 
double top = ${perpendicular to top screen edge in mm}; 
double bottom = ${perpendicular to bottom screen edge in mm}; 
double s = ${scaling factor from mm into OpenGL units}; 
double zrange = ${depth range in OpenGL units the far plane is behind near}; 
glFrustum(s*left, s*right, s*bottom, s*top, s*near, s*near + zrange); 

Имейте в виду, что слева, справа, сверху и снизу может быть отрицательным. Поэтому скажите, что вам нужно симметричное (неперемещенное) представление в одном направлении, это left = -bottom, и сдвиг по существу добавляет/вычитает оба одинакового смещения.

+0

Hey datenwolf! Большое спасибо за ваш ответ.Теперь я понял, как принимать измерения для ближнего, нижнего, левого и правого и того, как выглядит усечка в моем случае. Я еще не понимаю, как определить масштабный коэффициент s. Я читал в «Руководстве по программированию OpenGL:« Официальное руководство по изучению OpenGL, версии 3 »(книги Google), что, пока мои измерения используют последовательную единицу, я могу оставить их немасштабированными. Диапазон глубины может зависеть от глубины визуального поля мухи? Думаю, тогда я мог бы обсудить с моими коллегами соответствующую ценность. – TheCooocy

+0

@ TheCooocy: Да, вы можете полностью опустить 's' (т. Е. S = 1) до тех пор, пока вся геометрия, которую вы рисуете с помощью OpenGL, непротиворечива. Поскольку вы взаимодействуете с физическим существом (животным), это имеет большое значение для определения геометрии, которую вы собираетесь рисовать с помощью OpenGL в тех же физических единицах, в которых измеряется проекционная система «снаружи». * расстояние не должно быть расстоянием до фактического экрана, но, вероятно, ближе к лету (изображение маленького крошечного экрана прямо перед глазами мухи). Но для физических ограничений в вашей настройке вы должны использовать этот больший экран. – datenwolf

+0

@ TheCooocy: Таким образом, тогда вы должны принять соотношение между «виртуальным» расстоянием «n_» и фактическим расстоянием экрана «n» и масштабировать влево, вправо, снизу, сверху и рядом с этим коэффициентом n_/n '. Если вы делаете все, скажем, * мм * юниты, это будет расстояние отсечки, при котором объекты (внезапно) исчезают. По практическим соображениям, касающимся разрешения буфера глубины, вы должны выбрать значение * far * as small и значение для * near * как можно меньше для размещения геометрии, которую вы хотите нарисовать. – datenwolf

Смежные вопросы