【问题标题】:Rotating a sphere to a specific point. Not the camera将球体旋转到特定点。不是相机
【发布时间】:2016-02-28 20:13:22
【问题描述】:

我需要一些帮助。

我已经搜索并找不到解决方案,因为所有解决方案都是关于围绕球体旋转相机。

就我而言,相机是静止的。我有一个使用纬度和经度的 webgl 地球仪。我只想单击一个点并旋转地球网格,使其居中该点。

我有 Vector3 点,它是纬度和经度,但我不知道该怎么做。

周围有人可以帮助我吗?或者知道这样的例子吗?

提前谢谢你

【问题讨论】:

    标签: three.js


    【解决方案1】:

    要旋转球体以匹配相机中心的纬度/经度,您可以这样做:

    var verticalOffset = 0.1;
    sphere.rotation.x = latitude * ( Math.PI / 180 ) - verticalOffset;
    sphere.rotation.y = ( 270 - longitude ) * ( Math.PI / 180 );
    

    那么你可以用补间来调用它:

    var tween = new TWEEN.Tween(sphere.rotation)
        .to({ x: latitude * ( Math.PI / 180 ) - verticalOffset, y: ( 270 - longitude ) * ( Math.PI / 180 ) }, 2000)
        .start();
    

    我创建了一个 jsfiddle 来演示这一点,其中在 Lissabon 设置了一个标记:

    http://jsfiddle.net/L0rdzbej/208/


    更新

    如果球体旋转了很多,Y 旋转值会上升。然后按照上面的建议补间旋转会导致大量反向旋转,直到该点显示在相机中心。

    为避免这种情况,可以通过 四元数 设置旋转。补间必须使用时间四元数进行处理。 出于演示目的,我将球体的初始 Y 旋转设置为 PI * 12.1,然后应用四元数。

    http://jsfiddle.net/L0rdzbej/217/

    var phi = latitude * Math.PI / 180;
    var theta = ( 270 - longitude) * Math.PI / 180;
    var euler = new THREE.Euler(phi, theta, 0, 'XYZ');
    
    // rotation (using slerp)  
    var qstart = new THREE.Quaternion().copy(sphere.quaternion); // src quaternion
    var qend = new THREE.Quaternion().setFromEuler(euler); //dst quaternion
    var qtemp = new THREE.Quaternion();
    
    var o = {t: 0};
    new TWEEN.Tween(o).to({t: 1}, 2500)
          .onUpdate(function () {
            THREE.Quaternion.slerp(qstart, qend, qtemp, o.t);
            sphere.quaternion.copy( qtemp );
          })
          .start();
    

    【讨论】:

    • 您需要在您的小提琴中更改 TWEEN 库的路径,使用正确的 CDN 路径
    • 发现伦敦 OK - +1
    • 感谢一百万福克。我不得不对我的项目进行一些更改,但数学是正确的并且有很大帮助。现在我只需要弄清楚这个变化带来的另一个问题,也许我会回到这里:) 再次感谢。完美的答案。
    • 酷,我很高兴你们两个喜欢它!请通过接受此答案将您的问题标记为已解决并帮助其他人:-)
    • 好的,现在问题来了。除了单击点并将球体旋转到该点之外,我还用鼠标旋转球体,所以如果我将球体旋转 4 次,旋转的距离应该考虑到这一点,而不必再旋转 4 次。我解释对了吗?
    猜你喜欢
    • 1970-01-01
    • 2016-03-19
    • 1970-01-01
    • 1970-01-01
    • 2019-07-12
    • 2016-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多