Я использую SplineCurve3 для построения линии только по осям X и Y, у меня есть куб, успешно анимированный вдоль этой линии, используя spline.getPoint(t)
, где t равно 0-1 по времени. Я пытаюсь сориентировать куб к линии с помощью его вектора вверх, который равен Y, с использованием точечного произведения.
Он почти выровнен, но немного выходит наружу. Я подумал, что буду использовать скалярное произведение вектора Y и тангенса текущей точки в качестве угла для поворота кватерниона.
Вот моя функция рендеринга:
function render() {
var updateMatrix = new THREE.Matrix4();
updateMatrix.setPosition(spline.getPoint(t));
var angle = new THREE.Vector3(0,1,0).dot(spline.getTangent(t).normalize());
var quat = new THREE.Quaternion;
quat.setFromAxisAngle(new THREE.Vector3(0,0,1), angle);
updateMatrix.setRotationFromQuaternion(quat);
marker.rotation.getRotationFromMatrix(updateMatrix);
marker.matrixWorld = updateMatrix;
t = (t >= 1) ? 0 : t += 0.002;
renderer.render(scene, camera);
}
И вот скрипка, демонстрирующая мою проблему, может ли кто-нибудь сказать мне, где я ошибаюсь с аспектом вращения?
Вы можете редактировать мой - пример jsfiddle
code obj.position.copy(spline.getPoint( t )); obj.lookAt(spline.getTangent( t ).add(obj.position));
- person manthrax   schedule 08.09.2016