C# 映射360°;设置为介于-1和1之间的值

C# 映射360°;设置为介于-1和1之间的值,c#,math,unity3d,rotation,C#,Math,Unity3d,Rotation,我试着把C#中的一些旋转值转换成单位。我希望能够让用户输入一个介于0和360度之间的值,该值需要映射到两个轴,x和z。x轴和z轴都从-1到1,我想知道如何将度数转换为所需的范围。这更令人困惑,因为只有两个轴共同决定旋转 这两个轴来自Camera.forward.x和Camera.forward.z。我当然可以为两个轴输入介于-1和1之间的值,但是输入介于0和360之间的度会更自然。我将如何实现这一点 更新: 现在,我的代码如下所示,用于将x和z的度数转换为弧度: // rotation is a

我试着把C#中的一些旋转值转换成单位。我希望能够让用户输入一个介于0和360度之间的值,该值需要映射到两个轴,x和z。x轴和z轴都从-1到1,我想知道如何将度数转换为所需的范围。这更令人困惑,因为只有两个轴共同决定旋转

这两个轴来自
Camera.forward.x
Camera.forward.z
。我当然可以为两个轴输入介于-1和1之间的值,但是输入介于0和360之间的度会更自然。我将如何实现这一点

更新

现在,我的代码如下所示,用于将x和z的度数转换为弧度:

// rotation is a value between 0.0 and 360.0
float rad = rotation * Mathf.Deg2Rad;
float z = Mathf.Sin(rad);
float x = Mathf.Cos(rad);
Debug.Log(x + "   " + z);
但是,根据旋转值的不同,结果并不总是介于-1和1之间。例如:

  • 如果我将旋转设置为0,则得到
    x:1 z:0
  • 如果我将其设置为360,则得到
    x:1 z:1.748456E-07
  • 如果将其设置为90,则得到
    x:-4.371139E-08 z:0
那里发生了什么事

更新日志:

rotation:0    rad:0         z:0              x:1
rotation:90   rad:1.570796  z:1              x:-4.371139E-08
rotation:180  rad:3.141593  z:-8.742278E-08  x:-1
rotation:360  rad:6.283185  z:1.748456E-07   x:1
对于旋转在x-z平面内的单位圆(r=1),可以使用两个参数方程确定x和z

z=sin(0…360)

x=cos(0…360)

当然,取决于相机坐标的标记方式,可能正好相反

编辑:还要确保您的数学函数是在度模式下计算的,而不是在弧度模式下计算的。如果它们以弧度计算,则可以使用以下公式将度转换为弧度


rad=deg*(2*pi)/360

我认为这可能是有用的:您可以将“rad”和“rotation”添加到调试日志中吗。你在90度时计算z有点不对劲。z@90=1。。。不是0。但是我得到的弧度值在0和1.748456E-07之间(对于0到360度),我仍然不知道如何将其映射到-1到1的范围内。给定弧度值,
sin
cos
函数返回值-1到1。那么您的计算不正确。弧度的转换为0到360度之间的所有值输出一个介于0到2pi之间的值。@RobS。还有一些问题。你能检查我上面更新的编辑吗?你的输出是正确的1.748456E-07和-4.371139E-08都在-1和1之间------1.748456E-07也可以表示为0.0000001748456,-4.371139E-08可以表示为-0.00000004371139,两者都非常接近于零。。。这与您使用的数学库如何计算sin和cos有关,它们不是精确的,而是估计值。这两个值实际上都为零,但由于估计误差,只是略有偏离。