2016-07-08 4 views
0

Я пытаюсь изменить проекцию камеры с точки зрения на орфографическую. На данный момент мой код работает отлично с перспективной проекциейОт перспективы к орфографическим проекциям

m_prespective = glm::perspective(70.0f, (float)DISPLAY_WIDTH/(float)DISPLAY_HEIGHT, 0.01f, 1000.0f); 
m_position = glm::vec3(mesh.centre.x, mesh.centre.y, -mesh.radius); 
m_forward = centre; 
m_up = glm::vec3(0.0f, 1.0f, 0.0f); 
return m_prespective * glm::lookAt(m_position, m_forward, m_up); 

Но как только я изменить его ортогональную проекцию я не могу видеть мою сетки больше.

m_ortho = glm::ortho(0.0f, (float)DISPLAY_WIDTH, (float)DISPLAY_HEIGHT,5.0f, 0.01f, 1000.0f); 
m_position = glm::vec3(mesh.centre.x, mesh.centre.y, -mesh.radius); 
m_forward = centre; 
m_up = glm::vec3(0.0f, 1.0f, 0.0f); 
return m_ortho * glm::lookAt(m_position, m_forward, m_up); 

Я не понимаю, что я делаю неправильно.

+0

Вы случайно заменили аргументы на 'ortho'? Подпись должна быть 'орто (левая, правая, нижняя, верхняя, ближняя, дальняя). Что это такое? – peppe

+0

На самом деле да, установка верхушки в 0.0f позволяет мне видеть по крайней мере очень маленькую связку пикселей в верхнем левом углу окна. Однако, используя перспективную проекцию, моя сетка отображается в центре экрана и имеет «нормальный» размер. Тем не менее, я не понимаю, почему он отображается так далеко и не сосредоточен. У вас есть какая-то подсказка? – Izzy88

+0

Учитывая, что мои DISPLAY_WIDTH и DISPLAY_HEIGHT соответственно 800 и 600, изменяя эти значения из 'm_ortho = glm :: ortho (0.0f, 800.0f, 600.0f, 5.0f, 0.01f, 1000.0f);' to 'm_ortho = glm :: орто (8.0f, 0.0f, 0.0f, 6.0f, 0.1f, 100.0f); ' заставляет размер вернуться к норме (более или менее). Но я не понимаю, существует ли правило или конкретное отношение для изменения значений размера от проекции в перспективе до орфографической проекции. (Просто чтобы не менять их вручную каждый раз) – Izzy88

ответ

2

В перспективной проекции оценивается соотношение сторон изображения (float)DISPLAY_WIDTH/(float)DISPLAY_HEIGHT. Это число будет близко к 1. Расстояние левого и правого клипов на ближней плоскости для проекции перспективы составляет aspect * near_distance. Более интересно, хотя это пространство слева-справа на расстоянии просмотра, которое в вашем случае равно abs(m_position.z)= abs(mesh.radius).

Проводя это на ортографический проектор, расстояние левого, правого, верхнего и нижнего клипов должно быть одного порядка, поэтому, учитывая, что этот аспект близок к 1, значения для левого, правого, нижнего и верхнего должны быть близко к значению abs(mesh.radius). Разрешение экрана в пикселях абсолютно не имеет значения, за исключением пропорции.

Кроме того, при использовании проекции в перспективе значение near должно быть выбрано как можно больше, чтобы была видна вся необходимая геометрия. В противном случае будет тратиться драгоценное разрешение буфера глубины.

float const view_distance = mesh.radius + 1; 

float const aspect = (float)DISPLAY_WIDTH/(float)DISPLAY_HEIGHT; 
switch(typeof_projection){ 
case perspective: 
    m_projection = glm::perspective(70.0f, aspect, 1.f, 1000.0f); 
    break; 

case ortho: 
    m_projection = glm::ortho(
     -aspect * view_distance, 
     aspect * view_distance, 
     view_distance, 
     view_distance, 
     -1000, 1000); 
    break; 
} 

m_position = glm::vec3(mesh.centre.x, mesh.centre.y, -view_distance); 
m_forward = centre; 
m_up = glm::vec3(0.0f, 1.0f, 0.0f); 

return m_projection * glm::lookAt(m_position, m_forward, m_up); 
+0

Большое спасибо @datenwolf, как за ваше объяснение, так и за ваше очень мудрое предложение в вашем предыдущем сообщении. Я полностью согласен с вами, и это то, что я обычно делаю. К сожалению, в этом случае у меня не так много времени, чтобы углубить и изучить эту тему, и это не совсем ключевой аргумент в пользу того, что я пытаюсь создать прямо сейчас. Это начало расстраивать. Благодарим вас за код, он отлично работает (мне просто нужно добавить a - до третьего параметра на тот случай, если кому-то это понадобится). – Izzy88

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

  • Нет связанных вопросов^_^