Как я могу анимировать объект в WebGL (изменять определенные вершины НЕ полные преобразования)
Хорошо,
Я новичок в 3D-графике, и хочу оживить отдельные конкретные вершины в модели (НЕ целое преобразование модели). Мой script в значительной степени основан на учебнике NEHE webgl. В этом руководстве все вершины объектов хранятся в буфере, который инициализируется один раз, когда программа запускается в первый раз. Вот код инициализации:
* Вершины заметок содержат массив вершин
vertexBuffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer);
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices), gl.STATIC_DRAW);
vertexBuffer.itemSize = 3;
vertexBuffer.numItems = parseInt(vertices.length/vertexBuffer.itemSize);
Теперь, поскольку они инициализируются с самого начала, очевидно, что изменение массива вершин ничего не сделает. Поэтому мне было интересно, как наилучшим образом изменить вершины в реальном времени, сохраняя при этом достаточно эффективную работу, чтобы работать плавно.
Можно ли как-то перестроить буфер, например, запустить этот код еще раз при каждом тике анимации?
gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer);
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices), gl.STATIC_DRAW);
Приветствия, J
Ответы
Ответ 1
Хорошо, после многого рытья через сеть. Я обнаружил, что необходимо внести следующие изменения:
Прежде всего, вы должны сделать динамический буфер вершинного массива динамическим. это стало возможным с помощью перечислителя 'gl.DYNAMIC_DRAW', где ранее в большинстве руководств мы имеем "gl.STATIC_DRAW". В результате:
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices), gl.DYNAMIC_DRAW);
Второе изменение должно быть активировано в вашей функции цикла (или тика или анимации).
Для обновления массива вызывается новая функция. Вы должны сначала связать предыдущий буфер динамического массива сначала:
gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer);
то после этого вы обновляете старые вершины со следующей функцией:
gl.bufferSubData(gl.ARRAY_BUFFER, 0, new Float32Array(vertices));
Если параметры являются < buffer_type > , < array_offset > , < new_data >
Источник: http://www.khronos.org/files/webgl/webgl-reference-card-1_0.pdf
Надеюсь, это поможет кому-то:)
J
Ответ 2
В качестве альтернативы вы можете выполнить шаги, описанные в http://learningwebgl.com/blog/?p=239.
Здесь они сохраняют данные вершин постоянными. Вместо этого они продолжают менять матрицу mvMatrix, которая обеспечивает требуемые переводы и вращения. mvMatrix затем подается в шейдер через однородную переменную, а затем умножается на позицию вершин, чтобы получить новые позиции вершин. Надеюсь, это поможет.