Рассчитать вектор поворота объекта на произвольной оси (ThreeJS) - PullRequest
0 голосов
/ 07 июня 2018

У меня проблемы с поиском абсолютного вращения моего объекта на произвольной оси.

До сих пор я был в состоянии получить относительное вращение моего объекта.Чтобы получить относительное вращение, я поместил плоскость позади объекта, который обращен к выбранной оси.Благодаря радиопередаче на этой плоскости я могу получить трехмерные координаты для вычисления угла, используя atan2.

Код для получения относительного поворота моего объекта:

let planeCrossObjectDir = planeNormal.clone().cross(this.objectUpDirection).normalize();
let projectedPoint = new THREE.Vector3();
rayPlane.projectPoint(intersection.point, projectedPoint);
let centerProjected = new THREE.Vector3();
rayPlane.projectPoint(this.raycastPlane.position, centerProjected);

let u1 = this.objectUpDirection.dot(projectedPoint);
let v1 = planeCrossObjectDir.dot(projectedPoint);
let u2 =  this.objectUpDirection.dot(centerProjected);
let dotv2 = planeCrossObjectDir.dot(centerProjected);

let uvCoord = new THREE.Vector2(u1, v1).sub(new THREE.Vector2(u2, dotv2));

var theta = Math.atan2(uvCoord.y, uvCoord.x); // range [-PI, PI]
theta *= 180 / Math.PI; // range [-180, 180]
if (theta < 0) theta = 360 + theta; // range [0, 360]
let objectsRotation = Math.round(360 - theta); // invert rotation

Iхочу сделать тот же принцип для вычисления абсолютного вращения, изменив planeCrossObjectDir и используя мировой UP-вектор плоскости вместо this.objectUpDirection.

Проблема, однако, такова: я не знаю, какчтобы вычислить это ..

Я сделал рисунок, чтобы упростить вещи / разъяснения: World Up-vector of plane

1 Ответ

0 голосов
/ 07 июня 2018

Я думаю, что вы проделали долгий путь.Свойство matrixWorld вашего объекта должно содержать окончательные мировые значения, включая положение, вращение и масштаб.Вы можете получить компонент вращения двумя различными способами:

в виде матрицы:

var rotationMatrix = new THREE.Matrix4().extractRotation(yourObject.matrixWorld);
// rotationMatrix will now contains the rotation component of your object's world matrix

в качестве кватерниона:

var position = new THREE.Vector3();
var quaternion = new THREE.Quaternion();
var scale = new THREE.Vector3();
yourObject.matrixWorld.decompose(position, quaternion, scale);
// quaternion now contains your object's world rotation as a quaternion

Применить к восходящему вектору:

Затем вы можете обновить повышающий вектор в зависимости от используемого вами метода:

var up1 = new THREE.Vector3(0, 1, 0).applyMatrix4(rotationMatrix).normalize();

или

var up2 = new THREE.Vector3(0, 1, 0).applyQuaternion(quaternion).normalize();

Если вы попробуете оба пути, вы увидите, что они достигают одного и того же результата (в пределах разумного для JavaScript).

Если у вас есть вопросы или я неправильно понял ваш вопрос, оставьтекомментарий.

...