我有一个对象,其代码如下:
[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;
答案 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);