2016-01-13 5 views
1

У меня есть камера, которую я хочу перемещать по двум осям (x и z). В локальном пространстве мы имеем:Перемещение камеры по двум осям в WorldSpace

enter image description here

И поскольку объект камера поворачивается, в мировом пространстве мы имеем:

enter image description here

То, что я хочу достичь, это: для перемещения камеры вдоль 2 оси через пользовательский вход - камера смотрит на плоскость сверху и с помощью кнопок клавиатуры пользователь может скользить по плоскости в 4 плоских направлениях. Это прекрасно работает, манипулируя transform.position.x и transform.position.y Недвижимость в местное пространство.

У меня есть следующая проблема: пользователь может также поворачивать объект камеры. Поступая таким образом, я не могу больше управлять преобразование локального пространства, так как при определенных оборотах «вверх» начинает означать «вниз» и т.д.

я попытался сделать следующее в мировом пространстве:

transform.Translate(transform.right * user_input, Space.World); 

Но это не достигает того, что я хочу, так как transform.right захватывает красный вектор в мировом пространстве.

Что я хочу сделать: переместите камеру вдоль красных и синих векторов в локальное пространство, но сохраните координаты в мировом пространстве.

Я был бы признателен, если предоставит вам часть материалов. Огромное спасибо!

ответ

6

Не совсем понятно, что вы говорите.

Но очень распространенная вещь:

Просто есть объект держатель. Если хотите, возможно, подумайте об этом как о «фотоаппарате». Держите этот «квадрат» в любое время и перемещайте его. Затем сделайте камеру как ребенок этого объекта.

Затем вы можете повернуть (или что бы вы ни делали) дочерний объект. Когда вы хотите «чистое» движение, вы можете переместить объект «держатель».

Это чрезвычайно распространено, почти неизбежно, для этого в Единстве.

Снова я не знаю, что вы просите :), но, надеюсь, это решает проблему. более


одно: это возможно вы имеете в виду вы хотите, чтобы пользователь, чтобы переместить объект вокруг, но объект всегда остается на земле. Если это то, что вы имеете в виду, один из подходов заключается в следующем: просто заставьте мировую позицию z быть нулевой в конце каждого кадра (то есть добавив строку кода в ваше обновление). Это довольно часто, и это поможет вам. Альтернативно, если вы используете Rigidbody, вам будет приятно узнать, что в инспекторе есть буквальный переключатель выбора флажка для ограничения движения по различным осям.

+0

Вот что бы я сделал. –

+0

Я использовал это в 3D-анимации и Unity, чтобы иметь возможность легко изолировать преобразования на камерах, поэтому я полностью одобряю этот подход. – Serlite

+0

Да, это одна из тех странных вещей, которые они «не упоминают в руководстве». Вы делаете это повсюду и всегда в видеоиграх с использованием игровых движков, таких как Unity, но это никогда не «объясняется» нигде. Я часто думал, что Unity должно по своей сути встроить концепцию вложенных игровых объектов, поскольку она вездесуща, возможно, по умолчанию на камерах. В любом случае. «Как бы то ни было, наш хороший ОП пытается достичь, это, вероятно, будет частью решения! – Fattie