使用 Three.js 将 3D 对象旋转到鼠标

Posted

技术标签:

【中文标题】使用 Three.js 将 3D 对象旋转到鼠标【英文标题】:Rotate 3D object to mouse with Three.js 【发布时间】:2012-02-20 01:58:27 【问题描述】:

我想在 3D 空间中旋转一个对象,使正面总是看向鼠标。

function onMouseMove(event)
             mouse3D = projector.unprojectVector(
                 new THREE.Vector3( event.clientX, event.clientY, 0.5 ), camera );


var angle = ??;
box.rotation.y = angle;

首先,非投影正确吗?其次如何计算角度?只是 tan(mouseX/mouseY) 吗?我正在尝试更多地了解 3D 数学,所以稍微解释一下就好了。

提前致谢。

【问题讨论】:

如何旋转?你有 3 个不同的轴可以旋转?以及您希望鼠标如何控制旋转? 这将视差效果提升到了一个新的水平……让鼠标决定嵌入对象的 3D 内容在鼠标指针上的“外观”。 +1 原创想法。 对于Parallax 伪3D 效果,看看这个example。 【参考方案1】:
// Direction we are already facing (without rotation)
var forward = new Vector3(0,0,-1);

// Direction we want to be facing (towards mouse pointer)
var target = new Vector3().sub(mouse3D, box.position).normalize();

// Axis and angle of rotation
var axis = new Vector3().cross(forward, target);
var sinAngle = axis.length(); // |u x v| = |u|*|v|*sin(a)
var cosAngle = forward.dot(target); // u . v = |u|*|v|*cos(a)
var angle = Math.atan2(sinAngle, cosAngle); // atan2(sin(a),cos(a)) = a
axis.normalize();

// Overwrite rotation
box.rotation.makeRotationAxis(axis, angle);

或者,您可以使用四元数:

// Overwrite rotation
box.useQuaternion = true;
box.quaternion.setFromAxisAngle(axis, angle);

【讨论】:

以上是关于使用 Three.js 将 3D 对象旋转到鼠标的主要内容,如果未能解决你的问题,请参考以下文章

three.js 2D 鼠标点击到 3d 坐标使用 raycaster

使用鼠标围绕中心旋转 Three.js 相机

Three.js 3D缩放到鼠标位置

在 THREE.js 中获取鼠标相对于 3D 空间的坐标

如何在轴 three.js 上旋转 3D 对象?

Three.js源码解读一:Object3D