在Unity中参考一个平面在两个轴上旋转四元数的问题



我只能在x轴上旋转它,但我也想在z轴上用鼠标移动它。对不起,错误是谷歌翻译。

[SerializeField] private float camRotationAmount = 0.2f;
public Quaternion newRotation;

newRotation *= Quaternion.Euler(Vector3.up * Input.GetAxis("Mouse X"));
transform.rotation = Quaternion.Lerp(transform.rotation, newRotation, Time.deltaTime * camSmoothness);

我想添加输入。GetAxis ("Mouse Y") for Vector3。左不倾斜相机。这是一款RTS游戏。由于

一般情况下,您需要分隔Y和X以如下方式旋转:

  • global中绕Y旋转空间
  • local中绕X旋转空间。

您是否完全通过逻辑或使用父子层次结构来实现这一点取决于您…在我看来,第二种更容易理解。


使用层次

你会有一个简单的层次结构,例如

CameraAnchor
|--Camera

并在CameraAnchor上有一个脚本,例如

public class CameraAnchorController : MonoBehaviour
{
public float cameraSmoothness = 5f;
private Quaternion targetGlobalRotation;
private Quaternion targetLocalRotation;
private Transform child;
private void Start()
{
child = transform.GetChild(0);
targetGlobalRotation = transform.rotation;
targetLocalRotation = transform.GetChild(0).localRotation;
}
private void Update()
{
targetGlobalRotation *= Quaternion.Euler(Vector3.up * Input.GetAxis("Mouse X"));
targetLocalRotation *= Quaternion.Euler(Vector3.right * -Input.GetAxis("Mouse Y"));
var lerpFactor = cameraSmoothness * Time.deltaTime;
transform.rotation = Quaternion.Lerp(transform.rotation, targetGlobalRotation, lerpFactor);
child.localRotation = Quaternion.Lerp(child.localRotation, targetLocalRotation, lerpFactor);
}
}

使用四元数计算

如前所述,你可以在一个对象中做同样的事情但我仍然会保持两个旋转分开:

public class CameraController : MonoBehaviour
{
public float cameraSmoothness = 5f;
private Quaternion targetGlobalRotation;
private Quaternion targetLocalRotation = Quaternion.identity;
private void Start()
{
targetGlobalRotation = transform.rotation;
}
private void Update()
{
targetGlobalRotation *= Quaternion.Euler(Vector3.up * Input.GetAxis("Mouse X"));
targetLocalRotation *= Quaternion.Euler(Vector3.right * -Input.GetAxis("Mouse Y"));
transform.rotation = Quaternion.Lerp(transform.rotation, targetGlobalRotation * targetLocalRotation, cameraSmoothness * Time.deltaTime);
}
}

当我们现在仍然使用Vector3.right时,为什么这个工作?

通过targetGlobalRotation * targetLocalRotation,我们首先围绕全局Y轴旋转,然后基于这个已经应用的旋转在X轴上应用旋转->它现在是一个额外的局部旋转!

相关内容

  • 没有找到相关文章

最新更新