c# - 找到旋转的差异,作为随时间统一的平均值 c#

标签 c# unity3d euler-angles

我有一个玩家可以旋转的船轮。我目前记录角度变化,它被添加到一个总角度。然后我可以计算出船轮转动了多少次。这一切都很好。

void Update()
        {
            //Record Amount of Wheel Turns
            currentAngle = wheelRectTransform.transform.rotation.eulerAngles.z;
            angleChange = Mathf.DeltaAngle(currentAngle, previousAngle);

            if ((Mathf.Abs(angle + angleChange) / 360) <=   wheelTurnsUntilRudderAtMaxAngle)
            {            
               angle += angleChange;               
            } 

            totalWheelTurns = angle / 360;
            shipStats.RudderAngle = totalWheelTurns / wheelTurnsUntilRudderAtMaxAngle;

            previousAngle = currentAngle;
        }

不过,我也想记录一下平均角度随时间的变化。然后我就可以准确地知道轮子是向左还是向右旋转。

我试过这样简单的事情

if (angleChange < 0)
{
     // Going Left
}
else if (angleChange > 0)
{
     // Going Right
} else
{
    // Not moving
}

然而在实践中,如果玩家旋转轮子的速度非常非常慢,则偶尔帧上的角度差为 0 并记录为“不移动”。

我相信解决方案是找到短时间内的平均角度变化,因此我尝试将角度随时间 Lerp 到 0。

newAngleDifference = Mathf.Lerp(angleChange, 0, Time.deltaTime * 0.2f);

这没有用,它给我的反馈与我只是使用“angleChange”一样,无论如何都可以为 0。

谢谢!

吉姆

最佳答案

您不需要平均任何东西来检测车轮的方向。只需使用旧变量和新变量即可找到车轮的行驶方向。

 void Start()
 {
        StartCoroutine(wheelDIRCalculator(_wheelTransform));
 }


bool continueWheelCalculation = false;

 IEnumerator wheelDIRCalculator(Transform wheelTransform)
 {
     yield return null;

     continueWheelCalculation = true;

     float oldZAngle = 0;
     float newZAngle = 0;
     bool isIdle = false;

     oldZAngle = Mathf.Abs(wheelTransform.rotation.eulerAngles.z);


     while (continueWheelCalculation)
     {

         //Get new rotation
         newZAngle = Mathf.Abs(wheelTransform.rotation.eulerAngles.z);

         if (oldZAngle < newZAngle)
         {
             isIdle = false;
             oldZAngle = newZAngle;
             Debug.Log("Left");

             //Do something 

         }
         else if (oldZAngle > newZAngle)
         {
             isIdle = false;
             oldZAngle = newZAngle;
             Debug.Log("Right");

             //Do something 

         }
         else if (!isIdle)
         {
             isIdle = true;
             oldZAngle = newZAngle;
             Debug.Log("Idle");

             //Do something 

         }


         yield return null;
     }
 }

 void stopWheelDIRCalculator()
 {
    continueWheelCalculation = false;
 }

关于c# - 找到旋转的差异,作为随时间统一的平均值 c#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36964915/

相关文章:

c# - 如何通过 Unity 将 Android 设备预热到 40 度?

opencv - 使用opencv将旋转矩阵转换为欧拉角

rotation - 将旋转分解为围绕任意正交轴的旋转的更快方法

c# - 在 C# 中通过 POST 发送 JSON 并接收返回的 JSON?

c# - 为什么这段代码会给我来自 Request.Form 的无效内容类型? (ASP.NET 核心)

c# - 表单例份验证超时后重定向到页面

c# - 如何在 ASP.NET 应用程序中序列化异常?

android - 什么会导致 Android 应用程序在没有堆栈跟踪的情况下死机?

c++ - 程序在启动时崩溃

opengl - 如何根据前向矢量计算俯仰和偏航值