2016-08-30 1 views
0

Я хочу, чтобы формула давала n-вектор (перпендикулярный к глобусу) от широты и долготы в сцене three.js. Мой код в настоящее время следующие, на основе списка городов (в таблице под названием «WUP»):Формула n-вектора из широты и долготы с объектами three.js

var conegeometry = new THREE.CylinderGeometry(0, 10, 10, 500, false); 
var earthRadius = 6371; // kilometres 
var réduc = 0.02; 
for (var iter=1;iter<1693;iter++){ 
    var cone = new THREE.Mesh(conegeometry, conematerial); 
    var lat = wup[iter].Latitude*Math.PI/180; 
    var lon = wup[iter].Longitude*Math.PI/180; 
    cone.position.set (
     earthRadius * réduc * Math.cos(lat) * Math.cos(lon), 
     earthRadius * réduc * Math.cos(lat) * Math.sin(lon), 
     earthRadius * réduc * Math.sin(lat)); 
    cone.rotation.set (
     Math.sin(lat), 
     Math.cos(lat) * Math.sin(lon), 
     -Math.cos(lat) * Math.cos(lon)); 

    scene.add(cone); 
} 

Формулы приходят из this article, p 402.

Моя цель состоит в том, чтобы все города были представлены в виде конусов с верхом в положении лат/лон, а остальные ниже поверхности земли и перпендикулярно поверхности земли (упрощенной как сфера). Широта и долгота поступают из набора данных городов ООН, кажутся очень чистыми и классическими по степеням.

Santiago Del Estero -27,79511 -64,26149 
Yerevan    40,181998 44,514619 
Adelaide   -34,92866 138,59863 

Но что-то не так в формулах вращения, и я не могу найти правильную настройку. Есть идеи?

+0

Я попробовал инструкцию нашел [здесь] (http://www.smartjava.org/content/render-open-data-3d-world-globe-threejs), 'cone.lookAt (новый THREE.Vector3 (0,0,0)); который должен означать центр земного шара, но он не работает, конусы не выглядят в правильном направлении, они показывают свою сторону в центр земного шара :( –

ответ

0

Я нашел решение, намного проще, чем моя первоначальная идея. На основании this project и этого примера при использовании инструкции lookAt, которая позволяет избежать осложнений тригонометрических формул.

Я также нашел, что мои формулы для lat/lon к x, y, z, где они неправильны, и не соответствуют формулам, используемым в проекте shp.js, который я также использую.

Объекты могут быть установлены напротив данной точки, здесь находится центр земли. Но тогда конусы являются цилиндрами и должны по какой-то причине я не совсем понимаю, что это будет PI/2. Таким образом, это сработало:

 var lat = wup[iter].Latitude*Math.PI/180; 
    var lon = - wup[iter].Longitude*Math.PI/180; 

    cone.position.set (
      Math.cos(lon) * 90 * Math.cos(lat), 
      Math.sin(lat) * 90, 
      Math.sin(lon) * 90 * Math.cos(lat) 
      ); 
    cone.lookAt(new THREE.Vector3(0,0,0)); //orientate the cone to the center of earth 
    cone.translateZ(- earthRadius * réduc); //to follow the genral contraction 
    cone.translateZ(coneHeight/2); //to put the top edge at lat/lon position 
    cone.rotateX(- Math.PI/2); //because cylinders.cones are drawn horizontally 
0

Вам нужно исправить две вещи: расчет положения и расчет вращения.

Должность: Географическая система координат левая (долгота растет к востоку). Three.js использует правую систему координат (долгота растет к западу). Поэтому значение долготы должно быть инвертировано в вашей геометрии. Кроме того, формулы, которые вы нашли, работают для координат с направлением оси Z. Three.js имеет направленную ось Y. Поэтому вам нужно поменять формулы z и y. Это правильный код позиции:

var lat = wup[iter].Latitude*Math.PI/180; 
    var lon = - wup[iter].Longitude*Math.PI/180; 

    cone.position.set (
     earthRadius * réduc * Math.cos(lat) * Math.cos(lon), 
     earthRadius * réduc * Math.sin(lat), 
     earthRadius * réduc * Math.cos(lat) * Math.sin(lon)); 

Вращение: Вам просто нужно повернуть конус их долготы/широты (не синусов и косинусов)

cone.rotation.set (0, -lon, - Math.PI/2 + lat); 
Смежные вопросы