我需要照相机在Y轴上移动物体后才能在初始位置看到该物体。 我用一些图像更好地解释自己。 这是对象的初始位置。主相机不会改变位置。在坐标(0,0,0)处,还有另一台相机用于背景图像。从同一点开始,我绘制了Gizmo线。
现在,通过我的编辑器,我将Y轴上的平面从0移动到-2。我对象的Y链接到平面的Y,所以它也下降了2个单位。
现在是我想自动化的部分。我想沿X轴和Z轴移动对象,以便其脚在相机中看起来就像它们处于相同的初始位置一样。通过在X轴和Z轴的“场景视图”中手动移动它,我将脚放到了看起来与以前相同的位置,并且当然它的位置更小,因为它离相机更远。
如何通过代码计算要分配给对象在Y轴上给定点的位置的X和Z坐标,以便一个点保留在屏幕空间中的同一位置?
答案 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;
}