
iPad播放器可能使用了StarWalk,该应用程序功能强大,无法附加. StarWalk中的世界实际上是围绕用户的虚拟领域. 当然,它也可以对应于真实的天球. 当用户拿着iPad面对不同的方向时,可以从iPad屏幕上看到天球的相应侧面. 该区域就像用望远镜看着天球. 这里的原理实际上非常简单. 整个虚拟天球都是游戏世界. 主位于游戏世界的中心. 当iPad屏幕的方向发生变化时,主会根据获得的重力传感器输入和指南针Enter来计算新的方向并转向正确的方向.
iPad重力传感器的X,Y和Z方向分量分布基于“主页”按钮在屏幕上的放置方式. 垂直屏幕的向为(-1,1)
将iPad屏幕倒置放置时,重力方向描述为(0,0,-1);当iPad的“主页”按钮朝下且屏幕垂直放置时,重力方向描述为(0,-1,0);当iPad的“主页”按钮位于左侧且屏幕侧向放置时,重力方向描述为(1,0,0). 如下图所示:




类似地,当iPad屏幕躺下时,重力方向为(0,0,1);将iPad倒置(“主页”按钮直立)时,重力方向为(0,1,0);将iPad放在其侧面且“主页”按钮在右侧时,重力方向为(-1,0,0). 这六种位置的重力与某个坐标轴一致. 当iPad以其他角度放置时,只有重力输入才需要视为向量,坐标轴映射的大小为1个单位. 当然,这种映射不需要我们自己计算,因为我们可以-
要获取重力输入非常简单,请使用Input.acceleration获取最新的重力输入. 它的值是一个Vector3变量,它是上述坐标系中重力输入方向的三分量映射. 我们可以使用一个简单的脚本来观察翻转iPad时重力输入的三分量值将如何变化:
usingUnityEngine; usingSystem.Collections; usingSystem; publicclassShowGSensorValue: MonoBehaviour {// UsethisforinitializationvoidStart(){} //调用onceperframevoidUpdate(){} voidOnGUI(){GUI.Box(newRect(5,5,100,20),String.Format(“ {0: 0.000}”,Input.acceleration . X)); GUI.Box(newRect(5,30,100,20),String.Format(“ {0: 0.000}”,Input.acceleration.y)); GUI .Box(newRect(5,55,100,20),String.Format(“ {0: 0.000}”,Input.acceleration.z));}}
在上面的脚本中,通过绘制三个垂直排列在屏幕左上角的Box控件,在每个空间中显示一个分量,可以实时显示当前游戏帧中重力输入方向的三个分量. 如下图所示:


它仅用于观察重力输入分量,因此足以直接获取Input.acceleration. 但是,如果您想使用重力输入来影响游戏世界中的对象,那么就会出现问题: 重力输入的分量以iPad屏幕为标准在上述坐标系中表示,但游戏世界坐标系却是它与iPad屏幕坐标系不一致. 就上面截图中的球而言,它所在的坐标系的三个坐标轴的方向看起来像这样:

绿色是+ Y轴,红色是+ X轴,蓝色是+ Z轴. 或者我们可以调整游戏主的角度以使其更加清晰:


将相机直接移到球上方. 现在,球的坐标系看起来与iPad的屏幕坐标系非常相似,但是显然+和Y轴与iPad的屏幕坐标系不同. 立即切换到:

实际上,iPad屏幕坐标系是Z轴反转的主摄像机的局部坐标系:

因此,如果将Input.acceleration的方向直接应用于球,则它将不会像我们期望的那样移动. 这需要完成-

在iPad上玩游戏时,游戏中的主用于观察游戏世界,而屏幕是主的镜头. 因此ipad重力感应,当主摄像机的指向方向不变时,整个游戏世界都可以被视为“粘附”. iPad屏幕位于“后面”,并且屏幕是一块透明玻璃. 我们正在观察通过玻璃杯黏附在玻璃杯后面的游戏世界.

坐标转换是将屏幕(即玻璃)的坐标系转换为玻璃后面的游戏世界的坐标系. 最简单的坐标转换是如上例所示,当摄像机从游戏世界正上方俯视时,只需将+ Y更改为+ Z轴,将+ Z轴更改为+ Y轴即可. 能够. 例如,修改上面的代码:
usingUnityEngine; usingSystem.Collections; usingSystem; publicclassShowGSensorValue: MonoBehaviour {publicRigidbodyTarget = null; publicfloatForceFactor = 10.0f; // UsethisforinitializationvoidStart(){} //更新被称为onceperframevoidFixedUpdate(){if(Target!= null){Target.AddForce(Input.acceleration.x,Input.acceleration.z,Input.acceleration.y)* ForceFactor,ForceMode.Force) ;}} voidOnGUI(){GUI.Box(newRect(5,5,100,20),String.Format(“ {0: 0.000}”,Input.acceleration.x)); GUI.Box(newRect(5,30,100,20),String.Format(“ {0: 0.000}”,Input.acceleration.y)); GUI .Box(newRect(5,55,100,20),String.Format(“ {0: 0.000}”,Input.acceleration.z));}}
更复杂时,屏幕坐标系和游戏世界坐标系之间存在倾斜角,并且坐标分量不能直接交换. 它需要通过三角函数来计算;它们之间的相对关系在不断变化,因为我们的主在不断地移动和旋转,这需要更复杂的坐标变换.
备注: iPad用于支持重力感应的硬件设备是加速度计. 当iPad不能承受重力加速度以外的加速度时,从加速度计读取的值可以归一化为当前重力加速度ipad重力感应,经过归一化可以认为是当前地理位置的重力方向. 因此,如果iPad设备处于复杂的加速环境中,则从加速度计读取的数据不能用作确定重力方向的基础. Unity 3D 3.5版开始支持陀螺仪. 请参阅API文档,其中有一个特殊的引力属性,指示引力加速度的方向,但是手边没有iPad 2或iPhone 4可以进行实验.
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/sanxing/article-209773-1.html
好看好看#宋茜#