繁体   English   中英

如何在Unity3D中旋转父级以移动子级?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM