Android重力感应
- 格式:docx
- 大小:27.75 KB
- 文档页数:5
Android开发学习之Unit3D重力感应今天想和大家分享的是基于Unity3D的重力感应。
首先简单地说一下Unity3D,Unity3D是一个支持Windwos、Android、ios、Mac、WII等多平台类型游戏的开发环境,具备可视化的编辑窗口,可以快捷、方便地对游戏场景迚行编辑,对DirectX和OpenGL具有高度的渲染能力,支持资源导入,支持物理引擎、支持光影特效、支持粒子系统,是开发跨平台游戏的首选工具。
对于Unity3D,我接触地不算很多,今天算是第一篇文章吧,我们今天就以一个的重力感应实例来开始今天的学习吧!首先打开Unity3D创建一个新的项目,项目创建完后,我们在Assets文件夹下创建一个Resources的文件夹,这里必须是Resources,否则开发环境将无法识别其中的资源。
然后我们导入一个小球的图片,命名为Ball。
紧接着,我们创建一个Scripts的文件夹来存放脚本文件,此时项目结构应该是这样的。
下面,我们在Scripts文件夹下创建一个Controls.cs的C#脚本文件。
主要代码如下:using UnityEngine;using System.Collections;public class Controls : MonoBehaviour {private Texture2D ball;private float x=0.0F;private float y=0.0F;private float mX=0.0F;private float mY=0.0F;void Start (){mX=Screen.width-x;mY=Screen.height-y;ball=(Texture2D)Resources.Load("Ball");}void OnGUI(){GUI.DrawTexture(new Rect(x,y,256,256),ball);}void Update (){x += Input.acceleration.x * 30;y += -Input.acceleration.y * 30;if(x < 0){x = 0;}else if(x > mX){x = mX;}if(y < 0){y = 0;}else if(y > mY){y = mY;}}}然后我们将这个脚本拖放到Camera上,绑定脚本,然后编译并在手机上运行,最终效果是这样的:到目前为止,这个例子存在几个问题如下:1、虽然程序中对越界问题作了处理,但是在实际测试过程中,我们发现小球还是会向屏幕右侧和下侧移动甚至消失2、小球在手机屏幕上的坐标系统似乎和Unity3D是相反的3、由于采用2D贴图,因此小球一直处于静止状态,正常的情况下小球应该会滚动。
gsensor用法
G-Sensor(重力感应器)是智能手机上最常见的传感器之一,用于检测设备的加速度和旋转,以及重力的方向。
它的使用方法非常广泛,基本上所有的智能手机和平板电脑都配有G-Sensor传感器。
G-Sensor的主要用途是用于检测设备的加速度,以便更好地调整屏幕的显示方向。
例如,当您拿起智能手机时,G-Sensor会检测设备的加速度,这样您可以更好地控制屏幕的显示方向。
此外,在游戏和应用程序中,G-Sensor可以用来检测手机的旋转,以便更好地控制角色的运动,例如横冲直撞或者跳跃等等。
G-Sensor的另一个重要用途是用于检测重力的方向。
例如,当您翻转手机时,G-Sensor会立即检测到手机的变化,并根据新的重力方向调整屏幕显示方向。
当您移动手机时,G-Sensor也会检测变化,以便调整屏幕显示,以获得更好的视觉效果。
此外,G-Sensor还可以应用于虚拟现实领域。
虚拟现实需要提供实时反馈,以便用户可以体验到真实的动态环境,而G-Sensor可以帮助用户更好地感受到虚拟现实的尖端体验。
G-Sensor的使用方法并不复杂,只要设备的加速度和重力的方向发生变化,G-Sensor就会检测出这些变化,从而调整屏幕显示方向。
此外,G-Sensor还可以供虚拟现实应用使用,帮助用户感受到更真实的虚拟现实体验。
G-Sensor用法虽然平常,但它却可以给智能手机和平板电脑带来很多便利,可以说是提高设备使用效率的重要因素。
g-sensor工作原理
G-sensor(重力感应器)是一种能够测量物体受到的加速度的传
感器,它可用于智能手机、汽车、安全设备等领域。
其工作原理是基
于牛顿第二定律,即力等于质量乘以加速度,通过测量物体的加速度
来判断物体受到的力的大小。
G-sensor采用微机电系统(MEMS)技术,将一个微小的质量块放
置在一个感应薄膜上,当物体发生加速度时,质量块就会在薄膜上运动,并且由于惯性力的作用,薄膜受到的力也会随之发生变化。
这时,电容式传感器会检测感应薄膜的变化,根据变化的程度来计算出物体
受到的加速度。
G-sensor的灵敏度很高,能够感知非常微小的加速度变化。
当手
机进行晃动、旋转、倾斜等操作时,G-sensor就能够感知到加速度的
变化,进而控制手机屏幕的自动旋转、游戏的重力感应等功能。
在汽
车领域,G-sensor可以用于判断车辆是否发生了侧翻、碰撞等情况,
从而触发安全气囊的开启。
总之,G-sensor利用微机电系统技术实现了对物体加速度的测量,其应用领域非常广泛,让我们的生活更加方便、安全。
手机重力感应原理
手机重力感应原理是一种基于重力的传感技术,能够感知手机在空间中的方向和倾斜角度。
它使用了一种叫做加速度计的传感器,通过测量手机在三个轴向(X、Y和Z轴)上的加速度
来确定手机的方向和倾斜角度。
加速度计是一种微小的电子器件,通常使用微机械系统(MEMS)技术来制造。
它由微小的质量块组成,固定在一个弹簧上。
当手机发生加速度时,质量块会相对于弹簧发生位移,这个位移会被转换为电信号,并被手机的处理器解读。
手机的重力感应功能是通过不同轴向上的加速度来实现的。
当手机处于静止状态时,重力会使得质量块向下受力,这个加速度被称为重力加速度。
通过测量重力加速度,手机可以判断手机的竖直方向以及屏幕朝上还是朝下的方向。
当手机倾斜或者旋转时,加速度计会测量到与重力加速度不同的加速度值。
手机的处理器根据这些加速度值来计算手机的倾斜角度和方向。
通过这种方式,手机能够实现自动旋转屏幕的功能,以及一些依赖于重力感应的应用程序,例如游戏中的运动控制和日历中的横屏显示。
总的来说,手机重力感应原理是通过加速度计测量不同轴向上的加速度,从而确定手机的方向和倾斜角度。
这个技术广泛应用于手机中,为用户带来了更便捷和智能的交互体验。
android实现摇⼀摇功能实现“摇⼀摇”功能,其实很简单,就是检测⼿机的重⼒感应,具体实现代码如下:⼀、在 AndroidManifest.xml 中添加操作权限⼆、实现代码1package com.xs.test;23import android.app.Activity;4import android.hardware.Sensor;5import android.hardware.SensorEvent;6import android.hardware.SensorEventListener;7import android.hardware.SensorManager;8import android.os.Bundle;9import android.os.Handler;10import android.os.Message;11import android.os.Vibrator;12import android.util.Log;13import android.widget.Toast;1415/**16 * 安卓晃动⼿机监听--“摇⼀摇”17 *18 * @author单红宇19 *20*/21public class TestSensorActivity extends Activity {2223private SensorManager sensorManager;24private Vibrator vibrator;2526private static final String TAG = "TestSensorActivity";27private static final int SENSOR_SHAKE = 10;2829/** Called when the activity is first created. */30 @Override31public void onCreate(Bundle savedInstanceState) {32super.onCreate(savedInstanceState);33 setContentView(yout.main);34 sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);35 vibrator = (Vibrator) getSystemService(VIBRATOR_SERVICE);36 }3738 @Override39protected void onResume() {40super.onResume();41if (sensorManager != null) {// 注册监听器42 sensorManager.registerListener(sensorEventListener, sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_NORMAL); 43// 第⼀个参数是Listener,第⼆个参数是所得传感器类型,第三个参数值获取传感器信息的频率44 }45 }4647 @Override48protected void onPause() {49super.onPause();50if (sensorManager != null) {// 取消监听器51 sensorManager.unregisterListener(sensorEventListener);52 }53 }5455/**56 * 重⼒感应监听57*/58private SensorEventListener sensorEventListener = new SensorEventListener() {5960 @Override61public void onSensorChanged(SensorEvent event) {62// 传感器信息改变时执⾏该⽅法63float[] values = event.values;64float x = values[0]; // x轴⽅向的重⼒加速度,向右为正65float y = values[1]; // y轴⽅向的重⼒加速度,向前为正66float z = values[2]; // z轴⽅向的重⼒加速度,向上为正67 Log.i(TAG, "x轴⽅向的重⼒加速度" + x + ";y轴⽅向的重⼒加速度" + y + ";z轴⽅向的重⼒加速度" + z);68// ⼀般在这三个⽅向的重⼒加速度达到40就达到了摇晃⼿机的状态。
星期天在家没有事情,一边翻译sdk中onSensorChanged 的解释,一遍摸索G1下onSensorChanged 第二个参数values的含义:总结如下,发完赶紧吃饭!1 public abstract void onAccuracyChanged (int sensor, int accuracy复制代码Called when the accuracy of a sensor has changed. See SensorManager for details. Parameters:sensor The ID of the sensor being monitoredaccuracy The new accuracy of this sensor.当sensor的"精确度"发生改变的时候,该方法会被回调,详细信息请参看SensorManager 类参数:sensor 被监视的sensor的IDaccuracy 关于此sensor的新精确度描述2 public abstract void onSensorChanged (int sensor, float[] values复制代码Called when sensor values have changed. The length and contents of the values array vary depending onwhich sensor is being monitored. See SensorManager for details on possible sensor types.当sensor的值发生改变的时候被回调,values数组的元素个数和其中的内容取决于哪个sensor正在被监视,sensor的可用类型请参看SensorManager类Definition of the coordinate system used below.The X axis refers to the screen's horizontal axis (the small edge in portrait mode, the long edge inlandscape mode and points to the right.The Y axis refers to the screen's vertical axis and points towards the top of the screen (the origin isin the lower-left corner.The Z axis points toward the sky when the device is lying on its back on a table.X轴:和屏幕平行并且指向右边的轴(在portrait中使用"小边角",在landscape模式中使用"长边角")Y轴:和屏幕垂直并且指向屏幕上方的轴(坐标原点在左下角)Z轴:当设备(手机背面着地放在桌子上的时候,指向天空的方向就是Z轴IMPORTANT NOTE: The axis are swapped when the device's screen orientation changes. To access theunswapped values, use indices 3, 4 and 5 in values[].一定要大家注意的:坐标系是跟随手机屏幕的方向改变而改变的,values数组中下标为3、4、5的3个元素,使用的是恒定的坐标系,(和尚注:你可以通过这三个元素得到一个不变的坐标,游戏开发中可能会用到(和尚注:此方法的第一个参数sensor可能是SensorManager.SENSOR_ORIENTATIONSensorManager.SENSOR_ORIENTATION中的一个解释如下:SENSOR_ORIENTATION, SENSOR_ORIENTATION_RAW:All values are angles in degrees.values[0]: Azimuth, rotation around the Z axis (0<=azimuth<360. 0 = North, 90 = East, 180 = South, 270 =Westvalues[1]: Pitch, rotation around X axis (-180<=pitch<=180, with positive values when the z-axis movestoward the y-axis.values[2]: Roll, rotation around Y axis (-90<=roll<=90, with positive values when the z-axis movestoward the x-axis.所有的值都是以角度为单位的values[0]:经度,以Z轴为中心旋转(0-360之间,北方=0,东方=90,南方=180,西方=270(和尚注:这个方向指的是google标志所对的方向,为了测试这个值,手都酸了(*^__^*values[1]: 着地点(终于选了一个合适的词,以X为轴转动(-180到180,Z轴向Y 轴方向运动的相对偏移量(和尚注:当手机垂直放在面前的时候为-90,当你面对着手机屏幕看天花板的时候为180/-180,当手机屏幕朝上放在水平的桌子上的时候为0,当手机的USB口朝向天花板垂直放置的时候为90values[2]: 转动,以Y为中心转动(-90到90,Z轴向X轴方向运动的相对偏移量(和尚注:这个运动其实就是我们所说的"垂直屏幕和水平屏幕的切换"Note that this definition of yaw, pitch and roll is different from the traditional definition used inaviation where the X axis is along the long side of the plane (tail to nose.需要注意的是在传统意义上的航空定位中,X轴指的是飞机的机身,而这里的yaw、pitch、roll和它是不一样的,这里的X轴指的是飞机的水平翼(和尚注:SDK中的这个解释对于西方人可能有帮助,对于我们可能会更加迷茫,我相信我上边已经说的够清楚了。
Android 手机重力感应实现简单介绍现在有很多游戏是通过摇晃手机实现的,比如赛车游戏摇骰子游戏迷宫游戏等等。
今天我用简单的代码为大家介绍一下android 下重力感应的实现方式下面是一个模拟器的屏幕Y轴以屏幕的左下方为原点,向上为正向下为负数(刚好和编程时坐标是相反的向下为正向上为负数)。
从-10到10。
X轴以屏幕左下方为原点向左为正向右为负数取值范围从-10到10 。
Z轴朝天就是正数朝地就是负数数取值范围从-10到10 。
由此可见重力感应的取值范围都是在-10 到10之间的我们就可以根据这个数字算出速度加速度等等。
下面我介绍一下代码的实现方式[java]view plaincopy1.private SensorManager sensorMgr;2.Sensor sensor = sensorMgr.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);3.4.//保存上一次 x y z 的坐标5.float bx = 0;6.float by = 0;7.float bz = 0;8.long btime = 0;//这一次的时间9. sensorMgr = (SensorManager) getSystemService(SENSOR_SERVICE);10. SensorEventListener lsn = new SensorEventListener() {11.public void onSensorChanged(SensorEvent e) {12.float x = e.values[SensorManager.DATA_X];13.float y = e.values[SensorManager.DATA_Y];14.float z = e.values[SensorManager.DATA_Z];15.//在这里我们可以计算出 X Y Z的数值下面我们就可以根据这个数值来计算摇晃的速度了16.//我想大家应该都知道计算速度的公事速度 = 路程/时间17.//X轴的速度18.float speadX = (x - bx) / (System.currentTimeMillis() - btime);19.//y轴的速度20.float speadY = (y - by) / (System.currentTimeMillis() - btime);21.//z轴的速度22.float speadZ = (z - bz) / (System.currentTimeMillis() - btime);23.//这样简单的速度就可以计算出来如果你想计算加速度也可以在运动学里,加速度a与速度,24.//位移都有关系:Vt=V0+at,S=V0*t+1/2at^2, S=(Vt^2-V0^2)/(2a),根据这些信息也可以求解a。
手机的感应器在Android里边所代表的类是Sensor,你只要看到在android.hardware这个包下边的都是封装的关于一些特殊的硬件方面的类,比如说Camera、Sensor之类的。
一直都很怀疑为什么HTC的Google手机没有前置摄像头。
怨念啊。
PS:虽然是2.1的机子,但是我用的是1.5的SDK。
代码很简单:我们首先要得到一个手机上的传感器。
Java代码
1.SensorManager sensorMgr = (SensorManager) getSystemService(SENSOR_SERVICE);
这行代码只要用过类似开发的都应该知道是什么。
getSystemService(String name)可以用来返回一个硬件设备的控制器。
比如说LocationManage(和GPS相关用来确定位置的)、TelephonyManage(查询电话相关内容,比如说IMEI码)、AudioManager(顾名思义,是视频播放用的)等等。
具体可以观看SDK文档里边Activity的讲解。
/int ... d/app/Activity.html
得到重力感应的硬件控制了,然后我们就应该得到一个Sensor了。
Java代码
1.Sensor sensor = sensorMgr.getDefaultSensor(Sensor.TYPE_ALL);
关于这个参数。
其实挺复杂的。
我开始用的是TYPE_ALL,出的是XYZ三条轴线的偏移量,至于其他的大家可以看下边:
下边是官方SDK中对于各种类型的解析(粗体红字是我加上去的)
<!-- =========== ENUM CONSTANT SUMMARY =========== -->
Constants
int TYPE_ACCELEROMETER
A constant describing an accelerometer sensor
type.加速度
int TYPE_ALL A constant describing all sensor types.所有类型,NexusOne 默认为 加速度
int TYPE_GYROSCOPE A constant describing a gyroscope sensor type 回转仪(这个不太懂)
int TYPE_LIGHT A constant describing an light sensor type.光线感应吗
int TYPE_MAGNETIC_FIELD A constant describing a magnetic field sensor type.磁场
int TYPE_ORIENTATION A constant describing an orientation sensor type.定向(指北针)和角度
int TYPE_PRESSURE A constant describing a pressure sensor type 压力计
int TYPE_PROXIMITY A constant describing an proximity sensor type.距离?不太懂
int TYPE_TEMPERATURE A constant describing a temperature sensor type 温度啦
然后就是我们需要即时了解手机的偏转度。
以TYPE_ALL 为例子。
(其实就是TYPE_ACCELEROMETER )
PS :有时候你的机子并不会拥有这么全的感应装置,这个时候你应该再进行以下判断。
比如说: Java 代码
1. Sensor sensor = sensorMgr.getDefaultSensor(Sensor.TYPE_TEMPERATURE);
2.
3. if (sensor == null ){
4. log.w("NO_SERVICE","没有感应温度的感应装置。
")
5. ... ...
6. }else {
7. ... ...
8. }
所有最基本的三维坐标系有三个轴:X、Y和Z,这个学过矩阵或者线性代数的都应该知道吧
(~~~~(>_<)~~~~ 我当年线性代数挂了。
惨不忍睹啊。
后来自学DirectX的时候才觉得原来矩阵变换是这么的重要。
而且更重要的是这个一点也不难吗。
)
关于手机的XYZ坐标,把你的手机平放到桌子上,横x,纵y,然后z就是屏幕法线。
官方的例子:(直接粘贴的话空格会变小,所以就截图了)
然后我们注册一个Listener,用来监听我们所得到的值的改变。
Java代码
1.SensorEventListener lsn = new SensorEventListener() {
2.public
void onSensorChanged(SensorEvent e) {
3.x = e.values[SensorManager.DATA_X];
4.y = e.values[SensorManager.DATA_Y];
5.z = e.values[SensorManager.DATA_Z];
6.t.setText("x=" + Math.round(x * ROUND_NUMBER) + "," + "y="
7. + Math.round(y * ROUND_NUMBER) + "," + "z="
8. + Math.round(z * ROUND_NUMBER));
9. }
10.
11.public
void onAccuracyChanged(Sensor s, int accuracy) {
12. }
13. };
在这里我把数字放大了,我预先定义了一个变量ROUND_NUMBER,是为了以后用来更改灵敏度的。
我取的值是100。
这个就简单了,我们首先声明一个SensorEvent的监听,每当它得到的值改变的时候,我就在一个TextView t上边输出改变了的值。
在这里使用TYPE_ALL返回的值SensorEvent里边的values就是得到的数字。
得到的values默认是一个float[]。
也就是说是一个float类型的数组。
他在TYPE_ALL的声明下一共返回三个值,分别就是x、y、z轴的值,假如你将手机平放在水平面上,默认分别是0,0,10。
(我在网上查到有的人和我得到的数字不一样,有人说是0,0,-10,关于这个我不知道是为什么,如果有人的Gphone 比较多的话可以看看是怎么一回事),而当你将手机垂直立起,显示的应当是0,10,0。
PS:SensorManager里边有很多的有意思的常量,比如说SensorManager.GRAVITY_EARTH是地球的重力加速度,当然也有GRAVITY_MARS火星的,GRAVITY_MOON月球的,最恶搞的还有GRAVITY_DEATH_STAR_I(星球大战里的卫星武器死星I号)。
还有一个
GRAVITY_THE_ISLAND,这个不知道是哪里。
汗。
难道是《岛》这本书里的世界?还是Neverland?
然后我们可以给Manager注册一个监听。
Java代码
1.sensorMgr.registerListener(lsn, sensor,
2.SensorManager.SENSOR_DELAY_GAME);
三个参数分别是监听,感应装置,和灵敏度。
灵敏度分为:
SENSOR_DELAY_FASTEST最灵敏,快的然你无语
SENSOR_DELAY_GAME游戏的时候用这个,不过一般用这个就够了,和上一个很难看出区别(也许是我的手机CPU高?1GHz的。
)
SENSOR_DELAY_NORMAL比较慢。
SENSOR_DELAY_UI 最慢的,几乎就是横和纵的区别
也许有些人想要拿这个来练练手了。
比如说是现在每天播放的联通iPhone广告里有一个“可以用来测量相框水平”这个广告词。
但是,但是。
恩恩。
输出的最好还是角度比较好吧?
所以我们改一改,做一个基本的LevelBar。
没有什么图形界面,只是用来输出。
我们首先注册的Sensor应该改了。
不是TYPE_ALL,而是TYPE_ORIENTATION !
然后剩下的基本上都一样。
SensorEvent返回的values也是三个值的数组。
但是,这三个值还是稍微有些不同的,如果你看了输出的值,那么就可能会明白了。
首先是第一个,有些人发现就算是平放在桌面上第一个值也会变,那么,第一个值其实不是轴角度,而是方向。
对了,这就是我在随上边写的指北针!当数字是0的时候,你的手机指向的是正北方向,90的话是东,180是南,270是西。
这下子,再加上一个漂亮的图形界面,一个指南针软件就可以出来了吧。
然后是第二个和第三个,就是x,y轴的角度值!对,是角度值而且不用换算。
这样子,你可以把屏幕横过来,然后直接输出y轴的角度值了,什么时候他是90度,那么就是水平了!。