使用透视摄像机拖动物体

问题描述 投票:0回答:1

我想写一个函数,当我按住鼠标时,我可以拖动游戏对象,然后我把它锁定到目标上.我使用的是一个透视,垂直相机,物理相机被选中,焦距35。另外,我不知道这是否重要,但我在Y轴和Z轴上拖动对象,我使用的代码将对象拖得太靠近相机。我怎样才能解决这个问题?

private void OnMouseDrag()
{
    if (IsLatched)
    {
        print($"is latched:{IsLatched}");
        return;
    }
    float distance = -Camera.main.transform.position.z + this.transform.position.z;
    Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
    Vector3 rayPoint = ray.GetPoint(distance);
    this.transform.position = rayPoint;
    print($"{name} transform.position:{transform.position}");
    this.gameObject.GetComponent<Rigidbody>().isKinematic = true;
    isHeld = true;
}
unity3d
1个回答
1
投票

你是通过减去z坐标来计算距离,然后用这个距离沿点击射线取一个点。这不会是同一z坐标上的一个点。如果你想保持一个分量不变,我宁愿把射线与XY平面相交。

Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
float Zplane = this.transform.position.z;   // example. use any Z from anywhere here.

// find distance along ray.
float distance = (Zplane-ray.origin.z)/ray.direction.z ;
// that is our point
Vector3 point = ray.origin + ray.direction*distance;
// Z will be equal to Zplane, unless considering rounding errors.
// but can remove that error anyway.
point.z = Zplane;

this.transform.position = point;

这是否可以帮助你?与其他任何平面的工作原理类似。

© www.soinside.com 2019 - 2024. All rights reserved.