Основано на фрагменте исходного примера r3f, найденного в PointCloud. js
Протестированный мной выше, этот оригинальный компонент может визуализировать pointcloud, нажимая на отдельную кнопку x y z
значение в функции for-l oop in Particle()
.
Я изменил его и добавил метод fetch () для извлечения пользовательского txt-файла данных, фрагмент которого показан ниже,
...
export function Particles() {
const [positions, colors] = useMemo(() => {
let positions = [], colors = []
positions.length = 3
colors.length = 3
const HEADER_SIZE = 4;
let stream, longArray, len;
let clusterCount ;
let xy_size ;
let clusterSize = [];
let XY_arr = [];
fetch(map)
.then((r) => r.text())
.then(text => {
stream = text.toString().split("\n"); // split by next line
longArray = stream.slice(2,); // remove header from main longArray
len = longArray.length;
for (let i = 0, count = 0; i < len; i += HEADER_SIZE ) {
xy_size = longArray.slice((i + HEADER_SIZE - 1), (i + HEADER_SIZE));
XY_arr.push(longArray.slice((i + HEADER_SIZE ), (i + HEADER_SIZE + xy_size*2)));
console.log(" Points in PointCloud " + count + ": " + xy_size );
clusterSize.push(xy_size);
clusterCount = count;
i += xy_size*2;
count ++;
}
for (let i = 0; i < (clusterCount-2); i++) {
for (let j = 0; j < clusterSize[i]*2; j+=2) {
positions.push( XY_arr[i][j] )
positions.push(0)
positions.push( XY_arr[i][j+1] )
colors.push(1)
colors.push(0.5)
colors.push(0.5)
console.log( XY_arr[i][j] );
}
}
}
)
return [new Float32Array(positions), new Float32Array(colors)]
}, [])
...
...
, map
- это пользовательский текстовый файл в виде строки, с отдельными данными построчно
Метод fetch()
может считывать пользовательский файл pointcloud в XY_arr
как объект Array()
. Я проверил, что XY_arr[i][j]
в nested-forl oop могут возвращать правильные значения x
и z
в консоли.
В настоящее время проблема заключается в том, что pointcloud не отображается на <Canvas />
Является ли проблема, вызванная тем, что position.push()
nested l oop находится внутри метода fetch ()? И как решить. Спасибо.