Я знаю, что есть миллион вопросов о вращении, я пробовал и читал много вещей, но, похоже, не могу решить эту конкретную проблему.
Единственный способ, которым я могу придумать, чтобы объяснить это должным образом, - это с некоторыми плохо нарисованными диаграммами, так что вот!
У меня есть родительский объект и дочерний объект (здесь он представлен в виде кубика, где сумма противоположных граней составляет 7), оси на этой диаграмме - это родительские направления X, Y и Z.
Отправная точка:
Я хочу, чтобы дочерний объект имел два метода, которые я назову RotateZ
и RotateX
. RotateZ
и RotateX
должны вращать дочерние кубики вокруг родительских осей Z и X с шагом 90 градусов.
ПовернутьX:
Повернуть Z:
Код, который у меня сейчас есть, это
void RotateZ(int value) {
transform.rotation *= Quaternion.AngleAxis(90f * value, pivot.transform.forward);
}
void RotateX(int value) {
transform.rotation *= Quaternion.AngleAxis(90f * value, pivot.transform.right);
}
Я должен отметить, что пивот является родительским объектом
Похоже, это отлично работает, если дочерний элемент начинает с поворота (0, 0, 0)
, многократный вызов RotateZ
или RotateX
с начальной точкой (0, 0, 0)
отлично работает. Эта проблема возникает, если, например, я звоню RotateX
, а затем RotateZ
.
После начального вызова RotateX
он будет выглядеть так, давая дочернему элементу поворот на (90, 0, 0)
.
Затем после RotateZ
желаемый результат таков:
Но вместо этого я получаю следующее:
Я действительно в недоумении, что я делаю неправильно. У меня такое чувство, что я достиг предела того, что я могу делать с углами Эйлера, и мне нужно выучить кватернионы, чтобы предотвратить эту проблему. Какая функция вращения мне нужна, чтобы получить желаемый результат?