重置SteamVR的相机位置,通过调整父类来使得子类的坐标归零

文章讲述了如何在Unity开发中使用`Resetposition`和`ResetParentposition`方法,分别通过改变追踪空间类型和调整父对象位置来实现相机和子物体位置的瞬移。详细介绍了使用`Transform`组件和`localRotation`属性的操作过程。
摘要由CSDN通过智能技术生成

我们在开发的过程中经常会遇到需要更改相机的父类位置,并且需要重置通过头像控制的相机,来实现人物位置的瞬移

代码如下,

Resetposition()使用的API

ResetParentposition()直接调整父类来实现

public class ChangeTransform : MonoBehaviour
{
    public Transform childTransform; // 需要在Inspector中指定子物体的Transform组件
    // Start is called before the first frame update
    void Start()
    {
       
    }

    /// <summary>
    /// 重置相机位
    /// </summary>
    public void Resetposition() {
        XRDevice.SetTrackingSpaceType(TrackingSpaceType.Stationary);
        InputTracking.Recenter();
       
    }

    /// <summary>
    /// 通过调整父类让子物体位置归零
    /// </summary>
    public void ResetParentposition()
    {

        if (childTransform != null && childTransform.parent != null)
        {
            // 获取子物体相对于世界坐标系的旋转  
            Quaternion childWorldRotation = childTransform.localRotation;

            // 计算逆旋转,使得子物体的世界旋转被消除  
            Quaternion inverseChildWorldRotation = Quaternion.Inverse(childWorldRotation);
            transform.localRotation = Quaternion.identity;
            // 将逆旋转应用到父物体上  
            transform.localRotation = inverseChildWorldRotation * transform.localRotation;

            // 设置父物体的位置,使子物体保持在世界坐标原点  
            transform.localPosition = new Vector3(-childTransform.localPosition.x, 0, -childTransform.localPosition.z);

            transform.localRotation = new Quaternion(0, transform.localRotation.y, 0, transform.localRotation.w); ;
        }

    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值