【问题标题】:How can I get XY Euler angles from a direction?如何从一个方向获得 XY 欧拉角?
【发布时间】:2012-07-23 09:43:59
【问题描述】:

我有一个第一人称相机控制器,实现如下:

float rotSpeed = 20.0f;

xRotation += deltaPos.y * rotSpeed * Time.deltaTime;
yRotation += deltaPos.x * -rotSpeed * Time.deltaTime;

while(xRotation > 360.0f) xRotation -= 360.0f;
while(xRotation < 0.0f)   xRotation += 360.0f;

while(yRotation > 360.0f) yRotation -= 360.0f;
while(yRotation < 0.0f)   yRotation += 360.0f;

cam.transform.rotation = Quaternion.Euler(xRotation, yRotation, 0);

我希望相机能够捕捉到 3D 空间中的某个目标。

如果我使用 transform.LookAt(target),相机控制器只会将视图重新捕捉到它来自的位置,并且我无法在调用 LookAt() 后从相机的旋转设置 xRotation 和 yRotation,因为LookAt() 有时会产生一个带有 Z 旋转的四元数。

那么我怎样才能找到将相机指向某个目标所需的 X 和 Y 旋转?

【问题讨论】:

  • 几年前我写了几个用于角度转换的 c# 类。他们可以在球坐标、滚动/俯仰/偏航、章动/进动/旋转或任何任意欧拉角之间进行转换。我会看看我能不能找到它。这个页面很有帮助:en.wikipedia.org/wiki/…

标签: c# c++ math unity3d


【解决方案1】:

您可以使用Quaternion.LookRotation 轻松修改播放器的旋转,然后使用Quaternion.Lerp 对其进行插值。

public Transform target;
float turnSpeed = 5.0f;

Quaternion lookAt = Quaternion.LookRotation(target.position - transform.position);
transform.rotation = Quaternion.Lerp(transform.rotation, lookAt, Time.smoothDeltaTime * turnSpeed);

transform 是玩家的变换。

您所要做的就是确定捕捉规则应该何时发生。

后记:实际上可能还不止这些。如果目标/玩家位置经常移动,您可能会遇到一个“死区”,在该“死区”中,LookRotation 无法可靠地捕捉到它的目标。有关此问题(和解决方案)的更多详细信息here

【讨论】:

  • 我的问题不是平滑的相机插值,而是我将相机旋转到精确的俯仰并偏航每一帧。因此,如果我突然改变相机的方向以查看特定对象,我需要知道如何更新存储的俯仰和偏航值。
  • 我想你总是可以抓住四元数的欧拉角! link
猜你喜欢
  • 2015-07-28
  • 2010-12-06
  • 1970-01-01
  • 2020-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-28
  • 1970-01-01
相关资源
最近更新 更多