Unity - 陀螺仪 - 仅绕一个轴旋转
Unity - Gyroscope - Rotation Around One Axis Only
我正在使用 Unity 制作一款使用陀螺仪的游戏。我正在尝试检测设备围绕穿过屏幕的轴的旋转,我假设它是 Unity Space 中的 Z 轴。我尝试使用 Input.gyro.attitude.eulerAngles.z
但是当围绕其他轴倾斜设备时它不会保持不变,我希望它保持不变以便只有 "Z-axis" 决定汽车方向盘的旋转,例如.我该如何实施?
编辑:
我尝试做其他事情。我使用 Input.gyro.rotationRateUnbiased
而不是 Input.gyro.attitude.eulerAngles
代码如下:
Vector3 gInput = Input.gyro.rotationRateUnbiased;
gyroEuler += gInput * Time.deltaTime * Mathf.Rad2Deg;
float rollAngle = gyroEuler.z;
while (rollAngle < 0)
{
rollAngle += 360;
}
while (rollAngle > 360)
{
rollAngle -= 360;
}
但是 gyroEuler
将设置为 (0, 0, 0)
,无论游戏开始时的设备方向如何,所以设备方向在开始时是未知的,而且 Input.gyro.rotationRateUnbiased
是很不准确。我想按照许多游戏的方式旋转屏幕,例如 Temple 运行 2,但我希望能够将其旋转 360 度并获得该旋转角度。
好吧,我刚刚试过了,效果很好:
private void Start()
{
Input.gyro.enabled = true;
}
private void Update()
{
Vector3 previousEulerAngles = transform.eulerAngles;
Vector3 gyroInput = -Input.gyro.rotationRateUnbiased;
Vector3 targetEulerAngles = previousEulerAngles + gyroInput * Time.deltaTime * Mathf.Rad2Deg;
targetEulerAngles.x = 0.0f; // Only this line has been added
targetEulerAngles.z = 0.0f;
transform.eulerAngles = targetEulerAngles;
//You should also be able do it in one line if you want:
//transform.eulerAngles = new Vector3(0.0f, transform.eulerAngles.y - Input.gyro.rotationRateUnbiased.y * Time.deltaTime * Mathf.Rad2Deg, 0.0f);
}
您需要做的是创建一个中央 Transform(或使用您的播放器)和 parent 您的 Camera 作为child 其中。然后设置 Camera z-distance、高度和角度来调整你的视角。最后将上面的脚本附加到中央 Transform:旋转它会使你的 Camera 沿着弧线移动。
编辑:如果你想使用Input.gyro.attitude
,你可以按照下面的方式进行
private Vector3 startEulerAngles;
private Vector3 startGyroAttitudeToEuler;
private void Start()
{
Input.gyro.enabled = true;
startEulerAngles = transform.eulerAngles;
startGyroAttitudeToEuler = Input.gyro.attitude.eulerAngles;
}
private void Update()
{
Vector3 deltaEulerAngles = Input.gyro.attitude.eulerAngles - startGyroAttitudeToEuler;
deltaEulerAngles.x = 0.0f;
deltaEulerAngles.z = 0.0f;
transform.eulerAngles = startEulerAngles - deltaEulerAngles;
}
public void ResetGyro()
{
startGyroAttitudeToEuler = Input.gyro.attitude.eulerAngles;
}
编辑 2:
我猜你要找的是 this:然后你可以检查 upVec.y
和 upVec.x
你的 Down/Up 和 Left/Right轴.
首先创建一个空的 GameObject,它将用作包含陀螺仪旋转的虚拟对象,并将其设置在脚本的 phoneDummy
字段中。
public Transform phoneDummy;
private void Start()
{
Input.gyro.enabled = true;
}
private void Update()
{
Vector3 gyroEuler = Input.gyro.attitude.eulerAngles;
phoneDummy.transform.eulerAngles = new Vector3(-1.0f * gyroEuler.x, -1.0f * gyroEuler.y, gyroEuler.z);
Vector3 upVec = phoneDummy.transform.InverseTransformDirection(-1f * Vector3.forward);
}
upVec.y
将是您的 pitch 并且 upVec.x
将是您的 滚动轴。
(检查 here 轴参考)
但请记住,来自 Input.gyro
的值远非完美:如果您正在寻找更持久的值(但当然不太精确),您可能想使用 Input.compass.magneticHeading
。
希望对您有所帮助,
Gyroscope jyro;
private void Start()
{
jyro = Input.gyro;
jyro.enabled = true;
}
void Update()
{
if (SystemInfo.supportsGyroscope)
{
transform.rotation = new Quaternion(0, 0, -Input.gyro.attitude.z, Input.gyro.attitude.w);
}
}
花了我很多时间,但你只需要使用两个四元数值
我正在使用 Unity 制作一款使用陀螺仪的游戏。我正在尝试检测设备围绕穿过屏幕的轴的旋转,我假设它是 Unity Space 中的 Z 轴。我尝试使用 Input.gyro.attitude.eulerAngles.z
但是当围绕其他轴倾斜设备时它不会保持不变,我希望它保持不变以便只有 "Z-axis" 决定汽车方向盘的旋转,例如.我该如何实施?
编辑:
我尝试做其他事情。我使用 Input.gyro.rotationRateUnbiased
而不是 Input.gyro.attitude.eulerAngles
代码如下:
Vector3 gInput = Input.gyro.rotationRateUnbiased;
gyroEuler += gInput * Time.deltaTime * Mathf.Rad2Deg;
float rollAngle = gyroEuler.z;
while (rollAngle < 0)
{
rollAngle += 360;
}
while (rollAngle > 360)
{
rollAngle -= 360;
}
但是 gyroEuler
将设置为 (0, 0, 0)
,无论游戏开始时的设备方向如何,所以设备方向在开始时是未知的,而且 Input.gyro.rotationRateUnbiased
是很不准确。我想按照许多游戏的方式旋转屏幕,例如 Temple 运行 2,但我希望能够将其旋转 360 度并获得该旋转角度。
好吧,我刚刚试过了,效果很好:
private void Start()
{
Input.gyro.enabled = true;
}
private void Update()
{
Vector3 previousEulerAngles = transform.eulerAngles;
Vector3 gyroInput = -Input.gyro.rotationRateUnbiased;
Vector3 targetEulerAngles = previousEulerAngles + gyroInput * Time.deltaTime * Mathf.Rad2Deg;
targetEulerAngles.x = 0.0f; // Only this line has been added
targetEulerAngles.z = 0.0f;
transform.eulerAngles = targetEulerAngles;
//You should also be able do it in one line if you want:
//transform.eulerAngles = new Vector3(0.0f, transform.eulerAngles.y - Input.gyro.rotationRateUnbiased.y * Time.deltaTime * Mathf.Rad2Deg, 0.0f);
}
您需要做的是创建一个中央 Transform(或使用您的播放器)和 parent 您的 Camera 作为child 其中。然后设置 Camera z-distance、高度和角度来调整你的视角。最后将上面的脚本附加到中央 Transform:旋转它会使你的 Camera 沿着弧线移动。
编辑:如果你想使用Input.gyro.attitude
,你可以按照下面的方式进行
private Vector3 startEulerAngles;
private Vector3 startGyroAttitudeToEuler;
private void Start()
{
Input.gyro.enabled = true;
startEulerAngles = transform.eulerAngles;
startGyroAttitudeToEuler = Input.gyro.attitude.eulerAngles;
}
private void Update()
{
Vector3 deltaEulerAngles = Input.gyro.attitude.eulerAngles - startGyroAttitudeToEuler;
deltaEulerAngles.x = 0.0f;
deltaEulerAngles.z = 0.0f;
transform.eulerAngles = startEulerAngles - deltaEulerAngles;
}
public void ResetGyro()
{
startGyroAttitudeToEuler = Input.gyro.attitude.eulerAngles;
}
编辑 2:
我猜你要找的是 this:然后你可以检查 upVec.y
和 upVec.x
你的 Down/Up 和 Left/Right轴.
首先创建一个空的 GameObject,它将用作包含陀螺仪旋转的虚拟对象,并将其设置在脚本的 phoneDummy
字段中。
public Transform phoneDummy;
private void Start()
{
Input.gyro.enabled = true;
}
private void Update()
{
Vector3 gyroEuler = Input.gyro.attitude.eulerAngles;
phoneDummy.transform.eulerAngles = new Vector3(-1.0f * gyroEuler.x, -1.0f * gyroEuler.y, gyroEuler.z);
Vector3 upVec = phoneDummy.transform.InverseTransformDirection(-1f * Vector3.forward);
}
upVec.y
将是您的 pitch 并且 upVec.x
将是您的 滚动轴。
(检查 here 轴参考)
但请记住,来自 Input.gyro
的值远非完美:如果您正在寻找更持久的值(但当然不太精确),您可能想使用 Input.compass.magneticHeading
。
希望对您有所帮助,
Gyroscope jyro;
private void Start()
{
jyro = Input.gyro;
jyro.enabled = true;
}
void Update()
{
if (SystemInfo.supportsGyroscope)
{
transform.rotation = new Quaternion(0, 0, -Input.gyro.attitude.z, Input.gyro.attitude.w);
}
}
花了我很多时间,但你只需要使用两个四元数值