[Unity 3D] Quaternion.LookRotation
static function LookRotation (forward : Vector3, upwards : Vector3 = Vector3.up) : QuaternionDescriptionCreates a rotation that looks along forward with the the head upwards along upwards Logs an error if the forward direction is zero. |
试验内容非常easy:创建一个第一人称角色控制器。再创建一个浮空的方块,通过在方块的脚本中使用 Quaternion.LookRotation 和 Quaternion.Slerp 来让方块一直保持以正面朝向摄像机(也就是玩家视野),在游戏中当玩家移动时,方块也以一定的速率调整自己的朝向以保持面向玩家。准备妥当之后就执行场景,绕着这个方块猛转圈,而且调整 LookRotation 里的參数取值,观察取值不同一时候方块旋转的行为变化。
折腾了半天。最终找到了一点规律。
我们通常说的一个物体从一个朝向转到还有一个朝向。事实上就是从面向世界坐标系下的一个方向。转变为面向世界坐标系下的还有一个方向。这里假设再把 x,y,z 轴的定义加上的话。就变成了:物体自身坐标系的 +z 轴指向。从与世界坐标系下的一个矢量方向同样,转变为与世界坐标系下还有一个矢量方向同样。这个说法与我们平时的经验基本一致。可是却少了一点东西。
如今再来看之前的那个说法“物体自身坐标系的 +z 轴指向,从与世界坐标系下的一个矢量方向同样,转变为与世界坐标系下还有一个矢量方向同样”,+z 轴指向改变——+z 轴指向能够变成指向空间中的不论什么一个方向,但这却仅仅涉及到绕 x 轴的旋转和绕 y 轴的旋转,那么绕 z 轴自身的旋转呢?绕 z 轴旋转事实上就是面朝方向不变时本体翻转,基本能够觉得是側向翻倒。而就我们的日常经验来说,要面朝一个方向,通常仅仅须要抬头、低头、左转、右转即可了,非常少会側倒。假如我们不想让一个物体在旋转时发生側向翻倒,那么就须要对物体三维旋转加上一个约束,限制一个旋转自由度(绕 Z 轴旋转的自由度)。
答案是:不可能。由于,既然是绕 z 轴旋转。那么 x 轴的旋转轨迹就构成了一个与 z 轴垂直的平面,x 轴的方向能够是这个平面上的随意一个方向;而空间中的方向 B 必定会在这个平面上产生一个投影。仅仅要与这个投影的方向垂直。就必定与产生投影的空间方向 B 垂直。既然 x 轴方向能够是这个平面上的随意一个方向,那么它就必定能够找到一个方向