Нужно повернуть вектор
У меня есть два вектора 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;
}
Ответы (1 шт):
В коде нет 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 его родительский, хотя и находится правее, складывая повороты координатных осей.

