微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

特定阈值后相机旋转抖动视频

如何解决特定阈值后相机旋转抖动视频

所以我有这个设置:

  1. 相机旋转被限制在 Y 轴上。只能左右旋转-75度到75度,旋转由鼠标控制。

  2. 玩家身体可以绕其 Y 轴旋转,并将其 Y 旋转值添加到 -75 和 75 度相机夹,以保持玩家身体前方的相机旋转空间。示例:如果玩家在 Y 轴上旋转 90 度,则钳位值将更改为 15 度和 165 度。

当玩家身体在 Y 轴上超过 359 度时会出现问题,因为相机钳位值从 284 和 434 跳回 -75 和 75,这会导致相机移动明显卡顿。我怎样才能消除这个快照?

Video example - Note the camera clamps (Limit L,Limit R) in the MouseLook script after 00:40

*handleBodyRotation 方法只是旋转玩家身体以面对红色立方体,它是相机的子节点。

public class MouseLook : MonoBehavIoUr
{
    public Transform CameraBox;
    public Transform lookAtPivot;
    public Transform lookAtObject;
    public Transform playerBody;
 
    public float sensitivity;
    public float bodyRotSpeed;
 
    float xRotation = 0f;
    float yRotation = 0f;
    public float limitL;
    public float limitR;
 
    void Start()
    {
        Cursor.lockState = CursorLockMode.Locked;
    }
 
    void handleCamRotation()
    {
        float mouseX = Input.GetAxis("Mouse X") * sensitivity * Time.deltaTime;
        float mouseY = Input.GetAxis("Mouse Y") * sensitivity * Time.deltaTime;
 
        xRotation -= mouseY;
        xRotation = Mathf.Clamp(xRotation,-45,35);
 
        yRotation += mouseX;
        yRotation = Mathf.Clamp(yRotation,limitL,limitR);
 
        //Handle and clamp Camera,lookAtPivot,and lookAtObject rotation
        transform.rotation = Quaternion.Euler(xRotation,yRotation,0f);
 
        //Handle left limit and right limit
        limitL = -75 + playerBody.transform.rotation.eulerAngles.y;
        limitR = 75 + playerBody.transform.rotation.eulerAngles.y;
       
    }
 
    void handleBodyRotation()
    {
        Quaternion targetRotation = Quaternion.Euler(playerBody.transform.rotation.eulerAngles.x,lookAtObject.transform.rotation.eulerAngles.y,playerBody.transform.rotation.eulerAngles.z);
        playerBody.transform.localRotation = Quaternion.Lerp(playerBody.transform.localRotation,targetRotation,bodyRotSpeed * Time.deltaTime);
    }
 
    void Update()
    {
        //Camera Rotation (clamped)
        handleCamRotation();
 
        //Body Rotation
        if (Input.GetKey(KeyCode.W))
        {
            handleBodyRotation();
        }
    }
}

解决方法

你的问题是Transform.eulerAngles

的值

当您读取 .eulerAngles 属性时,Unity 会将四元数的内部旋转表示转换为欧拉角。因为,使用欧拉角表示任何给定旋转的方法不止一种,您读出的值可能与您指定的值大不相同。如果您尝试逐渐增加值以生成动画,这可能会导致混淆。

特别是 eulerAngles 将始终返回一个介于 0359.9999... 之间的值!

你自己说它跳转到 284434,然后返回到 -7575

为什么?

因为

  • 359 - 75284359 + 75434
  • 0 - 75-750 + 7575

您的 eulerAngles.y 值接近 359.999... 0 处的包裹点。


我认为你必须围绕这些值,例如

limitL = -75 + playerBody.transform.rotation.eulerAngles.y;
limitR = 75 + playerBody.transform.rotation.eulerAngles.y;

if(limitR > 360) limitR -= 360;
if(limitR < 0) limitR += 360;

if(limitL > 360) limitL -= 360;
if(limitL < 0) limitL += 360;
  

不确定,但我想你也必须像这样夹起来

if(limitR > limitL)
{
    yRotation = Mathf.Clamp(yRotation,limitL,limitR);
}
else
{
    yRotation = Mathf.Clamp(yRotation,limitR,limitL);
}

不知道 Unity 如何处理这种情况.. 可能是多余的。


注意:在智能手机上打字,但我希望思路清晰

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。