四元数百度百科:  传送门

  四元数官方文档:  传送门

  欧拉旋转、四元数、矩阵旋转之间的差异:  传送门

  四元数转换为欧拉角eulerAngles  官方文档:  传送门

  欧拉角转换为四元数Euler  官方文档:  传送门

  

  Quaternion.LookRotation  官方文档:传送门

  LookRotation()根据对局部坐标轴的描述, 构造对应的代表旋转程度的四元数

一、Transform中四元数和欧拉角

using System.Collections;
using System.Collections.Generic;
using UnityEngine; public class Quaternion : MonoBehaviour { public Transform cube; // Use this for initialization
void Start () {
} // Update is called once per frame
void Update () {
if (Input.GetKeyDown(KeyCode.Space))
{
//获得游戏物体欧拉角
print(cube.eulerAngles);
//获得游戏物体四元数
print(cube.rotation);
}
}
}

Quaternion.cs

  欧拉角:方便开发者在控制面板上观察游戏物体旋转的角度,但旋转轴固定

  四元数:旋转轴可以是任意向量  传送门

    //获得游戏物体欧拉角
print(cube.eulerAngles);
//获得游戏物体四元数
print(cube.rotation);

二、Quaternion.LookRotation  

  场景中创建一个Capsule作为玩家,Sphere作为敌人,给Capsule绑定Quaternion_Gary.cs脚本,要使玩家一致朝向敌人可以用LookRotation()来实现

using System.Collections;
using System.Collections.Generic;
using UnityEngine; public class Quaternion_Gary : MonoBehaviour { public Transform player;
public Transform enemy; // Use this for initialization
void Start () { } // Update is called once per frame
void Update () {
//让player前方向和dir方向保持一致
Vector3 dir = player.position - enemy.position;
player.rotation = Quaternion.LookRotation(dir);
}
}

Quaternion_Gary

    void Update () {
//让player前方向和dir方向保持一致
Vector3 dir = player.position - enemy.position;
player.rotation = Quaternion.LookRotation(dir);
}

  有时以一帧的速度去让玩家转头容易造成不好的体验

  延缓转头速度缓慢,让动画看起来更平滑

using System.Collections;
using System.Collections.Generic;
using UnityEngine; public class Quaternion_Gary : MonoBehaviour { public Transform player;
public Transform enemy; // Use this for initialization
void Start () { } // Update is called once per frame
void Update () {
//让player前方向和dir方向保持一致
Vector3 dir = player.position - enemy.position;
Quaternion target = Quaternion.LookRotation(dir);
player.rotation = Quaternion.Slerp(player.rotation,target,Time.deltaTime);
}
}

Quaternion_Gary.cs

void Update () {
//让player前方向和dir方向保持一致
Vector3 dir = player.position - enemy.position;
Quaternion target = Quaternion.LookRotation(dir);
player.rotation = Quaternion.Slerp(player.rotation,target,Time.deltaTime);
}

最新文章

  1. Servlet中转发和重定向的区别
  2. linux挂载硬盘失败,报错!
  3. erl0010 - erlang查看ets 当前系统使用情况和当前配置上限
  4. iOS开发——语法OC篇&Block回顾
  5. C# 之 HttpWebRequest类
  6. 【转】ListView与RadioButton组合——自定义单选列表
  7. 视差滚动特效图片滑块-Sequence.js
  8. a.变量及基本数据结构
  9. Oracle-表被锁住
  10. PHP拓展配置redis、phalcon
  11. java遍历的优化
  12. c#之多线程之为所欲为
  13. lombok @Accessors用法
  14. Ubuntu下添加Samba用户名与密码
  15. Go语言从入门到放弃(三) 布尔/数字/格式化输出
  16. shell脚本循环和信号
  17. Java获取此次请求URL以及服务器根路径的方法
  18. switch to hexo !
  19. javascript测试框架 Mocha 实例教程
  20. Alone

热门文章

  1. Luogu P5068 [Ynoi2015]我回来了
  2. VMware 无法开机
  3. 基于Keras的OpenAI-gym强化学习的车杆/FlappyBird游戏
  4. TIOBE 7月排行:Python 过分炒作,Perl 成受害者?
  5. shell脚本实战
  6. 华为ensp问题:云映射本地网卡,直连路由器可以ping通,pc却不行?
  7. iptables 设置指定IP客户端访问服务器redis端口
  8. js判断网页标题包含某字符串则替换
  9. PHP的函数获取图片的宽高等信息
  10. eclipse springboot 官网demo启动 SpringApplication类找不到