在研究一个特殊效果,需要用一个向量去控制一组向量的旋转或朝向,
请注意:
1请关注问题本身,不要反问为什么需要这样的功能,也不要问这样的功能用来干什么
2我只想知道可不可以实现
3如果能实现,怎样实现,具体算法是什么
4多少钱可以解决
具体问题:
有归一化向量a(x,y,z),xyz取值在-1到1之间,初始值为(0,0,1)
有一组归一化向量,b、c、d、e等,方向随机
所有向量都只能获取到每个分量的值,并不能获得每个轴向的旋转值
求算法:
假如a向量沿x轴转若干度(向量自发旋转,并不能获得向量旋转的角度,但向量的数值会发生改变,可能需要根据向量的数值反推向量旋转了多少度),使得bcde等向量也沿向量a的x轴做同样旋转。
以下演示图片以旋转45度为例:(实际情况旋转角度未知)
再沿a向量y轴转若干度,bcde等向量也沿向量a的y轴做同样旋转。
以下演示图片以旋转45度为例:(实际情况旋转角度未知)
总是就是向量a怎么转,其他向量也跟着怎么转
注意要能处理多个轴向
可以解决,有点类似3D模型里面骨架的应用,父关节带动子关节
这种题目如果你学过一点线性代数的话很好做的。
假设一个向量a(Xa,Ya,Za)绕x轴旋转A度,变换矩阵记为Rx,
假设一个向量b(Xb,Yb,Zb)绕y轴旋转B度,变换矩阵记为Ry,
假设一个向量c(Xc,Yc,Zc)绕z轴旋转C度,变换矩阵记为Rz,
那么有
Rx=[[1, 0, 0 ],
[0, cos(A), -sin(A)],
[0, sin(A), cos(A)]]
Ry=[[cos(B), 0, sin(B)],
[0, 1, 0],
[-sin(B), 0, cos(B)]]
RZ=[[cos(C), -sin(C), 0],
[sin(C), cos(C), 0],
[0, 0, 1]]
所以如果a旋转之后是b,b旋转之后是c,那么就有公式如下:
Rx*a=b //(这里的*是矩阵运算),
Ry*b=c //
//上面两个式子合并起来就是a->c的变换矩阵
Ry*Rx*a=c
而如果是
Rz*Rx*Ry *a=c
则a表示先绕y轴旋转,再绕x轴,最后绕z轴旋转,最后变成c
所以你的题目只要把角度带进去就行了,再补充一个矩阵*运算的计算过程
只要你的其他向量跟控制向量的关系是可以计算的,那就可以实现。比如相对角度不变、比如是父子关系等等。自己计算的话需要用到矩阵,unity引擎的话就比较简单,内置有各种坐标转换函数可以用。