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
一个轴上的统一(iOS)设备角度_Ios_Unity3d_Rotation_Gyroscope_Acceleration - Fatal编程技术网

一个轴上的统一(iOS)设备角度

一个轴上的统一(iOS)设备角度,ios,unity3d,rotation,gyroscope,acceleration,Ios,Unity3d,Rotation,Gyroscope,Acceleration,我正在创建一个Unity游戏,它从设备的物理旋转中获取输入,并将其转化为应用于主要角色(一个球)的力。使用Input.Acceleration,它目前运行良好,我添加了一个z轴偏移,这样您可以选择它的默认“向上”,比如说与您面前的桌子成45度。问题是,Input.acceleration给出的值会重复出现,比如0(平台上的平面)和1(与平台成90度角)之间的正弦曲线,但y轴和z轴的间隔都不同(比如cos/sin sorta模式)。我不太清楚如何更好地解释这一点。。但我会列出每90度的y和z的值,

我正在创建一个Unity游戏,它从设备的物理旋转中获取输入,并将其转化为应用于主要角色(一个球)的力。使用Input.Acceleration,它目前运行良好,我添加了一个z轴偏移,这样您可以选择它的默认“向上”,比如说与您面前的桌子成45度。问题是,Input.acceleration给出的值会重复出现,比如0(平台上的平面)和1(与平台成90度角)之间的正弦曲线,但y轴和z轴的间隔都不同(比如cos/sin sorta模式)。我不太清楚如何更好地解释这一点。。但我会列出每90度的y和z的值,我需要将它们转换成0-4的值,或者360度的角度-只是z旋转的某种线性增加值

0度(平放在桌子上):y=0,z=-1

90度(面向你):y=-1,z=0

180度(台面朝下):y=0,z=1

270度(背对你):y=1,z=0

更新: 使用方程{((Input.acceleration.y*2)+Input.acceleration.z+1)*90f}它给出了在设备完全旋转时0到360之间的角度,但例如在0到90之间,它给出了120度的值,然后在第一个四分之一旋转时返回到90度

更新2: 我发现了一个网站,它展示了如何使用陀螺仪为设备旋转提供一个角度(而不是输入.加速度),使用以下代码(C#)

如果我知道这是如何工作的,以及如何得到Y值而不是Z值,我就能够同样轻松地解决这个问题(我测试了它,它给出了一个介于0和360之间的线性值,将手机从左向右倾斜,但我需要前后角度)


这或多或少只是一个猜测,但可能尝试更改Y轴的GetZRotation:

void GetYRotation ()
{
    Quaternion referenceRotation = Quaternion.identity;
    Quaternion deviceRotation = new Quaternion(0.5f, 0.5f, -0.5f, 0.5f) * Input.gyro.attitude * new Quaternion(0, 1, 0, 0);
    Quaternion eliminationOfXZ = Quaternion.Inverse(
        Quaternion.FromToRotation(referenceRotation * Vector3.up, 
                              deviceRotation * Vector3.up)
        );
    Quaternion rotationY = eliminationOfXZ * deviceRotation;
    float roll = rotationY.eulerAngles.y;

    return roll;
}

目前无法实际测试它,因此不确定它是否能按需要工作,但我认为值得一试。

我想我也尝试过类似的方法,但我会在有机会时试一试,然后与检查此线程的人联系。
void GetYRotation ()
{
    Quaternion referenceRotation = Quaternion.identity;
    Quaternion deviceRotation = new Quaternion(0.5f, 0.5f, -0.5f, 0.5f) * Input.gyro.attitude * new Quaternion(0, 1, 0, 0);
    Quaternion eliminationOfXZ = Quaternion.Inverse(
        Quaternion.FromToRotation(referenceRotation * Vector3.up, 
                              deviceRotation * Vector3.up)
        );
    Quaternion rotationY = eliminationOfXZ * deviceRotation;
    float roll = rotationY.eulerAngles.y;

    return roll;
}