OpenGL переключение между орто и перспективными проблемами

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

//change to perspective
case 'p':
if (!(perspective)) {
projection = glm::perspective(zoom, 1.0f, 0.1f, 100.0f);
perspective = true;
}
break;

//change to ortho
case 'o':
if (perspective) {
projection = glm::ortho(-100.0f, 100.0f, -100.0f, 100.0f, -1000.0f, 1000.0f);
perspective = false;
}
break;

// zoom out
case '-':
if (zoom <= 3.0236f) {
zoom += 0.1f;
if (perspective) {
projection = glm::perspective(zoom, 1.0f, 0.1f, 1000.0f);
}
else {
projection = glm::ortho(-0.1f - zoom, 0.1f + zoom, -0.1f - zoom, 0.1f + zoom, -10000.0f, 10000.0f);
}
}
break;

То же самое для увеличения с измененными префиксами

Я надеюсь, что кто-то может помочь, спасибо

если вам нужно больше деталей или больше кода, пожалуйста, дайте мне знать

Редактировать:
Для первой проблемы код, где я очищаю буфер глубины в функции отображения

void display()
{
... defined camera settings code here ....glClear(GL_DEPTH_BUFFER_BIT);
glClearBufferfv(GL_COLOR, 0, color);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, texture);

// set shader param and calculate matrices
modelView = view * modelView * model;
...
glDrawArrays(GL_TRIANGLES, 0, obj.vertices.size());

glutSwapBuffers();
}

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

1

Решение

попробуйте использовать больший диапазон масштаба для вашей орто-матрицы,

//change to ortho
case 'o':
if (perspective) {
float min = -pow(10, zoom);
float max = pow(10, zoom);
projection = glm::ortho(min, max, min, max, -1000.0f, 1000.0f);
perspective = false;
}
break;

Используйте тот же код при увеличении / уменьшении или, что еще лучше, выделите его в подпрограмму. Также подумайте, нужны ли вам такие огромные диапазоны для zNear и zFar. Попробуйте с меньшими числами.

Возможно, опубликуйте вашу первую проблему как отдельный вопрос

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]