Quaternion * Vector3就是Vector3进行一次Quaternion 旋转。理论总是枯燥的,下面以实际项目代码为例,这是简化之后的部分项目代码:(c#)
Vector3 directionVector = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical")); Vector3 movingDirection = transform.rotation * directionVector;
代码的目的就是计算出当前帧人物应该移动的方向。提一下这是一个FPS项目,即第一人称射击类,当玩家按住向右移动时,人物的旋转是不变的,只是移动
方向相对于玩家是向右,理解这一点很重要。
那么为什么movingDirection就是当前帧人物应该移动的方向呢?
我们不妨假设directionVector=(1,0,1);这就表示玩家想让人物向右移动的同时向前移动,且移动量相同。
至于具体的移动量没有意义,我们随便加一个系数就可以调节移动快慢。
我们再假设transform.rotation对应的欧拉角度为(0,0,0);如图:(transform.rotation是Quateration类型,很抽象,对应的欧拉角度则非常直观)
这时,人物相对于世界坐标系没有任何旋转,再由假设的directionVector=(1,0,1);即当玩家同时按下向前和向右移动的按键时,人物移动的方向向量将是(1,0,1);
又我们已经假设transform.rotation对应的欧拉角度为(0,0,0);即没有旋转,
则transform.rotation*directionVector得到的结果还是(1,0,1);
这是最简单的情形,接下来,我们假设transform.rotation对应的欧拉角度为(0,45,0);即当前人物相对于世界坐标系是有一个45度旋转量的,
由假设的directionVector=(1,0,1);即当玩家同时按下向前和向右移动的按键时,人物将向正右前方向移动,显然我们直观判断人物移动的方向向量应该是(1,0,0);
那么怎么计算呢?由我们假设的transform.rotation对应的欧拉角度为(0,45,0);
所以ransform.rotation*directionVector就是让directionVector绕Y轴旋转45度,(1,0,1)绕Y轴旋转45度不就是(1,0,0)吗?
由这两个特殊的角度,现在大家应该可以理解ransform.rotation*directionVector就是当前帧人物应该移动的方向了吧。
最后,之所以说这是简化代码,实际项目中代码不可能是这么写的,
Vector3 directionVector = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));
Vector3 movingDirection = transform.rotation * directionVector;
大家可能想到了还应该有速度调节系数,此外,由于directionVector与GetAxis是线性关系,那么效果会很生硬,玩家只要一按下方向键人物就会移动,
这种方式用来对付CF这种网游还可以(网游要的是灵敏,不是真实),而玩过孤岛惊魂,使命召唤等的伙伴们就知道,人物移动有一个很明显的加速过程,
这个过程要求directionVector与GetAxis呈类似Y=X*X这样的幂次关系,如:
Vector3 directionVector = new Vector3(Input.GetAxis("Horizontal")*Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical")*Input.GetAxis("Vertical"));