如何在WebGL中为对象设置动画(修改特定顶点不是完全变换)

Jos*_* Mc 21 javascript animation buffer webgl vertex

好的,

我是3D图形的新手,我想在模型中为各个特定顶点设置动画(不是整个模型变换).我的脚本主要基于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);
Run Code Online (Sandbox Code Playgroud)

现在因为它们在开始时被初始化,显然改变顶点数组将不起作用.所以我想知道如何实时修改顶点的最佳方法,同时仍保持其足够高效以便顺利运行.

是否有可能以某种方式重新绑定缓冲区,例如在每个动画时刻再次运行此代码?

gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer);
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices), gl.STATIC_DRAW);
Run Code Online (Sandbox Code Playgroud)

干杯,J

Jos*_* Mc 48

好好经过大量的网络挖掘.我发现必须做出以下改变; 首先,您必须使顶点数组缓冲区动态化.这是通过使用枚举器'gl.DYNAMIC_DRAW'实现的,以前在大多数教程中我们都有'gl.STATIC_DRAW'.导致以下结果:

gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices), gl.DYNAMIC_DRAW);
Run Code Online (Sandbox Code Playgroud)

必须在循环(或刻度或动画)函数中触发第二个更改.调用新函数以更新数组.您必须首先首先绑定先前的动态数组缓冲区:

gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer);
Run Code Online (Sandbox Code Playgroud)

然后在此之后使用以下函数更新旧顶点:

gl.bufferSubData(gl.ARRAY_BUFFER, 0, new Float32Array(vertices));
Run Code Online (Sandbox Code Playgroud)

参数是<buffer_type>,<array_offset>,<new_data>

资料来源:http://www.khronos.org/files/webgl/webgl-reference-card-1_0.pdf

希望这有助于某人:)

Ĵ