【发布时间】: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