OpenGL - Переместить мяч на наклонной столешнице - PullRequest
0 голосов
/ 13 января 2019

У меня есть столешница, которая может вращаться вокруг оси OX и OZ, и шар на этой столешнице. Мне нужно, чтобы мяч двигался вокруг самолета в соответствии с его наклоном. Мяч не должен иметь ускорения (скорость постоянна при определенном наклоне).

Здесь - это то, как я хочу, чтобы мяч двигался.

Сферная сетка создается следующим образом:

{
    glm::mat4 modelMatrix = glm::mat4(1);
    modelMatrix = glm::translate(modelMatrix, glm::vec3(speedOX, speedOY + 0.5f, speedOZ));
    RenderSimpleMesh(meshes["sphere"], shaders["ShaderLab8"], modelMatrix, glm::vec3(0, 1, 1));
}

Где speedOX speedOY speedOZ - перевод vec3 для сферы.

Плоская сетка создается следующим образом

    {
    glm::mat4 modelMatrix = glm::mat4(1);
    modelMatrix = glm::translate(modelMatrix, glm::vec3(0, 0.01f, 0));

    modelMatrix = glm::rotate(modelMatrix, RADIANS(anglePlaneOX), glm::vec3(1, 0, 0));
    modelMatrix = glm::rotate(modelMatrix, RADIANS(anglePlaneOY), glm::vec3(0, 1, 0));
    modelMatrix = glm::rotate(modelMatrix, RADIANS(anglePlaneOZ), glm::vec3(0, 0, 1));
    modelMatrix = glm::scale(modelMatrix, glm::vec3(0.125f));

    RenderSimpleMesh(meshes["plane"], shaders["ShaderLab8"], modelMatrix, glm::vec3(0.5, 0.5, 0.5));
}

Самолет движется, нажимая клавиши WASD.

    if (window->KeyHold(GLFW_KEY_W) && (anglePlaneOX > -90.0f)) {
        anglePlaneOX -= deltaTime * DELTA_SLOPE;

        /*update speedOX speedOY speedOZ */
    }
    if (window->KeyHold(GLFW_KEY_S) && (anglePlaneOX < 90.0f)) {
        anglePlaneOX += deltaTime * DELTA_SLOPE;

        /*update speedOX speedOY speedOZ */

    }
    if (window->KeyHold(GLFW_KEY_D) && (anglePlaneOZ > -90.0f)) {
        anglePlaneOZ -= deltaTime * DELTA_SLOPE;

        /*update speedOX speedOY speedOZ */
    }

      if (window->KeyHold(GLFW_KEY_A) && (anglePlaneOZ < 90.0f)) {
        anglePlaneOZ += deltaTime * DELTA_SLOPE;

        /*update speedOX speedOY speedOZ */
    }

Я не мог найти математику за перемещением мяча в соответствии с наклоном самолета.

Примечание: мяч не вращается сам по себе, так как я не делаю никаких сумасшедших теней над мячом. Я просто хочу, чтобы он двигался (переводился) в движущейся плоскости. Также кажется, что шар немного «тонет» в плоскости, как показано на рисунке.

1 Ответ

0 голосов
/ 15 января 2019

Похоже, вы хотите смоделировать поведение мяча после физики объектов, движущихся по рампам.

У вас есть плоскость, но вы можете себе представить, что этот процесс легко поддается физике объекта, движущегося вниз по скату, когда ваша плоскость создает гипотенузу треугольника.

Есть несколько действительно хороших учебных пособий, например этот; https://www.dummies.com/education/science/physics/calculating-how-far-an-object-will-slide-down-an-inclined-surface/

В этом разделе описывается, как рассчитать различные значения, которые вам понадобятся, чтобы определить, где будет находиться шар, когда самолет наклонится и его можно легко адаптировать для работы в вашей имитации.

Однако, если вы просто хотите, чтобы шар двигался вдоль плоскости, чтобы он не «тонул» через плоскость (не физический симулятор движения шарика, когда кто-то управляет мячом, как персонаж, идущий по плоскости) Вы могли бы говорить о столкновениях. В этом случае, чтобы заставить мяч правильно сидеть на плоскости, вы захотите внедрить систему проверки столкновений между мячом и плоскостью. Обычный способ проверки столкновений - дать каждому объекту в мире ограничивающий прямоугольник, а затем выполнить проверку столкновений на ограничивающих прямоугольниках объектов, простейший случай - ограничивающий прямоугольник с выравниванием по оси на ограничивающем прямоугольнике с выравниванием по оси (AABB). Но в вашем случае вам понадобится что-то более умное, чем AABB при проверке коллизий AABB, потому что вашему самолету понадобится ориентированная ограничительная рамка (OBB на OBB / AABB). Ограничивающие сферы также являются распространенным выбором для использования при столкновении объемов.

В качестве альтернативы, если у вас есть матрица вращения для вашей плоскости, вы можете просто создать горизонтальный вектор направления для шара и умножить его на матрицу вращения, прежде чем применять его к мячу. Затем вы можете просто добавить этот вектор в положение шарика, который даст вам вектор перемещения, который направлен вдоль оси x плоскости.

...