我只能在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轴上应用旋转->它现在是一个额外的局部旋转!