【问题标题】:Problems clamping quaternion rotation夹紧四元数旋转的问题
【发布时间】:2015-01-16 13:45:35
【问题描述】:

我已经对此进行了一些研究,但似乎没有任何方法可以正常工作。希望有人可以阐明我做错了什么。

在我正在开发的这款 2D Unity 游戏中,我希望大炮跟随鼠标并围绕 z 轴旋转。当前代码正是这样做的,但我也想限制旋转。

Vector3 dir = Camera.main.ScreenToWorldPoint (Input.mousePosition);
    Quaternion targetRotation = Quaternion.LookRotation(transform.position - dir.normalized, Vector3.forward);
    targetRotation.x = 0;
    targetRotation.y = 0;
    transform.rotation = Quaternion.RotateTowards(transform.rotation, targetRotation, Time.deltaTime * rotationSpeed * 10);

我尝试使用if-statements 来限制轮换:

if(eulerAngle > 65 && eulerAngle < 295) //pseudo code
transform.rotation = Quaternion.RotateTowards(transform.rotation, targetRotation, Time.deltaTime * rotationSpeed * 10)

这可行,但会将大炮的枪管锁定在 65 度或 295 度。我没有运气使用ifstatements 来“解锁”枪管旋转。

我也尝试过使用四元数的类似语句:

float amountToRotate = Quaternion.Angle (transform.rotation, targetRotation);

我猜,由于四元数的工作方式,即使远离目标,角度也会增加。类似于复平面上的数字?

mathf.clamp 函数根本没有给我带来任何运气。

对于所有这些问题的解决方案,可能有一个简单的解决方案,但我似乎无法解决。

编辑:我更喜欢使用mathf.clamp,因为这似乎是“最干净”的解决方案。

【问题讨论】:

  • 是的,我尝试了类似于 if(eulerAngle > 65) {transform.rotation = Quaternion.Euler(0.0f,0.0f,64.9f)}
  • 我回溯了我的步骤,并做了与今天早些时候相同的操作 - 现在它正在工作。但是,由于旋转不断在两个值之间反弹,我在边缘处得到了一些奇怪的运动。
  • 因此,如果达到该值,则阻止用户走那条路。但这是你自己或如何做的事情,或另一个问题:)
  • 它解决了一个问题并导致了一个新问题,但我确实得到了我所要求的。 ;-) 谢谢!

标签: unity3d rotation quaternions clamp


【解决方案1】:

问题似乎出在您的if 状态逻辑中。

让我们把它分解成一些逻辑块:

  • 如果值大于 65 > 检查下一个块

如果不是这种情况,则表示该值小于或等于 65,并且if 不会运行。在下一个区块中(如果值超过 65)

  • 如果值小于295 > 执行if语句

如果不是这种情况,则表示该值大于或等于 295。

首先,我建议将您的 if 语句包含为等于

if(eulerAngle >= 65 && eulerAngle <= 295)

这使我们减少了一些需要考虑的检查。现在我们知道,如果您的大炮旋转冻结,那是因为角度低于 65 ( 295)。

为了使 if 语句能够继续,您将希望该值再次位于值之间,因为您还为这些值添加了 = 检查。您现在可以将它们设置为 65 或 295,根据哪个超出范围。示例给你一个想法:

else if( eulerAngle < 65)
    eulerAngle = 65;

【讨论】:

    猜你喜欢
    • 2020-04-11
    • 2020-08-01
    • 2016-05-05
    • 2021-07-10
    • 1970-01-01
    • 2021-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多