【问题标题】:How to enable gyroscope camera at current device orientation如何在当前设备方向启用陀螺仪相机
【发布时间】:2017-10-25 14:43:17
【问题描述】:

我想启用陀螺仪控制的相机 onButtonClick 事件,但我希望它从相机的当前位置开始。目前,当陀螺仪启用时,它会将相机移到新位置(可能是设备当前的陀螺仪旋转),而不是将其留在原处并从该点开始旋转。

希望我说得有道理,但基本上我不希望用户注意到他们在游戏中看到的任何变化(即由陀螺仪控制的摄像头,但用户不会注意到这种变化)。这是我正在使用的代码:

void Update () 
{
    Quaternion attitudeFix = new Quaternion (-gyro.attitude.x, -gyro.attitude.z, -gyro.attitude.y, gyro.attitude.w);
    Quaternion offsetRotation =  initialGyroRotation * attitudeFix;
    rotation = initialRotation * offsetRotation;
    transform.rotation = rotation;
}

public void EnableGyro() 
{
    initialGyroRotation = Input.gyro.attitude;
    initialRotation = transform.rotation;

    Debug.Log("initialRotation: " + initialRotation.ToString());
    Debug.Log("transform.rotation: " + transform.rotation.ToString());
    Debug.Log("initialGyroRotation: " + initialGyroRotation.ToString());
}

**

编辑:这是一个屏幕,显示了当用户将设备放在脸前(纵向)并向北行驶时,我希望视图看起来如何。无论应用程序启动时设备的方向如何,当手机以纵向方向向北行驶时(再次当用户通过手机查看时),它应该是这样的。

编辑 2: 测试变得令人困惑,所以我将代码放回您的解决方案所建议的方式。仍然有一个小问题,但看起来这个脚本非常接近。主要问题是当我运行每个测试时屏幕看起来不像上面的图片,使用设备以奇怪的角度启动应用程序。启动应用程序时设备的角度并不重要,指向北方和纵向时它需要看起来像上面的屏幕。

我需要做更多的测试,并且会在一个新的/干净的项目中这样做。

【问题讨论】:

    标签: c# unity3d quaternions gyroscope


    【解决方案1】:

    您需要在AwakeStart 函数中获取偏移相机位置。在Update 函数中,将该偏移值应用于来自陀螺仪传感器的值。

    看起来您已经知道应该使用偏移量,但您没有以正确的方式使用。令人困惑的部分是获得需要从陀螺仪传感器值中减去当前相机旋转的偏移量。

    要减去Quaternion 乘以Inverse 而不仅仅是Quaternion

    Quaternion = Quaternion *Quaternion.Inverse

    要添加Quaternion 乘以Quaternion

    Quaternion = Quaternion * Quaternion.
    

    你的代码应该是这样的:

    Quaternion offset;
    
    void Awake()
    {
        Input.gyro.enabled = true;
    }
    
    void Start()
    {
        //Subtract Quaternion
        offset = transform.rotation * Quaternion.Inverse(GyroToUnity(Input.gyro.attitude));
    }
    
    void Update()
    {
        GyroModifyCamera();
    }
    
    void GyroModifyCamera()
    {
        //Apply offset
        transform.rotation = offset * GyroToUnity(Input.gyro.attitude);
    }
    
    private static Quaternion GyroToUnity(Quaternion q)
    {
        return new Quaternion(q.x, q.y, -q.z, -q.w);
    }
    

    【讨论】:

    • 感谢您的帮助,您的代码完全符合预期。现在我已经开始工作了,当然它暴露了我在相机上实现陀螺仪和在单独的游戏对象上实现指南针时遇到的其他问题。我想知道你的想法,如果你认为有可能设置一个在 2 轴 (X/Z) 上执行陀螺仪的相机,并在另一个执行剩余 1 轴 (Y) 的游戏对象上设置指南针。我应该开始另一个问题吗?
    • 这完全是另一个问题。您可以为此创建一个新问题。确保清楚您的要求并提供您尝试过的内容。
    • 感谢程序员,这是我的新问题:stackoverflow.com/questions/46943868/…
    • Programmer 上面的脚本效果很好,但我需要将我看到的内容旋转 90 度(不确定如何或什么轴)。目前,当我在桌子上看设备时,我需要的“视图”有效。但我希望用户在他们的面前查看/持有设备肖像。不需要其他更改,那么如何将其添加到上述内容中?
    • 如果您可以添加您当前看到的屏幕截图,然后添加您期望的另一个屏幕截图,我愿意修改该代码,看看我是否可以解决您的问题。
    猜你喜欢
    • 2022-07-24
    • 1970-01-01
    • 2012-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多