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

标签 math mouse rotation three.js

我想在 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 数学,所以稍微解释一下就好了。

提前致谢。

最佳答案

// 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);

关于math - 使用 Three.js 将 3D 对象旋转到鼠标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9027196/

相关文章:

perl - 如何解决 Perl 中的一组约束?

excel - 如何使用格式化指数和分数的 oMaths 创建 Word VBA 方程?

python - python 中的数值方法 - 无法发现问题?

c++ - 如何在多个窗口中同时模拟鼠标移动?

c++ - 四元数基变换

ios - 按照用户方向旋转 collectionView

c - C中的十六进制算术

java - 拖动 JPanel

具有多重背景的Javascript鼠标光标圆圈效果

c# - 从欧拉旋转转换为四元数旋转