Unity缺陷:怎样让某个旋转轴对齐某个方向
在之前的文章中,我谈到,由于希望将humanoid骨骼的旋转和openpose的2d方向对齐——也就是将localRotation的某个旋转轴对齐一个dir:

我直接设置了transform.up=dir,因为我看到接口里这个forward,up,right都是{get,set},以为set的时候能好好处理。
结果tmd不能,改了方向之后,其他的两个轴方向也“乱”了,在之前文章中,我是硬在其他轴上判断,转了180度:
结果现在发现有的时候变成了偏转90度,这就很蛋疼了,总不能所有角度都判断太烦了。

所以还是得彻底解决这个“让某个旋转轴对齐某个方向”的问题。
Unity的直接set我估计是直接调用了lookDirection之类的,根本没考虑细节,所以结果只能保证这个轴准确,其他轴就随缘(不过因为这个细节也很复杂,很custom,所以可以理解)。
细化问题
对于一个已有的rot1(xdir,ydir,zdir),假设我们需要让right对齐一个新方向newX,组成rot2。那么实际上是在保证rot2.xdir == newX的前提下,“尽量”让rot2.y/zdir“接近”rot的y/zdir。

那么,怎样是“尽量接近”呢?
有太多种标准:y2与原先共面/z2与原先共面/角度差和最小/角度差最平均...
看实际应用,由于openpose出来基本可以对上humanoid,所以都能接受,选一个最简单的y2与原先共面,可以数学推导一下,我就略过推导过程了,条件有如下:
y2=ax1+by1; //共面条件
dot(x2,y2)==0; //垂直条件
b=k*a; //用来消a,其余共线情况代码额外判断
推导结果:
k = -dot(x1,x2)/dot(y1,x2)
代入求出y2即可。
整个函数代码:
