Из описания я представляю код примерно такой
while(condition)
{
model = glm::rotate(model, glm::radians(rotationAngle.x * glfwGetTime()), glm::vec3(1.0f, 0.0f, 0.0f));
model = glm::rotate(model, glm::radians(rotationAngle.y * glfwGetTime())), glm::vec3(0.0f, 1.0f, 0.0f));
model = glm::rotate(model, glm::radians(rotationAngle.z * glfwGetTime())), glm::vec3(0.0f, 0.0f, 1.0f));
if(glfwGetKey(window, GLFW_KEY_A) == GLFW_PRESS)
{
rotationAngle.x += 0.01;
}
}
Когда вы удерживаете нажатой клавишу, вращение Angle увеличивается на 0,01 каждый раз, и каждый раз, когда цикл повторяется, функция вращения вращается на большую величину каждый цикл. Чтобы этого не происходило, оператор if должен активироваться только при переходе от «не нажато» к «нажато». Мы можем сделать это с флагом.
while(condition)
{
static bool keyDown = false;
model = glm::rotate(model, glm::radians(rotationAngle.x * glfwGetTime()), glm::vec3(1.0f, 0.0f, 0.0f));
model = glm::rotate(model, glm::radians(rotationAngle.y * glfwGetTime())), glm::vec3(0.0f, 1.0f, 0.0f));
model = glm::rotate(model, glm::radians(rotationAngle.z * glfwGetTime())), glm::vec3(0.0f, 0.0f, 1.0f));
if(glfwGetKey(window, GLFW_KEY_A) == GLFW_PRESS)
{
// We don't combine !keyDown in the outer if statement because
// we don't want the else statement to be activated whenever either
// statement is false.
// If key was not previously pressed, then activate. Otherwise,
// key is already down and we ignore this.
if(!keyDown)
{
rotationAngle.x += 0.01;
keyDown = true;
}
}
// Once you let go of the key, this part activates and resets the flag
// as well as the rotation angle.
else
{
rotationAngle.x = 0.0;
keydown = false;
}
}
Это должно выглядеть примерно так. Я не знаю специфики glfwGetKey, поэтому вам может потребоваться еще несколько условий для проверки состояния ключа.