很久都没有更新博客啦,最新会更新AR相关的东西。
3D镜头旋转效果,刚开始一脸懵逼,真的不知道自己从那里下手,不是自己单独控制镜头的旋转角度,而是要获取到玩家的旋转信息。刚开始打算使用插件来实现效果,但是太贵,限制了自己的行动力,于是只能自己写啦。
-
基础知识介绍:
Gyroscope -
Gyroscope.enabled(设置陀螺仪是启用的状态) 【input.gyro.enabled=true;】
-
Input.gyro (返回一个默认的陀螺仪)
-
Gyroscope.attitude(返回设备的空间方向)
-
Gyroscope.rotationRate(返回陀螺仪的转速,以弧度为单位,每秒钟绕三个轴旋转的速度)
-
Gyroscope.rotationRateUnbiased(返回没有偏差的陀螺仪转速)
-
Gyroscope.updateInterval(设置陀螺仪的间隔)
-
Gyroscope.gravity(public Vector3 gravity;重力加速度的矢量)
-
Gyroscope.userAcceleration(用户的加速度)
-
四元素
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class QuaternionTest : MonoBehaviour {
public Transform target;
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
Vector3 relativePos = target.position - transform.position;//计算两物体之间的距离(两个点可以表示矢量的大小和方向)
Quaternion rotation = Quaternion.LookRotation(relativePos, Vector3.up);
transform.rotation = rotation;
}
}
初识状态:
game状态:
水平和垂直方向上是看不出变化的,因为向量也是水平或者垂直的。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class QuaternionTest : MonoBehaviour {
public Transform target;
// Use this for initialization
void Start () {
Quaternion angle = Quaternion.Euler(-0.82f, 0.97f, -169.8f);
transform.rotation = angle;
}
// Update is called once per frame
void Update () {
}
}
初始状态:
game状态:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class QuaternionTest : MonoBehaviour {
public Transform target;
// Use this for initialization
void Start () {
Quaternion angle = Quaternion.Slerp(transform.rotation, target.rotation, 1f);
transform.rotation = angle;
}
// Update is called once per frame
void Update () {
}
}
初始:
game:
- 实现:
- 注意:陀螺仪采用的是右手坐标系,而unity里面采用的是左手坐标系:(将右手坐标转成左手坐标)
关键在与变换z轴
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ThreeDRotate : MonoBehaviour
{
private const float slerpFactor = 0.5f;
private void Start()
{
Input.gyro.enabled = true;//打开gyso
Input.gyro.updateInterval = 0.05f;//设置陀螺仪的间隔;
}
private void Update()
{
if (Input.gyro.enabled)
{
transform.rotation = Quaternion.Slerp(transform.rotation, ConvertRotation(Input.gyro.attitude), slerpFactor);
}
}
private Quaternion ConvertRotation(Quaternion q)
{
return Quaternion.Euler(90, 0, 0) * new Quaternion(-q.x, -q.y, q.z, q.w);
}
}