Javascript Three.js:orbitcontrols+camera tweens=偏移量

Javascript Three.js:orbitcontrols+camera tweens=偏移量,javascript,jquery,three.js,tween.js,Javascript,Jquery,Three.js,Tween.js,我有点发疯了,在寻找一个有效的互动组合。我基本上需要做一个谷歌地球风格的设置,你可以: 环绕对象,突出显示最中心的位置 单击菜单链接并设置对象旋转到特定“位置”(高亮显示新位置)的动画 我在第一个位置使用orbitcontrols,希望直接在菜单链接位置使用orbitcontrols,但无法让相机按正确的路径移动。所以我把相机放在一个物体内,当轨道控制装置操纵相机时,在物体上做粗花呢(“camHolder”) 所以有两个运动部件(凸轮由用户的鼠标控制,凸轮支架通过点击链接进入位置),当其中一个移

我有点发疯了,在寻找一个有效的互动组合。我基本上需要做一个谷歌地球风格的设置,你可以:

  • 环绕对象,突出显示最中心的位置
  • 单击菜单链接并设置对象旋转到特定“位置”(高亮显示新位置)的动画
  • 我在第一个位置使用orbitcontrols,希望直接在菜单链接位置使用orbitcontrols,但无法让相机按正确的路径移动。所以我把相机放在一个物体内,当轨道控制装置操纵相机时,在物体上做粗花呢(“camHolder”)

    所以有两个运动部件(凸轮由用户的鼠标控制,凸轮支架通过点击链接进入位置),当其中一个移动时,它们之间的旋转差会改变。为了突出显示这两个旋转值之间的右“点”,我需要跟踪这两个值之间的偏移。基本上(代码笔的简化版本):

    /----鼠标/摄像机交互---------
    //点的位置(弧度):
    var pointLongs=[-3,-2,-2.5,-2,-1.5,-1,-0.5,0,1,2,2.5,3];
    //最近突出显示的点(通过菜单单击):
    var currentPoint=5;
    //获取相机和当前点之间的差异(以弧度为单位)
    var pointDistance=pointLongs[currentPoint]-camera.rotation.y;
    //凸轮的偏移旋转(即最靠近前部的位置):
    var offset=摄像机旋转y+点距离;
    //在pointLongs数组中查找最接近的偏移值:
    var Nestest=pointLongs.reduce(函数(上一个,当前){
    返回值(算术绝对值(当前-偏移量)<算术绝对值(上一个-偏移量)?当前:上一个);
    });
    closestPointIndex=pointLongs.indexOf(最近的);
    //突出这一点(提高):
    scene.getObjectByName(pointNames[closestPointIndex]).position.y=20;
    
    只要pointDistance大于0,这似乎有效,但如果不是,当前“点”的跟踪仅在鼠标轨道圆的一部分工作,而它应该一直工作

    Codepen在此:(唯一的tween代码嵌入其中,因此跳过第一个块…)。试着用鼠标旋转形状,注意点并没有完全升起。单击“随机/下一步”菜单按钮,“间隔”将更改。。。有时,它确实会到处传播

    我尝试过改变几乎所有的值(点长所有正值;相机的初始旋转等),但我的数学通常很糟糕,我失去了直视的能力——有人有什么想法吗?请询问是否有什么不合理的地方

    我会加上“helpmewestlangley youremonlyhope”的标签,但我没有足够的声誉:d


    TLDR;物体和相机的旋转不会“同步”,需要纠正差异,或者可能找到一种方法来调整轨道控制装置的位置/旋转?

    我能做些什么来解决这个问题?如果有人有时间的话,我真的很感激:/所以现在我只是滥发我自己的帖子,这样我就有足够的声誉来评论其他人。。。这很有趣。我能做些什么来澄清这个问题?如果有人有时间的话,我真的很感激:/所以现在我只是滥发我自己的帖子,这样我就有足够的声誉来评论其他人。。。这很有趣。
    // -------  MOUSE/CAMERA INTERACTION ---------
    
    // location of points (in radians):
       var pointLongs=[-3,-2,-2.5,-2,-1.5,-1,-0.5,0,1,2,2.5,3];
    
    // most recent point highlighted (by menu click):
       var currentPoint = 5; 
    
    // get diff (in radians) between camera and current point
       var pointDistance = pointLongs[currentPoint] - camera.rotation.y;
    
    // the offset rotation of cam (i.e. whats closest to the front):
       var offset = camera.rotation.y + pointDistance;
    
    // find the closest value to offset in pointLongs array:
       var closest = pointLongs.reduce(function (prev, curr) {
         return (Math.abs(curr - offset) < Math.abs(prev - offset ) ? curr : prev);
       });
       closestPointIndex = pointLongs.indexOf(closest);
    
    // highlight that point (raise it up):
       scene.getObjectByName(pointNames[closestPointIndex]).position.y = 20;