C# 如何从Unity3D中第三人称摄影机的localEulerAngels中获取1到1的浮点值?

C# 如何从Unity3D中第三人称摄影机的localEulerAngels中获取1到1的浮点值?,c#,unity3d,game-physics,trigonometry,C#,Unity3d,Game Physics,Trigonometry,我有一个带刚体的球,我根据第三人称相机的角度(总是看着球)给球增加扭矩,相机绕着球旋转。我试图根据相机绕球旋转时的位置来改变球的方向。我使用Vector3.right表示前进和后退扭矩,使用Vector3.back表示左右扭矩。我有向前/向后的值,rightVal正在工作,但我已经在左/右值,backVal上工作了三天,我不知所措。下面是我如何努力实现这一目标的 void CalcRightVal() { float degrees = Camera.

我有一个带刚体的球,我根据第三人称相机的角度(总是看着球)给球增加扭矩,相机绕着球旋转。我试图根据相机绕球旋转时的位置来改变球的方向。我使用
Vector3.right
表示前进和后退扭矩,使用
Vector3.back
表示左右扭矩。我有向前/向后的值,
rightVal
正在工作,但我已经在左/右值,
backVal
上工作了三天,我不知所措。下面是我如何努力实现这一目标的

 void CalcRightVal()
        {
             float degrees = Camera.main.transform.localEulerAngles.y;
            if (degrees > 0 && degrees < 180.0f)
            {
                rightVal = (-degrees / 360) * 4 + 1;
            }


            if (degrees > 180.0f && degrees < 360.0f) //
            {
                rightVal = (-degrees / 360) * 4 + 1;

                if (rightVal < -1.0f)
                {
                    rightVal = (degrees / 360) * 4 - 3;
                }
            }

        }

        void ApplyTorque()
        {
            Vector3 dir = new Vector3(rightVal, 0, backVal);
            ball.AddTorque(dir * ballAcceleration);
        }
void CalcRightVal()
{
float degrees=Camera.main.transform.localEulerAngles.y;
如果(度>0&&度<180.0f)
{
rightVal=(-degrees/360)*4+1;
}
如果(华氏度>180.0度和华氏度<360.0度)//
{
rightVal=(-degrees/360)*4+1;
如果(右值<-1.0f)
{
rightVal=(度/360)*4-3;
}
}
}
void ApplyTorque()
{
Vector3 dir=新的Vector3(rightVal,0,backVal);
滚珠附加扭矩(方向*平衡加速度);
}
ApplyTorque()
中,我需要
backVal
从0变为-1,即
Vector3.back
degrees==90
时。然后
backVal
degrees==180
时的值应增加到0,然后在
degrees==270
时增加到1,然后在
degrees==360
时返回到0。这将在相机处于90度时向右侧施加扭矩,在相机处于270度时向左侧施加扭矩。其想法是用户将输入添加到前进,即
KeyCode.W
添加加速和后退,或
KeyCode.S
用于休息。摄像机将负责改变力的方向。我的数学不差,但这一次我被打败了

rightVal
为1或-1时,
backVal
需要为0,反之亦然。这样,当摄像机位于球的正后方或0度时,施加的扭矩将为
矢量3。右侧
(1,0,0)
,当摄像机位于球的90度或左侧时,施加的扭矩将为
矢量3。背部
(0,0,-1)
。这将施加扭矩使球向右转动。基本上,无论摄像机在哪里,球都会从用户的角度向前滚动。谢谢你的帮助,我们永远感谢你的帮助

这里有一个图形来帮助您


谢谢。

如果您想要平滑地增加/减少backval,只需执行以下操作:

    backVal = -Mathf.Sin(degrees * Mathf.Deg2Rad);
但是,如果您想要线性关系,它将稍微复杂一些:

private void CalcBackValue()
{
    float degrees = Camera.main.transform.localEulerAngles.z;
    if (degrees >= 0 && degrees < 90)
        backVal = -degrees / 90f; // 0 to -1
    else if (degrees >= 90 && degrees < 270)
        backVal = -2 + degrees / 90; // -1 to 0 to 1
    else if (degrees >= 270 && degrees < 360)
        backVal = 4 - degrees / 90; // 1 to 0
}
private void CalcBackValue()
{
float degrees=Camera.main.transform.localEulerAngles.z;
如果(度数>=0&&度数<90)
backVal=-degrees/90f;//0到-1
否则,如果(度>=90度和<270度)
backVal=-2+度/90;//-1到0到1
否则,如果(度>=270度和<360度)
backVal=4度/90;//1到0
}
您可能需要在此基础上展开,以包括负的euler角,但在第二个示例中,基本上是沿着以下曲线查找值:


如果您想要平滑地增加/减少backval,只需执行以下操作:

    backVal = -Mathf.Sin(degrees * Mathf.Deg2Rad);
但是,如果您想要线性关系,它将稍微复杂一些:

private void CalcBackValue()
{
    float degrees = Camera.main.transform.localEulerAngles.z;
    if (degrees >= 0 && degrees < 90)
        backVal = -degrees / 90f; // 0 to -1
    else if (degrees >= 90 && degrees < 270)
        backVal = -2 + degrees / 90; // -1 to 0 to 1
    else if (degrees >= 270 && degrees < 360)
        backVal = 4 - degrees / 90; // 1 to 0
}
private void CalcBackValue()
{
float degrees=Camera.main.transform.localEulerAngles.z;
如果(度数>=0&&度数<90)
backVal=-degrees/90f;//0到-1
否则,如果(度>=90度和<270度)
backVal=-2+度/90;//-1到0到1
否则,如果(度>=270度和<360度)
backVal=4度/90;//1到0
}
您可能需要在此基础上展开,以包括负的euler角,但在第二个示例中,基本上是沿着以下曲线查找值:


你能用这样的正弦函数吗:
backVal=Mathf.Sin((度-180)*Mathf.Deg2Rad)
?或者我遗漏了什么?你能不能用这样的正弦:
backVal=Mathf.Sin((度-180)*Mathf.Deg2Rad)
?还是我遗漏了什么?