Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unity3d 使对象跟随摄影机的旋转,朝向中心_Unity3d_Rotation_Virtual Reality - Fatal编程技术网

Unity3d 使对象跟随摄影机的旋转,朝向中心

Unity3d 使对象跟随摄影机的旋转,朝向中心,unity3d,rotation,virtual-reality,Unity3d,Rotation,Virtual Reality,我有一个对象,它有以下代码: [SerializeField] Transform target; [SerializeField] Vector3 defaultDistance = new Vector3(0f, 2f, -10f); [SerializeField] float distanceDamp = 2f; [SerializeField] Vector3 defaultPos; Transform myT;

我有一个对象,它有以下代码:

    [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;
}
我正在努力实现的目标:

在本例中,我希望objectcube,但VR中的GUI跟随主摄影机的旋转,这意味着我希望对象在旋转时进入摄影机视图的中心。删除代码toPos行时=新矢量3topos.x,1f,toPos.z;添加LookAt功能,如果我使用GUI/Cube/etc,它工作得很好,对象总是朝着相机的中心移动。但是-当我在X轴上上下旋转相机时,我不希望对象向中心移动。因此,我写了一行toPos=newvector3topos.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;
}
编辑2:
几乎完美现在与地形。z-=60

这会奏效吗

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=变换位置.y;transform.rotation=Quaternion.LookRotationtargetPos-transform.position,如果我在最新的更新中删除以前的代码,它不会起任何作用。我应该保留它吗?谢谢你的意见。但无论是否有我最新更新中的代码,它都不起作用。我还尝试将它放在函数中的代码之前和代码之后,没有任何更改。错误仍然存在。还有什么建议吗,先生?@IlanAizelmanWS我加上了放松和声明。这绝对适合我。在处理欧拉角时,您的错误听起来是典型的问题…什么都没有发生。我将脚本放在对象上。对象在位置轴上的起始位置为Z=10。当我旋转相机的视图时,物体根本不移动。再次更新我的帖子。现在几乎完美了@mrdos为了确保我理解,您希望在视口的中心进行变换,但偏移距离一定,并且始终面向摄影机。是这样吗?@MrDos完全正确。在屏幕前放置一个GUI,始终保持一定距离跟随中央摄像头的查看端口,因为它应该在世界空间中,为VR环境开发,并且只在Y轴上移动,这意味着在XZ平面上。仍然存在问题。。寻找固溶体。因为像toPos.z-=60那样调整z轴无法完成任务。有什么想法吗,伙计们@MrDos
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);