Unity3D基于陀螺仪实现VR相机功能
来源:互联网 发布:信用卡账单修改软件 编辑:程序博客网 时间:2024/06/05 21:08
Unity自带陀螺仪功能,今天就利用陀螺仪实现一个VR相机功能。步骤如下:
- 打开Unity,创建一个新的C#脚本GyroController.cs,并挂在MainCamera游戏对象上,如图:代码如下:
using UnityEngine;using System.Collections;public class GyroController : MonoBehaviour{ // Fields private readonly Quaternion baseIdentity = Quaternion.Euler(90f, 0f, 0f); private Quaternion baseOrientation = Quaternion.Euler(90f, 0f, 0f); private Quaternion baseOrientationRotationFix = Quaternion.identity; private Quaternion calibration = Quaternion.identity; private Quaternion cameraBase = Quaternion.identity; private bool debug = true; public static bool gyroAvaiable; private bool gyroEnabled = true; private Quaternion gyroInitialRotation; public static bool gyroOff; private Quaternion initialRotation; private readonly Quaternion landscapeLeft = Quaternion.Euler(0f, 0f, -90f); private readonly Quaternion landscapeRight = Quaternion.Euler(0f, 0f, 90f); private const float lowPassFilterFactor = 0.1f; private Quaternion offsetRotation; private Quaternion referanceRotation = Quaternion.identity; private readonly Quaternion upsideDown = Quaternion.Euler(0f, 0f, 180f); // Methods private void AttachGyro() { this.gyroEnabled = true; this.ResetBaseOrientation(); this.UpdateCalibration(true); this.UpdateCameraBaseRotation(true); this.RecalculateReferenceRotation(); } private void Awake() { gyroAvaiable = SystemInfo.supportsGyroscope; } private static Quaternion ConvertRotation(Quaternion q) { return new Quaternion(q.x, q.y, -q.z, -q.w); } private void DetachGyro() { this.gyroEnabled = false; } private Quaternion GetRotFix() { return Quaternion.identity; } private void RecalculateReferenceRotation() { this.referanceRotation = Quaternion.Inverse(this.baseOrientation) * Quaternion.Inverse(this.calibration); } private void ResetBaseOrientation() { this.baseOrientationRotationFix = this.GetRotFix(); this.baseOrientation = this.baseOrientationRotationFix * this.baseIdentity; } protected void Start() { Input.gyro.enabled = true; base.enabled = true; this.AttachGyro(); this.initialRotation = base.transform.localRotation; this.gyroInitialRotation = Input.gyro.attitude; } private void Update() { gyroOff = PlayerPrefs.GetInt("gyro-off") == 1; if (this.gyroEnabled ) { base.transform.localRotation = Quaternion.Slerp(base.transform.localRotation, this.cameraBase * (ConvertRotation(this.referanceRotation * Input.gyro.attitude) * this.GetRotFix()), 0.5f);//0.1f } } private void UpdateCalibration(bool onlyHorizontal) { if (onlyHorizontal) { Vector3 toDirection = (Vector3) (Input.gyro.attitude * -Vector3.forward); toDirection.z = 0f; if (toDirection == Vector3.zero) { this.calibration = Quaternion.identity; } else { this.calibration = Quaternion.FromToRotation((Vector3) (this.baseOrientationRotationFix * Vector3.up), toDirection); } } else { this.calibration = Input.gyro.attitude; } } private void UpdateCameraBaseRotation(bool onlyHorizontal) { if (onlyHorizontal) { Vector3 forward = base.transform.forward; forward.y = 0f; if (forward == Vector3.zero) { this.cameraBase = Quaternion.identity; } else { this.cameraBase = Quaternion.FromToRotation(Vector3.forward, forward); } } else { this.cameraBase = base.transform.rotation; } }}
- 在相机MainCamera下创建一个新的Camera相机,并改变两个相机的Viewport Rect属性,以将屏幕均分,如图:
- 在场景中创建一个Cube,效果如图:
- 保存场景,打包成apk即可。即可使用手机陀螺仪控制相机旋转了。
阅读全文
1 0
- Unity3D基于陀螺仪实现VR相机功能
- 基于Unity3D的相机功能的实现(一)——VR相机
- 基于Unity3D的相机功能的实现(二)——AR相机
- 基于Unity3D的相机功能的实现(三)——第一人称相机(FPS)
- 基于Unity3D的相机功能的实现(四)——第三人称相机(TPS)
- 基于Unity3D的相机功能的实现(五)—— 相机跟随
- unity3d实现LOL中的相机控制功能
- 基于Unity3D的相机功能的实现(七)—— 综合篇
- 基于Unity3D的相机功能的实现(八)—— 收藏篇
- 基于Unity3D的相机功能的实现(六)—— 上帝视角(王者荣耀视角)
- 基于Unity3D的相机震动效果的实现
- Unity3d 陀螺仪
- Unity3D 陀螺仪
- Unity3d 防止相机“穿墙”功能
- 【虚拟现实】Unity3D+VR的实现
- 基于opencv的相机之调整功能实现(七)
- 基于opencv的相机之特效功能实现(八)
- 基于opencv的相机之马赛克功能实现(九)
- idea intellij main方法 [public static void main(String[] args) 快速生成]
- 字符串的大小比较
- 【UNP学习笔记】一个简单的服务器/客户端程序
- Spring boot 使用 Redis 缓存
- 12,mac phpstorm xdebug
- Unity3D基于陀螺仪实现VR相机功能
- 常用数据结构与算法
- 【Python-3.5】绘制随机漫步图
- bzoj 4002: [JLOI2015]有意义的字符串(特征根法+矩阵快速幂)
- linux下内核模块的加载与卸载
- hibernatetools-Update-4.1.1.Final插件安装
- tensorflow手写体识别(一)
- java基础—连接MySQL数据库的2种常用方式(传统方式和c3p0连接池)
- 从键盘输入一个正整数n,若能同时被3、5和7整除,则输出“Yes”,否则输出“No”