Я реализовал следующий код в 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;
}
К сожалению, он не показывает, как ожидалось в ортографической проекции. Когда я нажимаю «+» или «-» и переключаюсь с перспективы на ортогональную, то при увеличении и уменьшении масштаба отображается только один шаг.
Это потому, что в вашем 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.
Как видите, ваша логика — ошибка. Вы должны улучшить это. Извините, что сказал
Других решений пока нет …