如何现实地限制角度?

Posted

技术标签:

【中文标题】如何现实地限制角度?【英文标题】:How to limit angles realistically? 【发布时间】:2019-05-03 18:24:07 【问题描述】:

我的游戏角色是一只猫;它可以走路和跳跃。问题是地面有坡度和坑洞,所以猫有时会仰面翻身,像这样:

是否可以实际限制旋转角度? IE。 -45 到 45 度,因此它与物理引擎兼容。

我找到了将角度直接设置为transform.rotation = desired Rotation 的解决方案,但它会产生具有物理性质的伪影,并且当对象开始旋转并突然停止时,它看起来并不真实。

UPD:我尝试了从答案中提供的解决方案:

private void FixRotation()

    var angles = transform.eulerAngles;
    Debug.Log("Limiting angles: " + minAngle + "; " + maxAngle);
    Debug.Log("Rotation Z: " + angles.z);
    angles.z = Mathf.Clamp(angles.z, minAngle, maxAngle);
    transform.eulerAngles = angles;
    Debug.Log("Fixed rotation Z: " + transform.eulerAngles.z);

它不能正常工作。当猫要旋转更多限制时,它会在我需要时返回但是,精灵开始非常快速地摇晃。我在做什么?

【问题讨论】:

查看 Mathf.clamp 并尝试不同的角度范围 docs.unity3d.com/ScriptReference/Mathf.Clamp.html 它对我不起作用。你能看看我的功能吗,请问我已经更新了我的问题吗? 当我切换到欧拉角时,它开始限制角度,但看起来很疯狂。猫的精灵摇晃着试图将旋转恢复到极限。 【参考方案1】:

我使用this answer 的解决方案解决了晃动问题。

private float ClampAngle(float angle, float min, float max)

    if (angle < 90 || angle > 270)
       
        // if angle in the critic region...
        if (angle > 180)
        
            angle -= 360;  // convert all angles to -180..+180
        

        if (max > 180)
        
            max -= 360;
        

        if (min > 180)
        
            min -= 360;
        
    

    angle = Mathf.Clamp(angle, min, max);

    if (angle < 0)
    
        angle += 360;  // if angle negative, convert to 0..360
    

    return angle;


private void FixRotation()

    var angles = transform.eulerAngles;
    angles.z = ClampAngle(angles.z, minAngle, maxAngle);
    transform.eulerAngles = angles;

我们需要防止游戏对象在其角度处于临界区域(或多或少 180)时完全旋转的解决方案

【讨论】:

以上是关于如何现实地限制角度?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Java EE 环境中实现请求限制?

导出数据超出EXCEL行列本身限制时如何解决!!!

订阅的角度限制发射

使用ngFor的表中的角度限制行数[重复]

component.ts 文件中的错误限制了角度渲染

如何在 Qt 中限制日志大小