Подтвердить что ты не робот

Как я могу анимировать объект в 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

4b9b3361

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