2015-09-30 3 views
0

Попытка изменить положение камеры на земном шаре three.js У меня есть список стран, которые при нажатии на кнопку возвращают страну lat и lon. Я проверил их, и я уверен, что это то, что передается в код ниже. Поэтому я нажимаю на страну, и камера перемещается в новое положение, но она находится внутри поверхности земного шара. Это под правильной страной, поэтому мне приходится уменьшать масштаб. Это код, который я использую радиус земного шара, хранится в var globeRadius (на всякий случай это было не совсем очевидно).перемещение положения камеры вокруг земного шара three.js

console.log(cameraTarget[0].lat,cameraTarget[0].lon) 

    var phi = cameraTarget[0].lat * Math.PI/180; 
    var theta = (cameraTarget[0].lon + 90) * Math.PI/180; 
    posX = globeRadius * Math.cos(phi) * Math.sin(theta); 
    posY = globeRadius * Math.sin(phi); 
    posZ = globeRadius * Math.cos(phi) * Math.cos(theta); 
    camera.position.set(posX,posY,posZ); 

    camera.lookAt(new THREE.Vector3(0,0,0)); 

Я догадываюсь, что мне нужно каким-то образом включить высоту камер над землей. Это мои первоначальные настройки камеры.

var FOV = 45; 
    var NEAR = 2; 
    var FAR = 4000; 

    // setup a camera that points to the center 
    var camera = new THREE.PerspectiveCamera(FOV,width/height,NEAR,FAR); 
    camera.position.set(posX,posY,posZ); 
    camera.lookAt(new THREE.Vector3(0,0,0)); 

Нужно ли сначала добавить ширину/высоту к globalradius, например. Если кто-нибудь может сказать мне хороший метод перехода, который был бы полезен также, благодаря

ответ

0

Представьте себе базовые плавное вращение + зум переход. Наличие функции для настройки параметров:

let perf: Performance = window.performance; 
// init other necessary variables 

var initTransition = function (longitude, latitude, animationTime, radius) { 
    beginTime = perf.now(); 
    animTime = animationTime * 1000; 

    beginPhi = Config.Phi; 
    beginThetta = Config.Thetta; 
    beginZoomRadius = Config.ZoomRadius; 

    targetPhi = latitude * Math.PI/180; 
    targetThetta = (longitude + 90) * Math.PI/180; 
    targetZoomRadius = radius; 

    needsTransitionAnim = true; 
} 

выполнить что-то подобное, что в цикле обновления:

update() { 
/* stuff */ 

computeCurrentCameraPos(); 
setCameraPosFromConfig(); 
} 

где computeCurrentCameraPos является:

var computeCurrentCameraPos = function() { 
if (needsTransitionAnim) { 
    t = (perf.now() - beginTime)/speedTime; 
    if (t > 1) { 
     t = 1; 
     needsTransitionAnim = false; 
    } 

    Config.Phi = blendFunc (beginPhi, targetPhi, t); 
    Config.Thetta = blendFunc (beginThetta, targetThetta, t); 
    Config.ZoomRadius = blendFunc (beginZoomRadius, targetZoomRadius, t); 
    } 
} 

и setCameraPosFromConfig является само- пояснительная. blendFunc (a, b, t) может быть любой функцией интерполяции (здесь мы получили t в [0,1] и ожидаем значение в [a, b]).

Имейте в виду, что, учитывая ориентацию ближайший путь от к 2 * M_PI - A лежит через 0, если < M_PI/2, поэтому этот пример должен быть слегка изменен.

0

Это похоже на работу, но я оценил бы кто-нибудь говорит мне его не правильно

posX = (globeRadius+1200) * Math.cos(phi) * Math.sin(theta); 
posY = (globeRadius+1200) * Math.sin(phi); 
posZ = (globeRadius+1200) * Math.cos(phi) * Math.cos(theta); 

Но идентификатор кто-то может Хель меня хороший переход, который был бы отличным

+0

Спасибо за помощь, которая действительно полезная –

Смежные вопросы