Unity中的偏心旋转对象
Off-center rotate object in Unity
我在 Unity3D 中有一个激光炮塔,我想将其转向敌人。炮塔由一个"leg"和一个"head"组成(图中选择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);
问题是,由于头部的枢轴没有对准激光束,炮塔转向几乎正确的方向,但它在目标上方射击。 (如果激光从枢轴的红轴出来,它会完美命中。)
除了自己进行计算之外,是否有内置方法或一些技巧来实现正确的功能?
好的,这是执行此操作的快捷方式。可能 "better" 使用适当的触发来完成它,但这应该很快就会给你想要的结果:
如果您还没有与枪管对齐的变换,请创建一个空的游戏对象并将其对齐(确保它是炮塔的子对象,以便它们一起移动)。添加对脚本的引用以进行转换。
然后,在第一行中,从新的 Barrel 变换而不是 turretHead 变换计算。保持其他一切不变。这样它从炮塔桶计算,但移动炮塔头。
现在,这种方法并不完美。如果枢轴中心与桶形变换的偏移太大,那么在进行大动作时,或者在瞄准附近的东西时,它的准确性就会降低,因为由于旋转枢轴在别处,瞄准时的预期位置将不同于初始位置.但这可以通过迭代来解决,因为计算越接近预期目标就会越准确。
我在 Unity3D 中有一个激光炮塔,我想将其转向敌人。炮塔由一个"leg"和一个"head"组成(图中选择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);
问题是,由于头部的枢轴没有对准激光束,炮塔转向几乎正确的方向,但它在目标上方射击。 (如果激光从枢轴的红轴出来,它会完美命中。)
除了自己进行计算之外,是否有内置方法或一些技巧来实现正确的功能?
好的,这是执行此操作的快捷方式。可能 "better" 使用适当的触发来完成它,但这应该很快就会给你想要的结果:
如果您还没有与枪管对齐的变换,请创建一个空的游戏对象并将其对齐(确保它是炮塔的子对象,以便它们一起移动)。添加对脚本的引用以进行转换。
然后,在第一行中,从新的 Barrel 变换而不是 turretHead 变换计算。保持其他一切不变。这样它从炮塔桶计算,但移动炮塔头。
现在,这种方法并不完美。如果枢轴中心与桶形变换的偏移太大,那么在进行大动作时,或者在瞄准附近的东西时,它的准确性就会降低,因为由于旋转枢轴在别处,瞄准时的预期位置将不同于初始位置.但这可以通过迭代来解决,因为计算越接近预期目标就会越准确。