代码之家  ›  专栏  ›  技术社区  ›  user4683497

如何从Unity3D中的第三人称相机的localEulerAngels中获得1对1的浮点值?

  •  0
  • user4683497  · 技术社区  · 6 年前

    我有一个球,球上有一个刚体,我根据第三人称相机的角度(总是盯着球看)给球施加扭矩,相机绕着球旋转。我试图根据相机绕球旋转时的位置来改变球的方向。我正在使用 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);
            }
    

    在里面 ApplyTorque() 我需要 backVal公司 从0变为-1,即。 矢量3.back 什么时候 degrees == 90 . 然后 backVal公司 degrees == 180 然后到1时 degrees == 270 然后返回到0时 degrees == 360 . 这将在相机处于90度时向右施加扭矩,在相机处于270度时向左施加扭矩。其想法是,用户将向forward添加输入,即。 KeyCode.W 添加加速和倒车或 KeyCode.S 休息时间。摄像机将负责改变力的方向。我的数学不差,但这门课把我打败了。

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

    这里有一个帮助的图形。

    enter image description here 非常感谢。

    1 回复  |  直到 6 年前
        1
  •  2
  •   ryeMoss    6 年前

    如果您想要平滑地增加/减少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
    }
    

    您可能需要在此基础上展开以包括负的euler角,但在第二个示例中,您基本上是沿着以下曲线查找值:

    enter image description here