基于父变换获取新的子对象位置



我需要一个函数来计算新的偏移量位置,该位置采用2个参数旧偏移量和旋转值(旋转只是一个浮动,因为旋转总是只围绕1个轴发生。我设法找到了如何根据旋转计算面向方向,但我在偏移方面遇到了问题。找到了类似的主题,但除了制作子对象之外没有答案,这不是一个好方法。所以像这样的代码

var offset = new Vector3(0f,5f,10f);
var rotationY = 90f;
var newOffset = NeededFunction(offset, rotationY);

newOffset应该是Vector3(10f,5f,0f(。这是计算朝向的函数

private Vector3 GetFacingDirection()
{
var rotY = transform.eulerAngles.y;
var vector = Quaternion.AngleAxis(rotY, Vector3.up)
* Vector3.forward;
return vector;
}
  1. 获取子游戏对象本地位置的Quaternion.LookRotation。这是childStartRot。(在开始时计算,或仅在更改时计算(
  2. 获取子游戏对象的局部位置的大小(或与0的距离(。可以通过获取子对象的本地位置的.magnitude属性来计算此值。这是childMag(在开始时计算,或仅在更改时计算(
  3. 获取的总旋转。此链接解释了如何添加四元数(非交换(旋转。这是combinedRot。(这会更新每帧(
  4. 这个旋转的点是";看着";等于CCD_ 6。这是pointOnRot
  5. 规范化pointOnRot。然后将pointOnRot乘以childMag得到偏移位置
  6. 子对象的位置等于pointOnRot+父对象的位置

示例脚本:

public Quaternion parentRot; //change whenever in play mode
public Vector3 parentPos; //change whenever in play mode
public Vector3 childPos;
Quaternion childStartRot;
float childMag;
void Start()
{
Vector3 local = parentPos - childPos;
childStartRot = Quaternion.LookRotation(local);
childMag = local.magnitude;
}
void Update()
{
Quaternion combinedRot = parentRot * childStartRot;
Vector3 pointOnRot = Vector3.forward * combinedRot;
pointOnRot = pointOnRot.normalized * childMag;
Vector3 output = pointOnRot + parentPos;
//set child object position to output.
}

相关内容

  • 没有找到相关文章

最新更新