Держите объект, движущийся вдоль оси Y, казаться неподвижным в точке, перемещая его положение X и Z

Мне нужно, чтобы камера увидела объект в исходном положении после перемещения его по оси Y. Я использую некоторые изображения, чтобы объяснить себя лучше. Это начальное положение объекта. Основная камера не будет менять положение. В координатах (0, 0, 0) есть еще одна камера, которую я использую для фонового изображения. Из этой же точки я провожу линии Гизмо.

Держите объект, движущийся вдоль оси Y, казаться неподвижным в точке, перемещая его положение X и Z

Теперь через свой редактор я перемещаю плоскость по оси Y от 0 до -2. Y моего объекта связан с Y плоскости, поэтому он также уменьшается на 2 единицы.

Держите объект, движущийся вдоль оси Y, казаться неподвижным в точке, перемещая его положение X и Z

Теперь наступает часть, которую я хотел бы автоматизировать. Я хочу переместить объект по осям X и Z так, чтобы его ноги казались камере так, как будто они находятся в одном и том же начальном положении. Вручную переместив его в представлении сцены по осям X и Z, я поместил ноги в место, которое выглядит как та же точка, что и раньше, и, конечно, оно меньше, поскольку находится дальше от камеры.

Держите объект, движущийся вдоль оси Y, казаться неподвижным в точке, перемещая его положение X и Z

Как я могу вычислить по коду координаты X и Z, которые будут присвоены положению моего объекта в заданной точке по оси Y, чтобы одна точка оставалась в том же положении в пространстве экрана?

Вы спрашиваете, как перемещать камеру сцены вместе с вашим объектом, или вы спрашиваете, как привязать плеер к определенной оси?

Eliasar 28.05.2019 15:59

Привет @ Элиасар, нет, камера всегда останавливается на одних и тех же координатах. Я перемещаю невидимую Плоскость (под ногами персонажа) по оси Y, и персонаж следует за Плоскостью. Но что мне нужно, так это то, что пока персонаж следует за Плоскостью по оси Y, он остается в том же положении по отношению к камере. Для этого мне нужно обновить оси X и Z персонажа, пока он перемещается по оси Y, получить правильный Vector3 и назначить его персонажу.

valter 28.05.2019 16:12

Короче говоря, мне нужно, чтобы персонаж всегда появлялся в центре желтого круга, а также перемещал его по оси Y.

valter 28.05.2019 16:18

Использовать Physics.Raycast?

Draco18s no longer trusts SE 28.05.2019 16:58

Я не понимаю, какой должен быть желаемый эффект. Если вы хотите, чтобы ваша камера удерживала игрока в одном и том же месте, вы можете передать камеру игроку. Вы также можете использовать скрипт на камере для отслеживания игрока (который будет перемещать камеру).

Eliasar 28.05.2019 17:06

@Eliasar Eliasar Я отредактировал сообщение, чтобы оно было более понятным.

Ruzihm 28.05.2019 18:49

Я не думаю, что этот вопрос заслуживает отрицательного голоса. Это было понятно, особенно после доработок @Ruzihm, которые улучшили экспозицию и не касались тривиальных вещей. Тот факт, что не было кода, не доказывает, что не было предпринято никаких усилий, чтобы выяснить, как решить проблему, а скорее то, что не было никаких идей для этого. Просто посмотрите на мои предыдущие сообщения, полные примеров кода. На мой взгляд, голосование против - это плохая практика, которую следует использовать только для исключительных событий, а лучше вознаграждать тех, кто предлагает свое время, чтобы помочь другим.

valter 29.05.2019 12:58
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
7
129
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете использовать лучи и плоскости, чтобы вычислить это.

Перед тем, как объект переместится, создайте Ray от камеры к точке на объекте, которую нужно удерживать в том же положении:

// Where the "feet" are relative to the object's origin
public Vector3 cameraKeepOffset = new Vector3(0f,-1f,0f); 

public Ray perspectiveRay;

...

Vector3 positionToKeep = transform.position + cameraKeepOffset;
Vector3 cameraPosition = Camera.main.transform.position;

perspectiveRay = new Ray(cameraPosition, positionToKeep - cameraPosition);

Идея состоит в том, что всякий раз, когда объект перемещается, найдите, где вдоль этого луча его можно разместить. Если мы поместим горизонтальную плоскость в положение y, везде, где луч пересекает эту плоскость, находится место, где должен быть размещен объект.

Итак, когда объект движется, создайте Plane, где находится смещение, найдите, где perspectiveRay пересекает его, затем переместите объект так, чтобы его смещение было в этой точке:

Plane yPlane = new Plane(Vector3.up, cameraKeepOffset + transform.position);
float distanceFromCam;
if ( !Raycast(perspectiveRay, out distanceFromCam)) {
    Debug.log("Camera is not pointing at plane");

    // Handle bugs here, return if necessary, etc.
} else {
    Vector3 intersectionPoint = Ray.GetPoint(distanceFromCam);
    transform.position = intersectionPoint - cameraKeepOffset;
}

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