На данный момент я использую скалярное произведение положения мыши и (0, 1), чтобы генерировать радианы для поворота объекта в three.js
Код ниже, работает нормально, но объект «прыгает», потому что угол в радианах переходит с положительного на отрицательный, когда значение clientX
находится между window.innerWidth / 2
onDocumentMouseMove : function(event) {
// rotate circle relative to current mouse pos
var oldPos = new THREE.Vector2(0, 1);
Template.Main.mouseCurrPos = new THREE.Vector2((event.clientX / window.innerWidth ) * 2 - 1, - (event.clientY / window.innerHeight) * 2 + 1);
Template.Main.mouseCurrPos.normalize();
//Template.Main.projector.unprojectVector(Template.Main.mouseCurrPos, Template.Main.scene);
var angle = oldPos.dot(Template.Main.mouseCurrPos);
Template.Main.mousePrevPos.x = event.clientX;
Template.Main.mousePrevPos.y = event.clientY;
if (event.clientX < window.innerWidth / 2) {
Template.Main.circle.rotation.z = -angle;
}
else {
Template.Main.circle.rotation.z = angle;
}
console.log(Template.Main.circle.rotation.z);
}
Однако, если я добавлю это, чтобы присвоить значение oldPos:
if (event.clientX < window.innerWidth / 2) {
oldPos = new THREE.Vector2(0, -1);
}
else {
oldPos = new THREE.Vector2(0, 1);
}
Затем «прыжок» идет, но эффект вращения инвертируется, когда мышь находится слева от окна.
Т.е. мышь, поднимающаяся вверх, вращается против часовой стрелки и наоборот, что нежелательно.
Это расстраивает.
Также, если я сохраню условное присваивание oldPos и вместо этого опущу условное отрицание угла, прыжок вернется.
Вы можете увидеть демонстрацию здесь: http://theworldmoves.me/rotation-demo/
Большое спасибо за любые советы.