Отражать объект по вертикальной оси в Unity?
Когда в Unity я хочу симметрично отразить преобразование вдоль оси x, для многих фигур это работает нормально:
reflection.localRotation = new Quaternion(
original.localRotation.x * -1f,
original.localRotation.y,
original.localRotation.z,
original.localRotation.w * -1f
);
reflection.localPosition = new Vector3(
original.localPosition.x * -1f,
original.localPosition.y,
original.localPosition.z
);
Но каков будет код для зеркального отображения вдоль оси y? А что за зеркало по оси Z? Позиционирующая часть проста, но меня интересует кватернионная часть. Спасибо!
2 ответа
В 3d вы не зеркально отражаете ось, а плоскость.
На форуме Unity есть ветка по этому поводу. Одно из решений предлагает способ поворота не только для определенных плоскостей, выровненных по оси, но и для любой зеркальной плоскости, представленной нормалью.
var objectQuat = transform.rotation;
var plane = GetMirrorPlane(); // choose yours here
var mirrorNormalQuat = new Quaternion(plane.x, plane.y, plane.z, 0);
var reflectedQuat = mirrorNormalQuat * objectQuat * mirrorNormalQuat;
transform.rotation = reflectedQuat;
Изменение кватерниона вручную (рассматривая его как обычный Vector4), как вы, не даст вам правильных результатов. Вам будет гораздо лучше изменить transform.eulerAngles (и, поскольку вы хотите отразить по глобальной оси, я бы предположил, что eulerAngles будет более подходящим, чем localEulerAngles, но вы можете использовать любой из них)
он по-прежнему конвертируется в кватернион внутри, но его проще понять, где вы находитесь с точки зрения ротации, при использовании системы координат Эйлера