在 Unity 中旋转对象时,脚本不会在 Z 轴上旋转对象,仅在 X 和 Y 轴上旋转?
When rotating an object in Unity, the script doesn't rotate the object on the Z-axis, only the X and Y?
我有一个矩形立方体,需要放置在另外两个物体之间,它会适当旋转,以便每一端都面向这两个物体。由于这发生在球形世界上,问题在于当我尝试将其对齐以正确面向“向上”时。我以前没有意识到这一点,但是这段代码(它适用于其他对象,因为它们只需要定向一次)只使用 X 轴和 Y 轴。我可以通过在编辑器中修改 Z 轴来手动正确定位它们,所以我知道这是可能的,但由于它们必须按程序创建,这显然是不可行的。从 transform.up 更改为向下或向右完全没有任何变化。
在下面的代码中,parent 是它必须朝向的对象之一(它做得很好),target 是球体的中心。
理论上对齐两侧的物体应该只需要使用X和Y轴,而对齐球体的中心则只需要使用最后一行表示的Z轴代码,但在实践中这不起作用,因为两种对齐方式都只想使用 X 轴和 Y 轴而忽略 Z 轴。
Vector3 parentDirection = parent.transform.position - transform.position;
Vector3 targetDirection = target.position - transform.position;
Vector3 DirectionToParent = Vector3.RotateTowards(transform.forward, parentDirection, 100f, 0.0f);
Vector3 CenterDiretion = Vector3.RotateTowards(transform.forward, targetDirection, 100f, 0.0f);
Quaternion ParentRotation = Quaternion.LookRotation(DirectionToParent );
Quaternion CenterRotation = Quaternion.LookRotation(CenterDiretion );
transform.rotation = Quaternion.Euler(DirectionToParent.eulerAngles.x, DirectionToParent.eulerAngles.y, newRotation.eulerAngles.z);
问题中显示的代码不起作用,因为它在计算 transform.rotation
时没有考虑 to/away 行星中心的方向。
相反,我建议只使用 Quaternion.LookRotation
来分配旋转,该旋转会产生您在 parentDirection 中所拥有的正向,并且最接近地球的向上方向。
Vector3 upDirection = transform.position - target.position;
transform.rotation = Quaternion.LookRotation(parentDirection, upDirection);
如果您需要根据某个最大速度更改旋转,只需将 Quaternion.LookRotation
的结果分配给变量,将 transform.rotation
的 Quaternion.RotateTowards
分配给 transform.rotation
根据需要:
private float turnVelocity = 100f;
// ...
Vector3 upDirection = transform.position - target.position;
Quaternion goalRot = Quaternion.LookRotation(parentDirection, upDirection);
transform.rotation = Quaternion.RotateTowards(transform.rotation, goalRot,
turnVelocity * Time.deltaTime);
}
我有一个矩形立方体,需要放置在另外两个物体之间,它会适当旋转,以便每一端都面向这两个物体。由于这发生在球形世界上,问题在于当我尝试将其对齐以正确面向“向上”时。我以前没有意识到这一点,但是这段代码(它适用于其他对象,因为它们只需要定向一次)只使用 X 轴和 Y 轴。我可以通过在编辑器中修改 Z 轴来手动正确定位它们,所以我知道这是可能的,但由于它们必须按程序创建,这显然是不可行的。从 transform.up 更改为向下或向右完全没有任何变化。
在下面的代码中,parent 是它必须朝向的对象之一(它做得很好),target 是球体的中心。
理论上对齐两侧的物体应该只需要使用X和Y轴,而对齐球体的中心则只需要使用最后一行表示的Z轴代码,但在实践中这不起作用,因为两种对齐方式都只想使用 X 轴和 Y 轴而忽略 Z 轴。
Vector3 parentDirection = parent.transform.position - transform.position;
Vector3 targetDirection = target.position - transform.position;
Vector3 DirectionToParent = Vector3.RotateTowards(transform.forward, parentDirection, 100f, 0.0f);
Vector3 CenterDiretion = Vector3.RotateTowards(transform.forward, targetDirection, 100f, 0.0f);
Quaternion ParentRotation = Quaternion.LookRotation(DirectionToParent );
Quaternion CenterRotation = Quaternion.LookRotation(CenterDiretion );
transform.rotation = Quaternion.Euler(DirectionToParent.eulerAngles.x, DirectionToParent.eulerAngles.y, newRotation.eulerAngles.z);
问题中显示的代码不起作用,因为它在计算 transform.rotation
时没有考虑 to/away 行星中心的方向。
相反,我建议只使用 Quaternion.LookRotation
来分配旋转,该旋转会产生您在 parentDirection 中所拥有的正向,并且最接近地球的向上方向。
Vector3 upDirection = transform.position - target.position;
transform.rotation = Quaternion.LookRotation(parentDirection, upDirection);
如果您需要根据某个最大速度更改旋转,只需将 Quaternion.LookRotation
的结果分配给变量,将 transform.rotation
的 Quaternion.RotateTowards
分配给 transform.rotation
根据需要:
private float turnVelocity = 100f;
// ...
Vector3 upDirection = transform.position - target.position;
Quaternion goalRot = Quaternion.LookRotation(parentDirection, upDirection);
transform.rotation = Quaternion.RotateTowards(transform.rotation, goalRot,
turnVelocity * Time.deltaTime);
}