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