22

わかった、

私は 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);

これらは最初に初期化されるため、明らかに vertices 配列を変更しても何も起こりません。そのため、スムーズに実行するのに十分な効率を維持しながら、リアルタイムで頂点を変更する最良の方法は何かと考えていました。

何らかの方法でバッファを再バインドすることは可能ですか?たとえば、アニメーションのティックごとにこのコードを再度実行しますか?

gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer);
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices), gl.STATIC_DRAW);

乾杯、J

4

2 に答える 2

50

さて、ネットをたくさん掘り下げた後。次の変更を行う必要があることがわかりました。まず、頂点配列バッファーを動的にする必要があります。これは、列挙子「gl.DYNAMIC_DRAW」を使用することで可能になります。以前のほとんどのチュートリアルでは「gl.STATIC_DRAW」が使用されていました。その結果、次のようになります。

gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices), gl.DYNAMIC_DRAW);

2 番目の変更は、ループ (またはティック、またはアニメーション) 関数でトリガーする必要があります。配列を更新するために新しい関数が呼び出されます。もちろん、最初に前の動的配列バッファーを最初にバインドする必要があります。

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

于 2011-03-31T11:52:11.240 に答える
4

または、 http://learningwebgl.com/blog/?p=239で説明されている手順に従うこともできます。

ここでは、頂点データを一定に保ちます。代わりに、必要な平行移動と回転を提供するマトリックスmvMatrixを変更し続けます。次に、mvMatrixが一様変数を介してシェーダーに供給され、頂点位置が乗算されて新しい頂点位置が取得されます。お役に立てれば。

于 2012-08-03T08:50:43.367 に答える