夹紧四元数旋转的问题

时间:2015-01-16 13:45:36

标签: unity3d rotation quaternions clamp

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

在我正在研究的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 - 语句限制轮换:

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

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

我也尝试过使用Quaternions的类似声明:

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

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

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

对于这个问题的解决方案可能很容易解决,但我似乎无法解决这个问题。

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

1 个答案:

答案 0 :(得分:1)

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

让我们在一些逻辑块中分解它:

  • 如果该值更大,那么65>检查下一个块

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

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

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

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

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

这给了我们一些不用考虑的检查。现在我们知道,如果你的大炮旋转冻结,那是因为角度低于65(<65)或高于295(> 295)。

要使if语句能够继续,您将希望值再次介于值之间,因为您还将= check添加到值中。您现在可以根据哪个超出范围将它们设置为65或295。样品给你一个想法:

else if( eulerAngle < 65)
    eulerAngle = 65;