最近元宇宙概念大热,作为紧跟热点技术的博主是不是也应该跟进一下?当然是的!
但跟元宇宙相关的技术很多,如VR、AR、AI、NFT、物联网、5G等等,应该从哪里开始入手呢?
最近跟朋友聊起做一款手机当枪的游戏:
- 手机获取陀螺仪信息,实时控制枪支,触屏射击
- 结合AI肢体识别或者脸部识别,跟踪人体移动,躲避子弹
- 加上局域网内联机功能
这样就能实现一款体感射击对战游戏了。
目前已经实现了第一步。
这时才发现其实手机就是充当VR眼镜里带3DOF的手柄,VR眼镜里的手柄可以通过玩家手持发射激光,实现对三维界面或物体的触摸和交互。现在手机也完全实现了这样的功能,控制手机三维模型(或任意模型,如枪)在虚拟世界里转动。
换个说法:手机进入了元宇宙!
下面讲述如何实现,步骤有以下几步:
- 获取手机旋转信息
- 命令发送到三维世界
- 轴向转换
- 角度初始化
一、获取手机旋转数据
Android手机可以直接通过SensorManager获取手机旋转数据,如下面代码拿到的rotator就是手机旋转的四元数数据。
private SensorManager sensorManager;
private Sensor rotationSensor = null;
public static float[] rotator = new float[4];
void init(){
sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
rotationSensor = sensorManager.getDefaultSensor(Sensor.TYPE_ROTATION_VECTOR);
}
@Override
protected void onResume() {
super.onResume();
sensorManager.registerListener(this, rotationSensor, SensorManager.SENSOR_DELAY_GAME);
}
@Override
protected void onPause() {
super.onPause();
sensorManager.unregisterListener(this);
}
@Override
public void onSensorChanged(SensorEvent event) {
if (event.sensor.getType() == Sensor.TYPE_ROTATION_VECTOR) {
rotator = event.values;
// Log.i("dv", String.format("%.2f,%.2f,%.2f,%.2f",rotator[0],rotator[1],rotator[2],rotator[3]));
}
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
二、发送数据到三维世界
拿到手机旋转数据之后,通过局域网内socket把数据传递到三维程序(如Unity或UE4),这里不详述。
三、轴向转换
拿到的手机旋转数据后,由于Android端的旋转坐标轴和三维软件的坐标轴可能对不上,这时需要根据需求做坐标轴的转换。
四、角度初始化
手机的旋转角度是取了陀螺仪、加速度传感器、地磁传感器等数据计算的,最后计算出来的数据是跟真实世界的东南西北方向有关。手机平放在桌面时,手机前方朝向正北,这时获取到手机的纵轴旋转角为0。
可是我们电脑屏幕不会刚好背向正北,很多时候我们需要在手机指向屏幕时,纵轴旋转角为0,这对我们写逻辑比较方便。此时需要做个简单的角度初始化。
初始化的方式很简单,在手机朝向屏幕时,记录此时的角度,然后在以后每次获取到角度时,减去偏移值即可。
五、可以怎么玩?
- 当游戏手柄
待补充
- 控制射击游戏
【开启元宇宙大门】手机当枪玩射击游戏
相关源码地址:
https://mianbaoduo.com/o/bread/mbd-YpaVk55t