Чтобы объект, движущийся вдоль оси Y, казался неподвижным в точке, перемещая его координаты X и Z - PullRequest
0 голосов
/ 28 мая 2019

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

enter image description here

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

enter image description here

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

enter image description here

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

1 Ответ

1 голос
/ 28 мая 2019

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

Перед перемещением объекта создайте 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...