Unity实现向量跟随/旋转跟随

最近想对人物骨骼做一些旋转操作,但遇到了一些问题,于是研究了一下如何在unity中实现向量跟随/旋转跟随

问题定义

以存在两对节点ParentJoint_master和ChildJoint_master,ParentJoint_slave和ChildJoint_slave,ChildJoint作为ParentJoint的子物体,希望实现ParentJoint_slave和ChildJoint_slave之间向量的指向与ParentJoint_master和ChildJoint_master之间向量指向方向相同,也就是一个向量能够不断跟随另一个向量。

解决方案

这个问题的难点在于ParentJoint_slave默认的旋转角度不为0,因此我们无法直接将ParentJoint_slave的旋转设置为与ParentJoint_master相同。因此需要先计算两个向量之间的旋转角度与方向,用四元数表示,再在ParentJoint_slave默认旋转角度的基础上进行与两向量之间旋转角度方向相同的旋转
具体代码如下:

Vector3 oldarmVector = childJoint_slave.position - parentJoint_slave.position;
Vector3 newarmVector = childJoint_master.position - parentJoint_master.position;
Quaternion q = Quaternion.identity;
q.SetFromToRotation(oldarmVector, newarmVector);
Debug.Log("newarmVector:  " + newarmVector.ToString("f4"));
Debug.Log("oldarmVector(before rotation):  " + oldarmVector.ToString("f4"));
parentJoint_slave.rotation = q * parentJoint_slave.rotation;
Debug.Log("oldarmVector(after rotation):  " + (childJoint_slave.position - parentJoint_slave.position).ToString("f4"));

需要注意的是四元数乘法顺序,q * parentJoint_slave.rotation代表先进行parentJoint_slave.rotation的旋转,再进行q的旋转

实验结果

ParentJoint_slave的默认旋转角度不为0

在这里插入图片描述
Play以后得到两个向量朝向相同

在这里插入图片描述
在这里插入图片描述
最终效果
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/shanwenkang/article/details/103663931
今日推荐