unity,Quaternion.Euler,只绕Y轴旋转
Unity, Quaternion.Euler, rotate only around Y axis
场景中有主摄像头:
我有这段代码可以平滑地旋转相机:
private IEnumerator SmoothlyRotateCamera()
{
float duration = 0.3f;
Quaternion from = transform.rotation;
Quaternion to = from * Vector3.up * 180f;
float elapsed = 0.0f;
while (elapsed < duration)
{
transform.rotation = Quaternion.Slerp(from, to, elapsed / duration);
elapsed += Time.deltaTime;
yield return null;
}
transform.rotation = to;
isRotating = false;
yield return null;
}
目前,我的相机的旋转角度是[30, -60, 0]
,我希望它绕Y轴旋转180度。
理论上,为了实现我需要旋转它 Vector3.up * 180f
,一切听起来都很好,除了事实,当我那样旋转它时,它也会旋转所有其他轴。
如果我将它旋转 new Vector3(180f, 0f, 0f)
- 只有 X 轴会受到影响。
如果我将它旋转 new Vector3(0f, 0f, 180f)
- 只有 Z 轴会受到影响。
如果我将它旋转 new Vector3(0f, 180f, 0f)
- 所有轴也会旋转。
我已经通过将我的 X 旋转设置为 0 检查了旋转,所以现在我的相机的旋转是 [0, -60, 0]
,如果我按预期的方式旋转它,Vector3.up * 180f
,然后一切正常!但是,我需要我相机的 X 留在原地。例如,在编辑器中仅按 Y 旋转即可得到我想要的结果。
我该怎么办?如何仅沿 Y 轴旋转 180 度?
P.S。我知道 transform.Rotate
但在我的情况下,我需要使用我在此处描述的方式旋转它。
谢谢!
宁愿使用transform.Rotate
private IEnumerator SmoothlyRotateCamera()
{
var duration = 0.3f;
// in angles per second
var rotationSpeed = 180f / duration;
float rotated = 0;
do
{
var angle = Mathf.Min(180.0f - rotated, rotationSpeed * Time.deltaTime);
var rotation = Vector3.up * angle;
rotated += angle;
// depends which Y axis you want to rotate around here
// pass Space.World to rotate around the global Y axis instead of the local one
// if left out it rotates around its transform.up vector instead
transform.Rotate(rotation, Space.World);
yield return null;
} while (rotated < 180f);
isRotating = false;
// your last yield return is redundant
}
我添加了 Mathf.Min
以确保没有超调。正如您所看到的,它正好落在 180° 上并且 是 及时平滑(您不一定需要 Lerp
因为只使用 Time.deltaTime
)。
为了显示效果我只把时长改成了3
而不是0.3
(就是看的太快了)
使用 transform.Rotate(rotation, Space.World);
围绕全局 Y 旋转
使用 transform.Rotate(rotation);
围绕局部 Y 旋转
你可以试试欧拉角。
transform.eulerAngles = new Vector3(transform.eulerAngles.x, transform.eulerAngles.y + 180, transform.eulerAngles.);
您的代码将变为:
private IEnumerator SmoothlyRotateCamera()
{
float duration = 0.3f;
Vector3 from = transform.eulerAngles;
Vector3 to = new Vector3(transform.eulerAngles.x, transform.eulerAngles.y +180, transform.eulerAngles.z);
float elapsed = 0.0f;
while (elapsed < duration)
{
transform.eulerAngles = Vector3.Slerp(from, to, elapsed / duration);
elapsed += Time.deltaTime;
yield return null;
}
transform.eulerAngles = to;
isRotating = false;
yield return null;
}
场景中有主摄像头:
我有这段代码可以平滑地旋转相机:
private IEnumerator SmoothlyRotateCamera()
{
float duration = 0.3f;
Quaternion from = transform.rotation;
Quaternion to = from * Vector3.up * 180f;
float elapsed = 0.0f;
while (elapsed < duration)
{
transform.rotation = Quaternion.Slerp(from, to, elapsed / duration);
elapsed += Time.deltaTime;
yield return null;
}
transform.rotation = to;
isRotating = false;
yield return null;
}
目前,我的相机的旋转角度是[30, -60, 0]
,我希望它绕Y轴旋转180度。
理论上,为了实现我需要旋转它 Vector3.up * 180f
,一切听起来都很好,除了事实,当我那样旋转它时,它也会旋转所有其他轴。
如果我将它旋转 new Vector3(180f, 0f, 0f)
- 只有 X 轴会受到影响。
如果我将它旋转 new Vector3(0f, 0f, 180f)
- 只有 Z 轴会受到影响。
如果我将它旋转 new Vector3(0f, 180f, 0f)
- 所有轴也会旋转。
我已经通过将我的 X 旋转设置为 0 检查了旋转,所以现在我的相机的旋转是 [0, -60, 0]
,如果我按预期的方式旋转它,Vector3.up * 180f
,然后一切正常!但是,我需要我相机的 X 留在原地。例如,在编辑器中仅按 Y 旋转即可得到我想要的结果。
我该怎么办?如何仅沿 Y 轴旋转 180 度?
P.S。我知道 transform.Rotate
但在我的情况下,我需要使用我在此处描述的方式旋转它。
谢谢!
宁愿使用transform.Rotate
private IEnumerator SmoothlyRotateCamera()
{
var duration = 0.3f;
// in angles per second
var rotationSpeed = 180f / duration;
float rotated = 0;
do
{
var angle = Mathf.Min(180.0f - rotated, rotationSpeed * Time.deltaTime);
var rotation = Vector3.up * angle;
rotated += angle;
// depends which Y axis you want to rotate around here
// pass Space.World to rotate around the global Y axis instead of the local one
// if left out it rotates around its transform.up vector instead
transform.Rotate(rotation, Space.World);
yield return null;
} while (rotated < 180f);
isRotating = false;
// your last yield return is redundant
}
我添加了 Mathf.Min
以确保没有超调。正如您所看到的,它正好落在 180° 上并且 是 及时平滑(您不一定需要 Lerp
因为只使用 Time.deltaTime
)。
为了显示效果我只把时长改成了3
而不是0.3
(就是看的太快了)
使用 transform.Rotate(rotation, Space.World);
使用 transform.Rotate(rotation);
你可以试试欧拉角。
transform.eulerAngles = new Vector3(transform.eulerAngles.x, transform.eulerAngles.y + 180, transform.eulerAngles.);
您的代码将变为:
private IEnumerator SmoothlyRotateCamera()
{
float duration = 0.3f;
Vector3 from = transform.eulerAngles;
Vector3 to = new Vector3(transform.eulerAngles.x, transform.eulerAngles.y +180, transform.eulerAngles.z);
float elapsed = 0.0f;
while (elapsed < duration)
{
transform.eulerAngles = Vector3.Slerp(from, to, elapsed / duration);
elapsed += Time.deltaTime;
yield return null;
}
transform.eulerAngles = to;
isRotating = false;
yield return null;
}