【问题标题】:Rotating a sphere so that clicked point is Vector toward the camera旋转一个球体,使点击的点是朝向相机的向量
【发布时间】:2016-03-19 22:37:11
【问题描述】:

我搜索了这个问题的答案,发现两个答案要么是旧的,要么没有三个相关代码。

questionquestion

我想要发生的事情是让点击的点指向相机!

if (intersects.length > 0) {
    var point = intersects[0].point;
    //console.log(point);

    var a = new THREE.Vector3(0,0,1);
    var b = point.normalize();

    var rotationAxis = new THREE.Vector3(0, 0, 0);
    rotationAxis.crossVectors(b, a);
    var dot = a.dot(b);
    var angle = Math.acos(dot);

    var quaternion = new THREE.Quaternion();
    var dest = quaternion.setFromAxisAngle(rotationAxis, angle);
    sphere.setRotationFromQuaternion(dest);
}

更新:

我一直在尝试将数学从第一个答案转换为threejs,它几乎是在正确的地方,但在某种程度上,我哪里错了?

UPDATED JSFIDDLE HERE

初始位置 - 0,0,1

点击一个点后

【问题讨论】:

  • 我认为这可以通过使用lookAt函数来完成(假设你的球体默认朝向是+z)。从球心向您单击的点的方向看。
  • 那么在我看来,您的第二张照片按预期工作了吗?
  • 您正在寻找一个可以返回从 A 方向到 B 方向的旋转变化的函数吗?我有一些可能有用的东西。但它不是严格意义上的三。
  • 是的,这就是我在问题中的代码应该做的事情,它正在朝着正确的方向发展,但不够准确。我想使用四元数,以便我可以使用 slerp 制作动画。

标签: javascript three.js


【解决方案1】:

我认为您需要的是找到一个旋转,将您从中心到点击点的方向带到从中心到相机的方向。这里的一个实现:Finding quaternion representing the rotation from one vector to another

    var z = new THREE.Vector3(0, 0, 1);             
    var point = continent.position.clone().normalize();
    earthContainer.localToWorld(point.clone()));

    var q = new THREE.Quaternion();
    q.setFromUnitVectors(point, z);
    earthContainer.setRotationFromQuaternion(q);

事实证明,三个 js 确实将其实现为 q.setFromUnitVectors(u, v);。我更新了你的小提琴http://jsfiddle.net/6hfxng8n/4/,它几乎就是你链接到的第一个答案的答案。然而它几乎可以正常工作(稍微向右点击-> 球体向左旋转等)但有些东西是关闭的。我不知道为什么。

【讨论】:

  • 我不知道如何让 q.xyz 进入四元数。
  • q.x = a.x; q.y = a.y; q.z = a.z;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多