Увеличение ускорения модели при нажатии клавиш? - PullRequest
0 голосов
/ 17 сентября 2018

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

Мой исходный код выглядел так:

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)

При обычном нажатии клавиши, скажем, A, код будет выглядеть так:

if(glfwGetKey(window, GLFW_KEY_A) == GLFW_PRESS){
    rotationAngle.x += 0.01;
}

Это увеличит вращениескорость, но, поскольку glfwGetTime() постоянно увеличивается, когда я удерживаю клавишу, она очень быстро вращается, а затем, когда клавиша не нажата, она возвращается к нормальной скорости вращения.

Что я мог делать неправильно

Ответы [ 2 ]

0 голосов
/ 18 сентября 2018

Из описания я представляю код примерно такой

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, поэтому вам может потребоваться еще несколько условий для проверки состояния ключа.

0 голосов
/ 17 сентября 2018

Вы, вероятно, хотите использовать дельта-время (изменение времени с последнего кадра) вместо времени.Я не уверен, есть ли у GLFW определенная функция для этого, но вы могли бы сделать это так:

time = glfwGetTime();
delta = time - lastTime;

// do stuff with delta ...

lastTime = time;
...