我需要一个函数来计算新的偏移量位置,该位置采用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;
}
- 获取子游戏对象本地位置的
Quaternion.LookRotation
。这是childStartRot
。(在开始时计算,或仅在更改时计算( - 获取子游戏对象的局部位置的大小(或与0的距离(。可以通过获取子对象的本地位置的
.magnitude
属性来计算此值。这是childMag
(在开始时计算,或仅在更改时计算( - 获取父次子的总旋转。此链接解释了如何添加四元数(非交换(旋转。这是
combinedRot
。(这会更新每帧( - 这个旋转的点是";看着";等于CCD_ 6。这是
pointOnRot
- 规范化
pointOnRot
。然后将pointOnRot
乘以childMag
得到偏移位置 - 子对象的位置等于
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.
}