Unity中的偏心旋转对象

时间:2019-01-13 11:17:31

标签: c# unity3d 3d rotation quaternions

我在Unity3D中有一个激光炮塔,我想转向敌人。炮塔由“腿”和“头”(在图片1中选择)组成。头部可以围绕球形关节平移和倾斜。

我执行以下操作:

    Vector3 targetDir = collision.gameObject.transform.position - turretHead.transform.position;
    float step = turnSpeed * Time.deltaTime;
    Vector3 newDir = Vector3.RotateTowards(turretHead.transform.forward, targetDir, step, 0.0f);
    turretHead.transform.rotation = Quaternion.LookRotation(newDir);

问题在于,由于头部的枢轴未与激光束对齐,因此转塔向几乎正确的方向旋转,但会向目标上方射击。 (如果激光会从枢轴的红色轴上射出来,那会很完美。)

除了自己进行计算之外,是否有内置方法或技巧来实现正确的功能?

Turret

1 个答案:

答案 0 :(得分:1)

好的,这是执行此操作的快速简便的方法。通过适当的触发操作可能会“更好”,但这应该可以使您快速获得所需的结果:

如果尚未有与枪管对齐的变换,则创建一个空的GameObject并将其对齐(确保它是炮塔的子代,以便它们一起移动)。添加对脚本进行转换的引用。

然后,在第一行中,根据新的Barrel变换而不是turretHead变换进行计算。保留其他所有内容。这样,它就可以从转塔枪管中进行计算,但可以移动转塔头。

现在,这种方法并不完美。如果枢轴中心与桶形变换的偏移量太大,则在大幅度移动时或在瞄准附近物体时精度会较差,因为由于旋转枢轴位于其他位置,所以瞄准时的预期位置将与初始位置不同。但这可以通过迭代来解决,因为计算越接近期望的目标,它的计算就会越准确。