ループ関数で 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;
これが結果(前)です。
これが結果(後)です。
ジオメトリの頂点は不変ですが、ジオメトリ ( 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
方法