unity3d VR___________通过移动和旋转父物体,来使子物体始终在指定的位置上并且保持指定的角度

开发过VR的朋友想必都遇到过(尤其是Htc-Vive),明明自己在VR游戏内将玩家控制器放到了一个默认的特定视角,但真正运行游戏的时候,位置总是跑偏。尤其是环境周围有其他物体或墙壁的话,甚至有可能把玩家视角一运行就卡在里面。造成这个现象的原因和简单,是因为玩家带着头盔会在现实空间中乱跑乱转向,导致出现的位置偏差。

开发VR软件时,SDK会自带有一个预制体,这个预制体有一个根节点父物体,下面有相机子物体。相机子物体是被硬件传感器控制的,用代码是不可能修改其位置和旋转的。所以一般设置默认视角,都是把父物体拖到特定位置的。而这个父物体是和VR定位空间的中心点对应的;子物体相机相对于父物体的偏移,对应的是你现实空间中VR头盔和定位空间中心点的偏移。只有保证头盔始终在定位空间中心点并且正前方朝向一致时,才能在每一次启动游戏时达到你在游戏中给设置的默认视角。

但现在问题来了,你在现实中启动游戏时,不可能让玩家郑重其事的找到中心点来启动。所以我们必须解决这个问题。思路就是,通过对根节点父物体的旋转、位移,来让VR相机那个子物体可以无视现实空间偏移量,总是保持默认视角。

表达能力不行,下面直接上代码吧。我想真的有人碰到过这个问题的话,应该能领会到我想表达的意思。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;


public class CalculateMatrix : MonoBehaviour 
{
    /// <summary>
    /// 目标位置的Transform组件
    /// </summary>
    public Transform dest;
    /// <summary>
    /// 当前父物体的Transform组件
    /// </summary>
    public Transform thisTransform;
    /// <summary>
    /// 子物体的Transform组件
    /// </summary>
    public Transform headTransform;

    void Update()
    {
        if(Input.GetKeyDown(KeyCode.Space))
        {
            SetTransform();
        }
    }

    void SetTransform()
    {
        thisTransform.eulerAngles=thisTransform.eulerAngles + (dest.eulerAngles - headTransform.eulerAngles);
        thisTransform.position = thisTransform.position + (dest.position - headTransform.position);
    }

}

猜你喜欢

转载自blog.csdn.net/qq_37760273/article/details/106644422
今日推荐