0

ループ関数で bufferGeometry のインデックスを更新する必要がありますが、割り当てられていないインデックスのみを更新できます。インデックス配列の要素に値を代入すると、次回は新しい値を代入できません。 などの問題を検索しましmesh.geometry.index.needsUpdate = true;たが、効果がありません。

bufferGeometry によって新しいメッシュを作成するのは私のコードです。

    var geometry = new THREE.BufferGeometry();

    var pBuff = new ArrayBuffer(MAX_POINTS*3*4);
    var positions = new Float32Array(pBuff);

    var indices = new ArrayBuffer(MAX_POINTS*2*3);
    var iIndices = new Uint16Array(indices);

    positions[0] = 1.0;
    positions[1] = 1.0;
    positions[2] = 1.0;

    positions[3] = 1.0;
    positions[4] = 1.0;
    positions[5] = -1.0;

    positions[6] = -1.0;
    positions[7] = 1.0;
    positions[8] = -1.0;

    positions[9] = -1.0;
    positions[10] = 1.0;
    positions[11] = 1.0;

    positions[12] = 1.0;
    positions[13] = -1.0;
    positions[14] = 1.0;

    positions[15] = 1.0;
    positions[16] = -1.0;
    positions[17] = -1.0;

    positions[18] = -1.0;
    positions[19] = -1.0;
    positions[20] = -1.0;

    positions[21] = -1.0;
    positions[22] = -1.0;
    positions[23] = 1.0;

    iIndices[0] = 0;
    iIndices[1] = 1;
    iIndices[2] = 2;

    iIndices[3] = 2;
    iIndices[4] = 3;
    iIndices[5] = 0;

    geometry.addAttribute('position', new THREE.BufferAttribute(new Float32Array(positions), 3));
    geometry.setIndex(new THREE.BufferAttribute(iIndices, 1));
    cube = new THREE.Mesh(geometry, new THREE.MeshBasicMaterial({color: 'rgb(255, 255, 0)', side: THREE.DoubleSide}));

    scene.add(cube);

ループ関数のインデックスを更新するのは私のコードです。

var iIndices = cube.geometry.getIndex();
if(change_index){
    iIndices[0] = 0;
    iIndices[1] = 1;
    iIndices[2] = 2;

    iIndices[3] = 2;
    iIndices[4] = 3;
    iIndices[5] = 0;

    change_index = false;
}else{
    iIndices[0] = 4;
    iIndices[1] = 5;
    iIndices[2] = 6;

    iIndices[3] = 6;
    iIndices[4] = 7;
    iIndices[5] = 4;
    change_index = true;
}
cube.geometry.index.needsUpdate = true;

cube.geometry.setDrawRange( 0, 6 );

レンダリング結果です。

ここに画像の説明を入力

最初に割り当てられたインデックスのみを保持できます。など、index([0,1,2,2,3,0]) が有効です。次回新しい値を設定すると、indexs([4,5,6,6,7,4]) が無効になります。

cube.geometry.index.needsUpdate = true;はいくつかの問題を検索geometry.addAttribute('indices', new THREE.BufferAttribute(new Float32Array(iIndices), 3));cube.geometry.attributes.indices.array;ます。無効です。

ループ関数で bufferGeometry のこれらのインデックスを更新するにはどうすればよいですか?

それを解決する方法を試してみると、新しい問題を抱えた低い方法が見つかります。最適化する方法。

これが私の方法です。

var iIndices = cube.geometry.index.array.subarray(0, 6);
if(change_index){
    iIndices[0] = 0;
    iIndices[1] = 1;
    iIndices[2] = 2;

    iIndices[3] = 6;
    iIndices[4] = 7;
    iIndices[5] = 4;

    change_index = false;
}else{
    iIndices[0] = 4;
    iIndices[1] = 5;
    iIndices[2] = 6;

    iIndices[3] = 2;
    iIndices[4] = 3;
    iIndices[5] = 0;
    change_index = true;
}
cube.geometry.index.needsUpdate = true;

これが結果(前)です。

結果01

これが結果(後)です。

結果02

ジオメトリの頂点は不変ですが、ジオメトリ ( result01 ) のインデックスは [0,1,2,2,3,0] であり、ジオメトリ ( result02 ) のインデックスは [4,5,6,6,7,4 です。 ].ジオメトリがレンダリングされると、result01 と result02 の間のフレームごとにインデックスが更新されます。

ただし、メソッドは のみをサポートしnew THREE.Mesh(geometry, new THREE.MeshBasicMaterial({wireframe: false}));ます。の場合wireframe=true、ジオメトリのインデックスが更新されません。

それを最適化するwireframe=true方法

4

0 に答える 0