此函数作用是生成一个四元数表示的三维朝向,然后可以直接把这个朝向赋给游戏对象来变更其朝向,也可以通过线性插值(Quaternion.Slerp 和 Quaternion.Lerp)来实现游戏对象从当前朝向转到这个新生成的朝向上来。很方便也很好玩的东西,可就是两个参数理解起来太让人头大了……

官网对此函数的参数和解释如下:

Quaternion.LookRotation

static function LookRotation(forward:Vector3,upwards:Vector3=Vector3.up):Quaternion

Description

Creates a rotation that looks along forward with the the head upwards along upwards

Logs an error if the forward direction is zero.

没看懂……没办法,只好在Unity里动手做了一个小场景来试验。试验内容很简单:创建一个第一人称角色控制器,再创建一个浮空的方块,通过在方块的脚本中使用 Quaternion.LookRotation 和 Quaternion.Slerp 来让方块一直保持以正面朝向摄像机(也就是玩家视野),在游戏中当玩家移动时,方块也以一定的速率调整自己的朝向以保持面向玩家;准备妥当之后就运行场景,绕着这个方块猛转圈,并且调整 LookRotation 里的参数取值,观察取值不同时方块旋转的行为变化。折腾了半天,终于找到了一点规律。

  旋转都是相对的,需要有参照系。在三维游戏世界中,一个全局的参照系就是世界坐标系。我们通常说的一个物体从一个朝向转到另一个朝向,其实就是从面向世界坐标系下的一个方向,转变为面向世界坐标系下的另一个方向。这里如果再把 x,y,z 轴的定义加上的话,就变成了:物体自身坐标系的 +z 轴指向,从与世界坐标系下的一个矢量方向相同,转变为与世界坐标系下另一个矢量方向相同。这个说法与我们平时的经验基本一致,但是却少了一点东西。
  三维空间中的旋转有三种方式,对应三个坐标轴——绕x轴的旋转(yaw),绕y轴的旋转(pitch)和绕z轴的旋转(roll),任何旋转都可以由这三种旋转组合出来。按照坐标轴通常的定义,+z 轴方向其实就是物体“面朝”的方向(游戏世界里,一个角色面朝的方向通常就是这个角色自身坐标系的 +z 轴方向)。现在再来看之前的那个说法“物体自身坐标系的 +z 轴指向,从与世界坐标系下的一个矢量方向相同,转变为与世界坐标系下另一个矢量方向相同”,+z 轴指向改变——+z 轴指向可以变成指向空间中的任何一个方向,但这却只涉及到绕 x 轴的旋转和绕 y 轴的旋转,那么绕 z 轴自身的旋转呢?绕 z 轴旋转其实就是面朝方向不变时本体翻转,基本可以认为是侧向翻倒。而就我们的日常经验来说,要面朝一个方向,通常只需要抬头、低头、左转、右转就行了,很少会侧倒。假如我们不想让一个物体在旋转时发生侧向翻倒,那么就需要对物体三维旋转加上一个约束,限制一个旋转自由度(绕 Z 轴旋转的自由度)。

  现在来看 LookRotation 的两个参数,第一个参数 forward,是一个三元组,也就是三个浮点数的组合,这个三元组可以确定世界坐标系下的一个点,从世界坐标系的坐标原点到这个定点就构成了一个三维空间矢量,当我们忽略这个矢量的长度时,它就退化为一个纯粹的方向指示,换句话说,这第一个参数 forward 确定了一个世界坐标系下的方向,而这个方向就是物体转动后 +z 轴所要指向的方向;第二个参数 upwards,也是个三元组(之前没看懂就是没看懂在这个参数上,一致闹不明白这个三元组是干啥用的),这个三元组同样可以确定一个世界坐标系下的方向,物体转动后 x 轴必须与这个方向垂直(如果转动前物体的x轴不满足此条件,那么物体除了改变朝向外还会绕 z 轴旋转以确保转动结束后 x 轴与此方向垂直)。
  假如,我们现在给出两个三元组,那么就定下了世界坐标系下的两个方向——方向 A 和方向 B,然后用 LookRotation 依照这两个三元组生成一个旋转,并将这个旋转应用到一个游戏中的物体上去,那么游戏中的这个物体就会先将自己的面朝方向转到与方向 A 一致,然后绕自己的 z 轴旋转,直到自己的x轴与方向 B 垂直为止(当然了,在对这个旋转过程应用线性插值时,可以看到上述前后两次旋转其实是同步进行的,也就是在同一次旋转中完成)。这里可以再思考一下,有没有可能出现这样的情况:不管物体怎么绕 z 轴转,x 轴都无法与 B 方向垂直。答案是:不可能。因为,既然是绕 z 轴旋转,那么 x 轴的旋转轨迹就构成了一个与 z 轴垂直的平面,x 轴的方向可以是这个平面上的任意一个方向;而空间中的方向 B 必然会在这个平面上产生一个投影,只要与这个投影的方向垂直,就必然与产生投影的空间方向 B 垂直;既然 x 轴方向可以是这个平面上的任意一个方向,那么它就必然可以找到一个方向与投影垂直,也就是 x 轴必然可以找到一个方向与这个方向 B 垂直。

  让我们稍微注意一下 LookRotation 的第二个参数的默认值——Vector3.up,这个三元组所定义的世界坐标系方向,其实就是世界坐标轴 +y 的方向,而与世界坐标轴 +y 垂直的方向其实就是任意的水平方向。那么在默认情况下,使用 LookRotation 生成的旋转会使物体一直保持 x 轴指向水平方向,这恰好就是前面说到的我们通常生活经验中的转向体验(抬头,低头,左转,右转)。

