Компонент PointCloud создает пользовательские данные fetch() [response-three-fiber]

На основе фрагмента исходного r3f-примера, найденного в PointCloud.js

Протестированный мной, этот исходный компонент, показанный выше, может отображать облако точек, нажимая отдельные x y z значение в цикл for в Particle() функция.

Я изменил его и добавил метод `fetch()'для получения текстового файла пользовательских данных, фрагмент, как показано ниже,

...

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] во вложенном цикле могут возвращать правильные x а также z значение в консоли.

Текущая проблема заключается в том, что облако точек не отображается на <Canvas />

Проблема вызвана position.push()вложенный цикл находится внутри метода fetch ()? И как разрешить. Спасибо.

1 ответ

Лучше использовать const [state, set] = useState(), а затем использовать useEffect, вызывая "set", когда закончите. размещение запроса асинхронной выборки внутри useMemo - это практически побочный эффект в функции рендеринга, что нехорошо и не будет работать так.

Другие вопросы по тегам