unity3d - 钳位旋转值

Posted

技术标签:

【中文标题】unity3d - 钳位旋转值【英文标题】:unity3d - Clamp rotation value 【发布时间】:2015-07-20 10:03:34 【问题描述】:

我有一个根据鼠标位置旋转的对象,但我想夹住它,使其不会进一步或低于某个值。这是我的代码:

void LookAt () 

        float distance = transform.position.z - Camera.main.transform.position.z;

        Vector3 position = new Vector3(Input.mousePosition.x, Input.mousePosition.y, distance);

        position = Camera.main.ScreenToWorldPoint(position);
        position.x = Mathf.Clamp(position.x, -70, 70);
        position.z = Mathf.Clamp(position.z, -70, 70);

        Vector3 target = new Vector3 (position.x, transform.position.y, position.z); // Use current object positin.y
        transform.LookAt(target);
    

但不幸的是它不起作用,它一直在旋转 360。

编辑: 这是一个 3D 自上而下的游戏,我有一个坦克,我想旋转它的上半部分。我上面写的代码非常适合这项工作,但现在我不知道如何限制它,所以枪管(我正在旋转的部分)总是朝上,敌人将从那里来。 70 或其他我正在测试的随机值,首先我想弄清楚正确的代码到底是什么,然后确定值是容易的部分。

【问题讨论】:

你能提供更多的上下文吗?使用场景的屏幕截图详细说明您想要做什么,并提供调用void LookAt() 的代码摘录。 LookAt() 在 Update() 中被调用,并且已经声明我不需要我的对象旋转 360,我想锁定它的值。除此之外,我看不出截图会有什么帮助?! 没有最少的上下文,很难为您提供正确的答案。您很少在不了解场景的情况下调试 Unity 脚本。我们不知道脚本在哪个对象上,对象和摄像机在场景中的位置,摄像机显示什么以及您想要的确切结果是什么。如果截图可以提供这些信息的数量,您可以根据需要书面描述。 为什么要计算屏幕空间中物体z坐标的距离,而不是使用相机的nearClipPlane? 另外,您不应该使用相同的变量来表示屏幕空间和世界空间位置。它使您的代码更难阅读和调试。 【参考方案1】:

实际上,问题在于您要锁定位置,而不是旋转。你让它看着某个点,但限制那个点而不是它需要旋转以满足它的角度。您必须使用三角函数来计算它想要指向的角度(更具体地说,是 atan2 函数),将 that 值钳制为 (-70, 70),然后应用 that 旋转到对象(使用欧拉角)。您需要对这些步骤中的任何一个进行进一步说明吗?

干杯。

附:请注意,atan2 返回一个以弧度为单位的值,但您的范围和欧拉角使用度数。

【讨论】:

【参考方案2】:

您在世界空间中将目标位置限制为 70 个单位,这通常很多,但取决于您的游戏规模。我认为您想要做的是将鼠标位置限制在屏幕中心周围 70 像素。 (请在问题本身中提供此评论,这样我们就不必猜测了)。但是,由于您对目标的屏幕空间和世界空间位置使用了相同的变量,因此在将其转换为世界空间后,您可能会混淆并限制位置。

另外,您使目标的 y 坐标与对象相同。但这意味着每次目标经过时对象必须旋转 360 度。我假设您想要做的是假设目标位置位于相机位置。

void LookAt () 

        var cursorPosition = new Vector3(Input.mousePosition.x, Input.mousePosition.y, camera.main.nearClipPlane);
        cursorPosition.x = Mathf.Clamp(position.x, -70, 70);
        cursorPosition.z = Mathf.Clamp(position.z, -70, 70);
        var targetPosition = Camera.main.ScreenToWorldPoint(cursorPosition);
        transform.LookAt(targetPosition);
    

当您要求查找代码中的错误时,请提供有关您的推理和期望行为的详细信息。

【讨论】:

这是一个 3D 自上而下的游戏,我有一辆坦克,我想旋转它的上半部分。我上面写的代码非常适合这项工作,但现在我不知道如何限制它,所以枪管(我正在旋转的部分)总是朝上,敌人将从那里来。 70 或任何我正在测试的随机值,首先我想弄清楚正确的代码到底是什么,然后确定值是容易的部分。 那么,我对您的预期行为的假设是否正确?您仍然需要更详细地描述游戏世界的设置。

以上是关于unity3d - 钳位旋转值的主要内容,如果未能解决你的问题,请参考以下文章

钳位幅度不适用于 RigidBody.Velocity

unity3d物体旋转

unity3d把 x的欧拉角赋给y啥作用

Unity3D 控制物体移动旋转缩放

Unity3D Slerp 旋转速度

Unity3D粒子系统粒子不跟随旋转