面向组件编程之Unity 11.Quaternion.LookRotation 转自lijing_hi相关推荐

  1. jtable如何从表格中定位_Java Swing组件编程之JTable表格用法实例详解

    本文实例讲述了Java Swing组件编程之JTable表格用法.分享给大家供大家参考,具体如下: 表格是GUI编程中使用较多,但也是最麻烦的一个控件之一.表格是用来显示二维数据,提供编辑,选择等功能 ...

  2. [小雨学编程之C#] 11 描述运算意图的句子:表达式

    上一节我们介绍了承载任务的元数据:变量,也介绍了一些常用的变量. 1.表达式 但是在上一节代码中涉及到了这样的代码a=a+1; 其中在我们理解这段代码的时候,需要将右边的a+1看成一个整体. 其实类似 ...

  3. android的sdk离线安装详细教程,Android编程之SDK安装组件的离线安装方法分享

    本文实例讲述了Android编程之SDK安装组件的离线安装方法.分享给大家供大家参考,具体如下: 这次安装在Android开发环境搭建及配置phoneGap中,搜到了一下资料,留个备份. 一.迅雷下载 ...

  4. unity连接linux服务器,C#编程之C#通过SharpSSH库与Linux服务器建立SSH连接并执行命令...

    本文主要向大家介绍了C#编程之C#通过SharpSSH库与Linux服务器建立SSH连接并执行命令,通过具体的内容向大家展示,希望对大家学习C#编程有所帮助. 在Unity3D项目开发工具时需要用到S ...

  5. [ROS](11)ROS通信 —— 服务(Service)通信编程之srv(C++)(Python)

      文章只是个人学习过程中学习笔记,主要参考ROS教程1 2 3. [ROS](01)创建ROS工作空间 [ROS](02)创建&编译ROS软件包Package [ROS](03)CMakeL ...

  6. C#开发Unity游戏教程之Unity中方法的参数

    C#开发Unity游戏教程之Unity中方法的参数 Unity的方法的参数 出现在脚本中的方法,无论是在定义的时候,还是使用的时候,后面都跟着一对括号"( )",有意义吗?看起来最 ...

  7. Java编程之URI

    http://www.cnblogs.com/keis/archive/2011/03/19/1989071.html Java编程之URI 一旦拥有了URI对象,你就可以通过调用getAuthori ...

  8. Unity中Quaternion的含义及其使用

    官网API文档: file:///Applications/Unity/Unity.app/Contents/Documentation/html/en/ScriptReference/Quatern ...

  9. 原生JDK网络编程之NIO篇

    原生JDK网络编程之NIO篇 一.NIO是什么 NIO库是在JDK1.4中引入的.NIO弥补了原来的I/O的不足,它在标准Java代码中提供了高速的.面向块的I/O.     NIO可以称为 no-b ...

最新文章

  1. 自动驾驶又陷“派系”之争:该约束行人还是让车更完美
  2. C# 中获取CPU序列号/网卡mac地址
  3. 争取做一个良性循环的程序员
  4. mysql 主从 问题_Mysql解决主从不同步问题
  5. web处理高并发措施
  6. linux 解决端口占用
  7. 数据结构-线性相关代码
  8. Java CAS 和ABA问题
  9. 短信网关 php,php使用ICQ网关发送手机短信
  10. bind() 理解 【转】
  11. java从包package中获取所有的Class
  12. 【光学】基于matlab GUI迈克尔逊实验仿真【含Matlab源码 060期】
  13. Java中对象的逃逸分析
  14. 多线程实现 qq 群聊的服务端和客户端
  15. 峰会实录 | 镜舟科技CEO孙文现:基于StarRocks打造企业级极速统一数据分析产品
  16. LINUX软中断-softirq
  17. 蓝牙协议栈消息的关联
  18. 广和通l610二次开发|广和通l610 CAT.1模组opencpu开发《三》阿里云物联网平台mqtt动态注册
  19. 科班演员陶奕菱亮相海南电影节:人生没有白走的路,每一步都算数
  20. 《流量的秘密》读后感

热门文章

  1. 小程序微信支付完整demo源码,包含退款
  2. 电厂/矿井UWB室内定位解决方案
  3. 2020.8.4课堂笔记(IO 缓冲流,对象流)
  4. 【O2O领域】外卖订餐APP用户端Axure原型作品(覆盖外卖APP主流功能)
  5. 在服务器上安装windows操作系统
  6. 【图文详解】python爬虫实战——5分钟做个图片自动下载器
  7. 条款11:在operator=中处理“自我赋值”
  8. 《高效能人士的七个习惯》读书笔记
  9. 可重复读隔离级别如何解决脏读、不可重复读
  10. raid0两块硬盘损坏数据恢复过程