【问题标题】:Prevent counterclockwise rotation防止逆时针旋转
【发布时间】:2021-03-11 19:45:39
【问题描述】:

所以我有一个附有手柄的对象,玩家应该旋转这个手柄。为此,我使用控制器模拟摇杆的水平轴和垂直轴,并将这些值转换为度数,然后我用它来旋转对象。

问题是我似乎无法完全排除逆时针旋转手柄的可能性,因为玩家只能顺时针旋转它。发生的情况是,当我尝试逆时针旋转时,每隔几帧它就会检测到顺时针旋转,执行我的相应代码,即使我一直在逆时针旋转。

我用来确定旋转方向的原理是通过将最后一帧的输入角度与当前输入角度进行比较来完成的,例如:

// Variant 1:
var inputAngle = Mathf.Atan2(x, y) * Mathf.Rad2Deg;

float angleDifference = inputAngle - previousAngle;
if (angleDifference > 180f) angleDifference -= 360f;
if (angleDifference < -180f) angleDifference += 360f;

if (Mathf.Sign(angleDifference).Equals(-1)) 
{
// Counterclockwise rotation
}
else 
{
// Clockwise rotation
}

// ...

previousAngle = inputAngle;

在另一次尝试中,我尝试通过简单地检查我当前的角度是否大于我之前的角度来进行此比较,同时将输入转换为 0° 到 360° 的范围,并处理从返回到 0° 的溢出从 360°,这也不能始终如一地工作。

所以我试图查看在这种错误情况下的值是什么,但这告诉我的只是这些值与我预期的不同,因为当前角度在旋转时应该小于前一个角度逆时针,在那些情况下,我不知道为什么或如何防止它?

所以我想最后我的问题是如何通过读取控制器的模拟摇杆输入来始终防止玩家逆时针旋转。

【问题讨论】:

    标签: c# unity3d controller rotation joystick


    【解决方案1】:

    我会使用Vector3.SignedAngle 来获得围绕前轴的往返角度。那么如果角度为负,则为顺时针;正是逆时针:

    Vector3 previousPos;
    
    Vector3 GetPos() 
    { 
        /* return current controller position, between (-1,-1,0) and (1,1,0) */  
    }
    
    void Awake() { previousPos = previousPos; }
    
    void Update()
    {
        Vector3 curPos = GetPos();
    
        float deltaAngle = Vector3.SignedAngle(previousPos, curPos, Vector3.foward);
    
        // If you want to clamp the speed
        // float maxSpeed = 180f; // max rotational speed = 180 degrees per second
        // deltaAngle = Mathf.Clamp(deltaAngle/Time.deltaTime, -maxSpeed, maxSpeed) 
        //         * Time.deltaTime;
    
        bool isClockwise = deltaAngle < 0;
        bool isCounterClockwise = deltaAngle > 0;
       
        if (isClockwise) 
        {
            // do stuff when motion is clockwise 
        } 
        else if (isCounterClockwise)
        {
            // do stuff when motion is counter clockwise
        }
        else
        {
            // do stuff when no rotational motion occurs
        }
    
        previousPos = curPos;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-27
      • 1970-01-01
      • 2011-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多