Уменьшение не работает в орфографической проекции

Я реализовал следующий код в Opengl, чтобы увеличить или уменьшить масштаб для моей модели. К сожалению, он не показывает, как ожидалось в ортографической проекции. Когда я нажимаю «+» или «-» и переключаюсь с перспективы на ортогональную, то при увеличении и уменьшении масштаба отображается только один шаг. Когда я переключаюсь с ортогональной на перспективу, тогда он увеличивает и уменьшает масштаб, когда просто нажимаю «+», затем он увеличивает и уменьшает масштаб, и клавиша «-» вообще не работает.

Может кто-нибудь помочь? Заранее спасибо.

glm::mat4 view = glm::lookAt(glm::vec3(4, 4, -3), glm::vec3(0, 1, 0), glm::vec3(0, 1, 0));
glm::mat4 projection = glm::perspective(45.0f, 4.0f / 3.0f, 0.2f, 1000.0f);

float zoom = 0.5236f;

case 'w':
if (!(perspective)){
projection = glm::perspective(zoom, 1.0f, 0.1f, 1000.0f);
perspective = true;
}
break;
case 's':
if (perspective){
projection = glm::ortho(-1.0f, 1.0f, -1.0f, 1.0f, -1000.0f, 1000.0f);
perspective = false;
}
break;
case '+':

if (zoom >= 0.0236){
if (perspective){
//step of zooming
zoom = zoom - 0.5;
zoom -= 0.1f;
projection = glm::perspective(zoom, 1.0f, 0.1f, 1000.0f);

}
else{
//step of zooming
zoom = zoom - 500;
zoom -= 0.1f;
projection = glm::ortho(-0.1 - zoom, 0.1 + zoom, -0.1 - zoom, 0.1 + zoom, -1000.0, 1000.0);

}
}
break;

case '-':
if (zoom <= 3.0236f){
if (perspective){
// step of zooming
zoom = zoom + 0.5;
zoom += 0.1f;
projection = glm::perspective(zoom, 1.0f, 0.1f, 1000.0f);

}
else{
//step of zooming
zoom = zoom + 500;
zoom += 0.1f;
projection = glm::ortho(-0.1 - zoom, 0.1 + zoom, -0.1 - zoom, 0.1 + zoom, -1000.0, 1000.0);
}
}
break;
}

0

Решение

К сожалению, он не показывает, как ожидалось в ортографической проекции. Когда я нажимаю «+» или «-» и переключаюсь с перспективы на ортогональную, то при увеличении и уменьшении масштаба отображается только один шаг.

Это потому, что в вашем case 's'

case 's':
if (perspective){
projection = glm::ortho(-1.0f, 1.0f, -1.0f, 1.0f, -1000.0f, 1000.0f);
perspective = false;
}
break;

Вы не рассматриваете коэффициент масштабирования на этом переключателе. Это происходит только тогда, когда вы нажимаете «+» или «-»:

projection = glm::ortho(-0.1 - zoom, 0.1 + zoom, -0.1 - zoom, 0.1 + zoom, -1000.0, 1000.0);

Когда я переключаюсь с ортогональной на перспективу, тогда он увеличивает и уменьшает масштаб, когда просто нажимаю «+», затем он увеличивает и уменьшает масштаб, и клавиша «-» вообще не работает.

Допустим, вы находитесь в орфографической точке зрения, и zoom = 0.5236f;, Вы нажимаете клавишу «-». В соответствии с вашей программой, если zoom меньше 3,0236, вы получаете оператор if. Итак, ваш зум становится zoom = 0.5236f + 500 = 500.5236

После этого, и я не знаю почему, вы добавляете 0,1 к нему, так что zoom = 500.6236f, Затем вы переключаетесь обратно в перспективную проекцию. Теперь, каждый раз, когда вы нажимаете «+», при увеличении> 0,0236 оно уменьшается на 0,6f.

Однако, когда вы нажимаете «-», ваш масштаб составляет около 500, что слишком много, чем 3,0236f. Таким образом, вы не попадете внутрь оператора if.

Как видите, ваша логика — ошибка. Вы должны улучшить это. Извините, что сказал

1

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

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

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