Высокопроизводительная система координат - Three.js - PullRequest
0 голосов
/ 08 июня 2019

Концептуальный вопрос

Я создаю симулятор полета в Three.js. Я собираюсь скопировать данные CSV для широты, долготы и высоты из Google Earth и перенести их в arcGIS для создания цифровой модели высоты (DEM). Затем я хочу создать ландшафт на основе матрицы высот. У меня уже есть шейдер текстуры карты сплат, который я написал, и все выглядит хорошо.

Однако мне нужно будет добавить модели и, в частности, текстовые и посадочные зоны для городов. Это потребует точных координат XYZ.

Я полагаю, это интересная проблема. Я уже видел один вопрос в стеке, похожем на этот, но он был не совсем такой глубины, которую я ищу.


1) Как создать систему координат, которая отображает фактические данные XYZ, Широта, Долгота, Высота над уровнем моря в PlaneBufferGeometry?

Я предполагаю, что если я возьму гипотетический образец карты 100 000 x 100 000, то мне нужно будет создать самолет с соответствующим количеством вершин, а затем отобразить карты 1: 1.

new THREE.PlaneBufferGeometry( 100000, 100000, 100000, 100000 );

Тогда более сложная часть сопоставления длинных координат с этим. Может быть, просто множитель, как * 100 или около того на лат, длинные градусы?


2) Как создать наиболее эффективную структуру данных для этого. Он будет содержать много данных.

Я думаю, что наиболее эффективной структурой данных будет массив с Z целыми числами.

let vertArray = new Array(10000000000);

for (i = 0; i < 9999999999; i++) { 
  vertArray[i] = planeBufferGeometry.vertices[i].z;
}

Каждые 100 000 в массиве будут представлять координату Y, в то время как каждое значение i в указанных разделах будет координатой X. Значение координаты Z будет сохранено в самом массиве.

Так что гипотетически, если бы я хотел получить X: 3, Y: 4, Z:? это было бы ...

const xCoord = 3,
      yCoord = 4,
      index = (yCoord * 100000) + xCoord,
      zCoord = vertArray[index];

Это наименьшая нагрузка, которую я могу придумать ... определить длину массива заранее, сохранить массив одномерным, заполнить только целыми числами. Есть идеи получше? Возможно, создание массива было бы ненужным, и я мог бы создать уравнение, которое извлекает данные vert непосредственно из визуализированной сетки?


3) Существуют ли способы уменьшить влияние больших данных, хранящихся в памяти браузера?

Я еще не реализовал это, но идея массива длиной 10 миллионов в браузере довольно много в моей голове. Я предпочел бы иметь возможность загружать все это, а не делать какой-то вызов AJAX, когда вертолет приближается к краю подплана. Подумайте о «зонах» в MMORPG.

...