Ответы пользователя по тегу OpenGL
  • Как изменять координаты объектов OpenGL?

    SHVV
    @SHVV
    У вас же итак функция отрисовки окружности может рендерить их в произвольных координатах, так что достаточно двигать их в первом таймере и там же удалять:
    for(vector::iterator i=circ.begin(); i!=circ.end(); i++) {
      i->r++; // Увеличивается радиус
      i->alpha/=1.05; // Уменьшается прозрачность
      i->y += 10; // Двигаем вверх по y (может придётся поменять на - , если будут двигаться не в ту сторону)
      if (i->y >= 200) {
        i = circ.erase(i);
      }
    }
    Ответ написан
    Комментировать
  • Какова логика вращения объекта (vbo) средствами OpenGL с использованием GLSL?

    SHVV
    @SHVV
    VBO для того и сделано, чтобы загружать его в GPU один раз и больше не трогать.
    То что для поворота вы фактически модифицируете вершины - абсолютно не верно.
    Для передачи матрицы трансформации в шейдер нужно использовать Uniform-ы.
    Тут простенький урок с вращающимся кубиком и использованием VBO.
    Ответ написан
    Комментировать
  • Вопрос по выводу gluLookAt функции в OpenGL?

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

    Одно из свойств матрицы преобразования — это то, что её строки являются векторами базиса новой системы координат. То есть, когда вы умножаете матрицу на вектор, вы последовательно умножаете скалярно исходный вектор и строки (вектора базиса), получая исходный вектор в новых координатах. Так как каждое скалярное произведение покажет, сколько того или иного базисного вектора есть в исходном векторе. Чтобы матрица преобразования была ортонормированной (содержать исключительно вращения), она должна состоять из взаимно перпендикулярных и нормализованных векторов.

    Итак, строки матрицы у нас — вектора нового базиса в координатах исходного базиса. Надо их найти.
    Один из векторов у нас известен — это направление взгляда, нормализуем его и записываем сразу в матрицу (для OpenGL ось взгляда — ось Z, потому записываем наш вектор в третью строку матрицы). Второй вектор ортогонален первому и некоторой примерной линии, направленной вверх. получаем его векторным произведением вектора взгляда и этого вспомогательного вектора. Получаем вектор, направленный вправо (или влево, в зависимости от порядка умножения). После нормализации записываем его в первую строку матрицы (в OpenGL ось X совпадает с осью X экрана и направлена вправо). Оставшийся вектор получаем векторным произведением уже полученных векторов и записываем во вторую строку матрицы (в OpenGL ось Y направлена вверх). Он должен получаться уже нормализованным.

    Но есть нюанс. Если вектор взгляда совпадает с вспомогательным вектором вверх, то их векторное произведение будет равно нулю и матрицу посчитать не получится.
    Ответ написан
    3 комментария