【发布时间】:2019-09-26 17:23:29
【问题描述】:
我正在 Unity 中开发像 sketchfab 这样的对象查看器,目前正在使用鼠标进行相机旋转。到目前为止,一切似乎都有效,但我想在垂直轴上夹紧旋转,但在完成此操作时遇到了一些麻烦。
这就是我完成相机旋转的方式:
[SerializeField] Transform camPivot = null;
[SerializeField] float speed = 850.0F;
private Quaternion _camRot { get; set; } = Quaternion.identity;
private float _polar { get; set; } = 0;
private float _elevation { get; set; } = 0;
void DoRotation()
{
this._polar += Input.GetAxis("Mouse X") * this.speed * Mathf.Deg2Rad;
this._elevation -= Input.GetAxis("Mouse Y") * this.speed * Mathf.Deg2Rad;
this._camRot = Quaternion.AngleAxis(this._elevation, Vector3.right);
this._camRot = Quaternion.AngleAxis(this._polar, Vector3.up) * this._camRot;
}
private void Update()
{
this.DoRotation();
this.camPivot.localRotation = Quaternion.Slerp(this.camPivot.localRotation, this._camRot, Time.unscaledDeltaTime * 5.0F);
}
此外,我想始终确保 z 旋转为零,因为我只需要水平和垂直旋转相机枢轴,我尝试将 camPivot euler z 值设置为 0,但它给了我一些非常奇怪的行为。
var euler = this.viewCamera.Pivot.eulerAngles; euler.z = 0.0f;
this.viewCamera.Pivot.eulerAngles = euler;
【问题讨论】:
-
你所说的“非常奇怪的行为”是什么意思?此外,还不清楚枢轴是否是其他可能以某种方式旋转的对象的子对象。那么如果你改用
Pivot.localEulerAngles会发生什么呢?你所有的其他计算似乎都是基于枢轴的局部旋转,所以它违背预期可能植根于这种差异。 -
你好!我尝试使用 localEulerAngles,但它给了我相同类型的行为,即如果我垂直旋转近 90 或 -90 度,一切都开始“旋转”。我想这可能是万向节锁定问题,但我不确定,因为我对欧拉数和四元数不太熟悉。 camPivot 的父对象和父对象的父对象等都处于零位置和 rot 并且我在任何时候都不会更改任何内容,只有 camPivot。
-
您是否尝试过使用
this._elevation = Mathf.Clamp(this._elevation, -90f, 90f);将_elevation 固定到+- 90 并去掉this.viewCamera.Pivot.eulerAngles = euler;行?似乎这是防止此控制器翻转相机的最简单方法。 -
这太完美了!为什么我没想到……效果很好,谢谢! :) 我还有一件我不确定的事情,如果我尝试用鼠标在水平轴上快速旋转,那么移动鼠标以非常频繁地旋转,它有时会“锁定”并且不会让我要旋转它,它会稍微向相反的方向移动。不确定是什么导致了这种行为。
-
我实际上使用了与我在问题中显示的相同的方式来设置欧拉,除了我使用了局部欧拉角,现在它似乎工作正常。我想这是因为我夹住了垂直旋转并防止了云台锁定问题。但这是我的猜测。
标签: c# unity3d rotation quaternions euler-angles