【发布时间】: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