本文主要是介绍如何用UNITY3D编写陀螺仪控制器,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
如何用编写陀螺仪控制器
陀螺仪为开发者提供了各种各样令人兴奋的控制变化。但当涉及到相机控制器的集成和实现时,会发生很多奇怪和神奇的事情。开发人员必须处理不同的设备导向,初始相机位置,当然还有四元数。我很高兴分享我的经验,并描述我们如何在Heyworks中解决这些问题。希望这能帮助那些第一次使用陀螺仪的人减轻工作和辛苦。
在我的例子中,我想演示如何在摄像机控制器中实现以下功能:
我们解决的第一个问题是在iOS设备和中,使用不同坐标系统引用类型: left-handed and right-handed。为了将四元数从一个系统转换到另一个系统,让我们使用以下函数:
现在我们可以用下面的代码来计算相机的旋转:
另一个需要处理的问题是支持不同的方向(由Unity开发人员在内部解决),由以下修改后的代码为每个方向确定:
下面是新增的函数来计算相机的旋转:
控制器应更新与基装置旋转相关的摄像机旋转,并在水平面上重置基相机旋转。这意味着,如果用户启动将设备指向北方的应用程序,游戏摄像机将不会旋转到虚拟的北方。摄像机将显示给定的方向。下面是考虑相机基旋转和设备基旋转的新功能。
对cameraBase和参数Rotation的计算有一点棘手。主要的两个障碍是:
在附件示例中可以找到确切的函数。
最后一件事,平滑相机旋转:
现在我们添加两个函数,AttachGyro和DetachGyro。第一个将启用控制器并重新计算所有的基旋转,第二个将禁用控制器。
最后我们的控制器准备好了。请在附件中找到工作示例。我将非常感谢您的评论和问题。希望,你会发现这个帖子有用!

陀螺仪为开发者提供了各种各样令人兴奋的控制变化。但当涉及到相机控制器的集成和实现时,会发生很多奇怪和神奇的事情。开发人员必须处理不同的设备导向,初始相机位置,当然还有四元数。我很高兴分享我的经验,并描述我们如何在Heyworks中解决这些问题。希望这能帮助那些第一次使用陀螺仪的人减轻工作和辛苦。
在我的例子中,我想演示如何在摄像机控制器中实现以下功能:
- 设备的屏幕被认为是进入虚拟世界的“窗口”,因此,围绕用户的设备必须重视它。
- 它将支持自动旋转,并在每个设备方向上工作。
- 你将能够从相机中分离控制器,通过代码改变它的旋转和位置(例如播放相机动画),然后附加控制器。
它将使虚拟世界与真实世界的轴线平行,并将重新校准水平旋转。
我们解决的第一个问题是在iOS设备和中,使用不同坐标系统引用类型: left-handed and right-handed。为了将四元数从一个系统转换到另一个系统,让我们使用以下函数:
[AppleScript] 纯文本查看 复制代码
private static Quaternion ConvertRotation(Quaternion q){ return new Quaternion(q.x, q.y, -q.z, -q.w);}
现在我们可以用下面的代码来计算相机的旋转:
[AppleScript] 纯文本查看 复制代码
transform.rotation = ConvertRotation(Input.gyro.attitude);
另一个需要处理的问题是支持不同的方向(由Unity开发人员在内部解决),由以下修改后的代码为每个方向确定:
[AppleScript] 纯文本查看 复制代码
private Quaternion GetRotFix(){if (Screen.orientation == ScreenOrientation.Portrait)return Quaternion.identity;if (Screen.orientation == ScreenOrientation.LandscapeLeft|| Screen.orientation == ScreenOrientation.Landscape)return Quaternion.Euler(0, 0, -90);if (Screen.orientation == ScreenOrientation.LandscapeRight)return Quaternion.Euler(0, 0, 90);if (Screen.orientation == ScreenOrientation.PortraitUpsideDown)return Quaternion.Euler(0, 0, 180);return Quaternion.identity; }
下面是新增的函数来计算相机的旋转:
[AppleScript] 纯文本查看 复制代码
transform.rotation = ConvertRotation(Input.gyro.attitude) * GetRotFix();
控制器应更新与基装置旋转相关的摄像机旋转,并在水平面上重置基相机旋转。这意味着,如果用户启动将设备指向北方的应用程序,游戏摄像机将不会旋转到虚拟的北方。摄像机将显示给定的方向。下面是考虑相机基旋转和设备基旋转的新功能。
[AppleScript] 纯文本查看 复制代码
transform.rotation = cameraBase * ( ConvertRotation(referenceRotation * Input.gyro.attitude) * GetRotFix();
对cameraBase和参数Rotation的计算有一点棘手。主要的两个障碍是:
- 你必须考虑到当前的设备方向,同时计算参数Rotation
- 你必须考虑在计算cameraBase时只围绕轴线旋转
在附件示例中可以找到确切的函数。
最后一件事,平滑相机旋转:
[AppleScript] 纯文本查看 复制代码
transform.rotation = Quaternion.Slerp(transform.rotation, cameraBase * ( ConvertRotation(referanceRotation * Input.gyro.attitude) * GetRotFix()), lowPassFilterFactor);
现在我们添加两个函数,AttachGyro和DetachGyro。第一个将启用控制器并重新计算所有的基旋转,第二个将禁用控制器。
最后我们的控制器准备好了。请在附件中找到工作示例。我将非常感谢您的评论和问题。希望,你会发现这个帖子有用!
这篇关于如何用UNITY3D编写陀螺仪控制器的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!