围绕globe three.js移动摄影机位置

围绕globe three.js移动摄影机位置,three.js,Three.js,尝试在three.js地球仪上重新定位相机时,我有一个国家列表,单击返回该国的lat和lon。我已经检查了这些,并且非常确定这就是传递给下面代码的内容。所以我点击国家,相机移动到新的位置,但它在地球表面的内部。它在正确的国家,所以我必须缩小。这是我正在使用的代码,地球半径保存在var globeRadius中(以防万一这不是很明显) 我猜我必须以某种方式将摄像机安装在地球上方的高度。这是我最初的相机设置 var FOV = 45; var NEAR = 2; var FAR = 4000

尝试在three.js地球仪上重新定位相机时,我有一个国家列表,单击返回该国的lat和lon。我已经检查了这些,并且非常确定这就是传递给下面代码的内容。所以我点击国家,相机移动到新的位置,但它在地球表面的内部。它在正确的国家,所以我必须缩小。这是我正在使用的代码,地球半径保存在var globeRadius中(以防万一这不是很明显)

我猜我必须以某种方式将摄像机安装在地球上方的高度。这是我最初的相机设置

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));

例如,是否需要先将宽度/高度添加到全局半径。如果有人能告诉我一个很好的过渡方法,这也会很有帮助,谢谢,这似乎是可行的,但如果有人告诉我它不正确,我将不胜感激

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

但是我想有人可以帮我做一个很好的过渡,这将是一个很好的过渡

这里有一个基本的平滑旋转+缩放过渡的想法。 具有参数设置功能:

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)可能是任何插值函数(这里我们在[0,1]中得到t,在[a,b]中得到期望值)


请记住,如果A,从A2*M\u PI-A最接近的方向是0,那么这个例子需要稍微修改一下。

感谢您的帮助,这真的很有用
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);
    }
}