Unity缺陷:怎樣讓某個(gè)旋轉(zhuǎn)軸對(duì)齊某個(gè)方向
在之前的文章中,我談到,由于希望將humanoid骨骼的旋轉(zhuǎn)和openpose的2d方向?qū)R——也就是將localRotation的某個(gè)旋轉(zhuǎn)軸對(duì)齊一個(gè)dir:

我直接設(shè)置了transform.up=dir,因?yàn)槲铱吹浇涌诶镞@個(gè)forward,up,right都是{get,set},以為set的時(shí)候能好好處理。
結(jié)果tmd不能,改了方向之后,其他的兩個(gè)軸方向也“亂”了,在之前文章中,我是硬在其他軸上判斷,轉(zhuǎn)了180度:
結(jié)果現(xiàn)在發(fā)現(xiàn)有的時(shí)候變成了偏轉(zhuǎn)90度,這就很蛋疼了,總不能所有角度都判斷太煩了。

所以還是得徹底解決這個(gè)“讓某個(gè)旋轉(zhuǎn)軸對(duì)齊某個(gè)方向”的問(wèn)題。
Unity的直接set我估計(jì)是直接調(diào)用了lookDirection之類的,根本沒考慮細(xì)節(jié),所以結(jié)果只能保證這個(gè)軸準(zhǔn)確,其他軸就隨緣(不過(guò)因?yàn)檫@個(gè)細(xì)節(jié)也很復(fù)雜,很custom,所以可以理解)。
細(xì)化問(wèn)題
對(duì)于一個(gè)已有的rot1(xdir,ydir,zdir),假設(shè)我們需要讓right對(duì)齊一個(gè)新方向newX,組成rot2。那么實(shí)際上是在保證rot2.xdir == newX的前提下,“盡量”讓rot2.y/zdir“接近”rot的y/zdir。

那么,怎樣是“盡量接近”呢?
有太多種標(biāo)準(zhǔn):y2與原先共面/z2與原先共面/角度差和最小/角度差最平均...
看實(shí)際應(yīng)用,由于openpose出來(lái)基本可以對(duì)上humanoid,所以都能接受,選一個(gè)最簡(jiǎn)單的y2與原先共面,可以數(shù)學(xué)推導(dǎo)一下,我就略過(guò)推導(dǎo)過(guò)程了,條件有如下:
y2=ax1+by1; //共面條件
dot(x2,y2)==0; //垂直條件
b=k*a; //用來(lái)消a,其余共線情況代碼額外判斷
推導(dǎo)結(jié)果:
k = -dot(x1,x2)/dot(y1,x2)
代入求出y2即可。
整個(gè)函數(shù)代碼:
