Нужно повернуть вектор

У меня есть два вектора a и b в трехмерном пространстве. Мне нужно повернуть вектор b на угол равный углу наклона вектора a (как на картинке). Координаты векторов я знаю. В 2д у меня код работает, а в 3д нет. Я поворачиваю вектор с помощью этого кода. Есть ли другие способы решения задачи или в чем у меня может быть ошибка?

private Vector3 RotateXY(Vector3 vector, float angle)
    {
        Vector3 pos = new Vector3(
            vector.x * Mathf.Cos(angle) - vector.y * Mathf.Sin(angle),
            vector.x * Mathf.Sin(angle) + vector.y * Mathf.Cos(angle),
            vector.z);

        return pos;
    }

    private Vector3 RotateXZ(Vector3 vector, float angle)
    {
        Vector3 pos = new Vector3(
            vector.x * Mathf.Cos(angle) - vector.z * Mathf.Sin(angle),
            vector.y,
            vector.x * Mathf.Sin(angle) + vector.z * Mathf.Cos(angle));

        return pos;
    }

    private Vector3 RotateYZ(Vector3 vector, float angle)
    {
        Vector3 pos = new Vector3(
            vector.x,
            vector.y * Mathf.Cos(angle) - vector.z * Mathf.Sin(angle),
            vector.y * Mathf.Sin(angle) + vector.z * Mathf.Cos(angle));

        return pos;
    }

2 вектора


Ответы (1 шт):

Автор решения: Yaroslav

В коде нет vectorA и vectorB, там только vector и angle!

(как на картинке)... на какой? Вангую, что типа такой: введите сюда описание изображения

Для 2D метод выглядит так:

public Vector2 GetRotationVector (Vector2 target, Vector2 axis)
{
    axis.Normalize();
    return new Vector2(
        target.x * axis.x - target.y * axis.y, 
        target.x * axis.y + target.y * axis.x);
}

Но для вращения вектора относительно оси в 3D, перемножаются их кватернионы:

public class Foo : MonoBehaviour
{
    [SerializeField] private Transform _axis;
    [SerializeField] private Vector3 _rotation = new Vector3(360, 0, 0);
    private Vector3 _target;

    private void Update ()
    {
        _target += _rotation * Time.deltaTime;
        transform.eulerAngles = GetRotationVector(_target, _axis.eulerAngles);
    }

    public Vector3 GetRotationVector (Vector3 target, Vector3 axis)
    {
        Quaternion targetQ = Quaternion.Euler(target);
        Quaternion axisQ = Quaternion.Euler(axis);
        Quaternion result = axisQ * targetQ;
        return result.eulerAngles;
    }
}

Cube Purple вращаясь с скоростью _rotation, словно transform Cube Green его родительский, хотя и находится правее, складывая повороты координатных осей. введите сюда описание изображения

→ Ссылка