Отражать объект по вертикальной оси в 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, но вы можете использовать любой из них)

он по-прежнему конвертируется в кватернион внутри, но его проще понять, где вы находитесь с точки зрения ротации, при использовании системы координат Эйлера

Другие вопросы по тегам