通过移动对象的X和Z位置,使沿Y轴移动的对象在某个点上保持静止

时间:2019-05-28 13:32:20

标签: c# unity3d

我需要照相机在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

如何通过代码计算要分配给对象在Y轴上给定点的位置的X和Z坐标,以便一个点保留在屏幕空间中的同一位置?

1 个答案:

答案 0 :(得分: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;
}