使物体沿着相机的旋转方向朝向中心

时间:2017-11-06 07:15:10

标签: unity3d rotation virtual-reality

我有一个对象,其代码如下:

    [SerializeField]
    Transform target;
    [SerializeField]
    Vector3 defaultDistance = new Vector3(0f, 2f, -10f);
    [SerializeField]
    float distanceDamp = 2f;
    [SerializeField]
    Vector3 defaultPos;
    Transform myT;

    // Use this for initialization
    void Awake () {
        myT = transform;
        defaultPos = this.transform.position;
    }

    // Update is called once per frame
    void LateUpdate () { 
Vector3 toPos = target.position + (target.rotation * defaultDistance);
        toPos = new Vector3(toPos.x, 1f , toPos.z);
        Vector3 curPos = Vector3.Lerp(myT.position, toPos, distanceDamp * Time.deltaTime);
        myT.position = curPos;
}

我想要实现的目标:

我希望对象(此示例中的多维数据集,然后是VR中的GUI)跟随主摄像机的旋转,这意味着我希望对象在旋转时进入摄像机视图的中心。删除代码行toPos = new Vector3(toPos.x, 1f , toPos.z);并添加LookAt函数时,如果我使用GUI / Cube / etc,它可以正常工作,对象始终朝向摄像机中心移动。 但是 - 当我在X轴上向上/向下旋转相机时,我不希望物体向中心移动。因此,我写了那条线toPos = new Vector3(toPos.x, 1f , toPos.z);,现在我有一个错误,当我在X轴上旋转相机(意义,向上/向下),经过一定程度的X轴旋转后,对象开始移动Z轴朝向相机的位置,相反 当我向上/向下旋转时,我根本不想让它移动

我已经和eulerAngles一起工作了,但它并不是我正在寻找的解决方案,因为我需要定义一定程度的度数,这仍然会使对象上升/下降。 我希望它只能在任何旋转时绕着相机以圆形方式移动。(我是圆形移动代码,但我无法按照上面的需要实现它)

这是eulerAngles代码:

if (target.rotation.eulerAngles.x >= 350 || target.rotation.eulerAngles.x <= 10)
{
    Move the object towards the camera's view
    Vector3 toPos = target.position + (target.rotation * defaultDistance);
    Vector3 curPos = Vector3.Lerp(myT.position, toPos, distanceDamp * Time.deltaTime);
    myT.position = curPos;
}
else //Return the object to it's position and Y=1 (goes down/up accordingly to camera)
{
    Vector3 curPos = Vector3.Lerp(myT.position, new Vector3(myT.position.x, 1, myT.position.z), distanceDamp * Time.deltaTime);
    myT.position = curPos;
}

编辑: 这是我迄今为止所取得的成就,立方体并未居中于中间,但它围绕着相机的旋转而旋转。

 Vector3 toPos = target.position + target.rotation * new Vector3(defaultDistance.x, 0.0f, defaultDistance.z);
        float multiplier = Mathf.Sqrt(defaultDistance.x * defaultDistance.x + (defaultDistance.z) * (defaultDistance.z));
        //multiplier /= Mathf.Sqrt(toPos.x * toPos.x + toPos.z * toPos.z); 
        toPos.x *= -multiplier;
        toPos.y = target.position.y + defaultDistance.y;
        toPos.z *= -multiplier ;
        toPos.z -= 70;

        Vector3 curPos = Vector3.Lerp(myT.position, toPos, distanceDamp * Time.deltaTime);
        myT.position = curPos;

编辑2: 现在几乎完美toPos.z -= 60;

1 个答案:

答案 0 :(得分:0)

这可以解决这个问题吗?

Vector3 targetPos = target.position;
targetPos.y = transform.position.y;
Quaternion newRotation = Quaternion.LookRotation(targetPos - transform.position);
transform.rotation = Quaternion.Lerp(transform.rotation, newRotation, 0.5f);