【问题标题】:Make an object follow camera's rotation, towards the center使对象跟随相机的旋转,朝向中心
【发布时间】:2017-11-06 07:15:09
【问题描述】:

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

    [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)跟随主摄像机的旋转,这意味着我希望对象在旋转时 Lerp 进入摄像机视图的中心。当删除代码行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; 现在几乎完美了

【问题讨论】:

  • 为了确保我理解,您希望在视口中心进行变换,但在偏移距离处并始终面向相机。对吗?
  • @MrDos 没错。在屏幕前取一个 GUI,始终跟随相机的视口在中心有一段距离,因为它应该在 World Space(为 VR 环境开发)中,并且只在 Y 轴上移动,即在 XZ 平面上。
  • 仍然在做问题.. 寻找一个可靠的解决方案。因为像 toPos.z -= 60 这样调整 z 轴不会完成任务。有什么想法吗? @MrDos

标签: unity3d rotation virtual-reality


【解决方案1】:

这样可以解决问题吗?

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);

【讨论】:

  • 您的意思是 Vector3 targetPos = target.position; targetPos.y = transform.position.y; transform.rotation = Quaternion.LookRotation(targetPos - transform.position); ,如果我删除 LateUpdate() 中的先前代码,它不会做任何事情。我应该保留它吗?
  • 感谢您的意见。但不管有没有我的LateUpdate() 中的代码,它都不起作用。我还尝试将它放在我的代码之前和函数中的代码之后,并且没有任何更改。错误仍然存​​在。先生还有什么建议吗?
  • @IlanAizelmanWS 我添加了缓动和声明。这绝对适合我。在处理欧拉角时,您的错误听起来是典型的问题......
  • 什么也没发生。我把脚本放在对象上。对象的起始位置是位置轴上的 Z=10。当我旋转相机的视野时,对象根本不会移动。
  • 再次更新了我的帖子。现在几乎完美了。 @MrDos
猜你喜欢
  • 2016-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-28
相关资源
最近更新 更多