Мне нужно, чтобы камера увидела объект в исходном положении после перемещения его по оси Y. Я использую некоторые изображения, чтобы объяснить себя лучше. Это начальное положение объекта. Основная камера не будет менять положение. В координатах (0, 0, 0) есть еще одна камера, которую я использую для фонового изображения. Из этой же точки я провожу линии Гизмо.
Теперь через свой редактор я перемещаю плоскость по оси Y от 0 до -2. Y моего объекта связан с Y плоскости, поэтому он также уменьшается на 2 единицы.
Теперь наступает часть, которую я хотел бы автоматизировать. Я хочу переместить объект по осям X и Z так, чтобы его ноги казались камере так, как будто они находятся в одном и том же начальном положении. Вручную переместив его в представлении сцены по осям X и Z, я поместил ноги в место, которое выглядит как та же точка, что и раньше, и, конечно, оно меньше, поскольку находится дальше от камеры.
Как я могу вычислить по коду координаты X и Z, которые будут присвоены положению моего объекта в заданной точке по оси Y, чтобы одна точка оставалась в том же положении в пространстве экрана?
Привет @ Элиасар, нет, камера всегда останавливается на одних и тех же координатах. Я перемещаю невидимую Плоскость (под ногами персонажа) по оси Y, и персонаж следует за Плоскостью. Но что мне нужно, так это то, что пока персонаж следует за Плоскостью по оси Y, он остается в том же положении по отношению к камере. Для этого мне нужно обновить оси X и Z персонажа, пока он перемещается по оси Y, получить правильный Vector3 и назначить его персонажу.
Короче говоря, мне нужно, чтобы персонаж всегда появлялся в центре желтого круга, а также перемещал его по оси Y.
Использовать Physics.Raycast?
Я не понимаю, какой должен быть желаемый эффект. Если вы хотите, чтобы ваша камера удерживала игрока в одном и том же месте, вы можете передать камеру игроку. Вы также можете использовать скрипт на камере для отслеживания игрока (который будет перемещать камеру).
@Eliasar Eliasar Я отредактировал сообщение, чтобы оно было более понятным.
Я не думаю, что этот вопрос заслуживает отрицательного голоса. Это было понятно, особенно после доработок @Ruzihm, которые улучшили экспозицию и не касались тривиальных вещей. Тот факт, что не было кода, не доказывает, что не было предпринято никаких усилий, чтобы выяснить, как решить проблему, а скорее то, что не было никаких идей для этого. Просто посмотрите на мои предыдущие сообщения, полные примеров кода. На мой взгляд, голосование против - это плохая практика, которую следует использовать только для исключительных событий, а лучше вознаграждать тех, кто предлагает свое время, чтобы помочь другим.
Вы можете использовать лучи и плоскости, чтобы вычислить это.
Перед тем, как объект переместится, создайте 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;
}
Вы спрашиваете, как перемещать камеру сцены вместе с вашим объектом, или вы спрашиваете, как привязать плеер к определенной оси?