Поверните 3D-объект на мышь с Three.js - PullRequest
3 голосов
/ 27 января 2012

Я хочу повернуть объект в трехмерном пространстве, чтобы передняя сторона всегда смотрела на мышь.

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

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

Во-первых, правильное ли проецирование? А во вторых как рассчитать угол? Это просто загар (mouseX / mouseY)? Я пытаюсь углубиться в трехмерную математику, так что небольшое объяснение было бы неплохо.

Спасибо заранее.

1 Ответ

3 голосов
/ 10 июня 2012
// 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);
...