[英]How to rotate parent to move child in Unity3D?
我有一个相对复杂的数学问题,需要解决在Unity中开发的游戏。 我已经尝试了几件事,但是没有任何效果。
基本上,我需要对父级应用偏移旋转(四元数),这种旋转的结果是将其子级沿给定方向移动。
为了更好地解释它,如果可以保证将父级的前向向量指向孩子,则问题将很简单。 然后,我将通过向子级添加所需的方向来简单地创建幻影位置,然后使用LookAt旋转来旋转父级以查看该幻影位置。 (不需要将孩子放在特定的位置,只需要大致朝那个方向移动即可)
使这一点变得复杂的原因是:A.父级可以处于任何旋转位置,而B.子级可以位于相对于父级的任何位置。
就上下文而言,我正在研究程序动画系统,我希望骨骼沿Agent的速度方向弯曲。 使用IK骨骼,这很容易,只需移动IK。 但是对于实际的骨骼,我需要一种方法,可以通过旋转其父级的骨骼来沿某个方向移动骨骼。
谢谢你的帮助!
首先,我们需要在父母的坐标系中拥有孩子的当前位置和目标位置。 听起来好像孩子的位置已经在此坐标系中表示出来了。 然后,如果目标位置在世界坐标中,则只需使用逆父世界变换来执行此操作:
pTargetLocal = parent.worldMatrix^-1 * pTarget
一旦有了这个,我们想找到一个旋转R
,这样pCurrentLocal
会朝pTargetLocal
旋转。 假设单位向量(因为旋转保留长度),则等于:
parent.worldMatrix * pTargetLocal = parent.worldMatrix * R * pCurrentLocal
pTargetLocal = R * pCurrentLocal
一旦有了R
,我们只需要更新parent.worldMatrix = parent.worldMatrix * R
。
这可以通过以轴角格式表示R
来解决。 轴为axis = Vector3.Cross(pCurrentLocal, pTargetLocal)
,角度为angle = Vector3.Angle(pCurrentLocal, pTargetLocal)
。 您可以根据这些参数计算四元数或矩阵,然后将其与当前的父变换相乘。
我假设旋转中心是父级局部坐标系的原点。 您还可以围绕另一个中心旋转以合并翻译组件。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.