css178901235563 2024-01-13 15:22 采纳率: 0%
浏览 33
已结题

Unity如何实现远距离的平滑旋转

话不多说,如图所示,这就是我在unity编写的一段用来实现其他玩家y轴平滑旋转的代码

        Quaternion quaternion = Quaternion.Euler(new Vector3(0f, this.rot.y, 0f));
        Quaternion quaternion2 = Quaternion.Euler(new Vector3(0f, this.tarRot.y, 0f));
        float num = Quaternion.Angle(quaternion, quaternion2);
        float t = Mathf.Min(1f, num / 360f);
        this.rot.y = Quaternion.Lerp(quaternion, quaternion2, t).eulerAngles.y;
        base.transform.rotation = Quaternion.Euler(new Vector3(0f, this.rot.y, 0f));

img

这段代码的效果为: 当this.tarRot.y的值改变后,代码将会进行一个插值运算,并使得this.rot.y逐渐逼近this.tarRot.y,然后的话this.tarRot.y是新接收到的玩家旋转轴的值,rot.y是玩家的平滑旋转轴,用来实现玩家的平滑旋转

PS:之所以代码需要用到四元数,是因为当玩家广播的欧拉角(y轴)突然从359度过渡到1度的时候,rot.y会从359度平滑减少到1度,而使用四元数就会先增加到360度,然后360度就会变成零度接着再逐渐增加到一度,这样就能够解决玩家在特殊情况下旋转角度过大的问题,但缺点就是只会选择一个最小的角度和方向进行旋转

示意图如下:

img

但是现在我想换一种旋转方式,可以看到图片中有两个部分,我想在新的代码中实现让玩家以一个比较大的旋转角度进行旋转

img

但问的就是我只知道可以使用插值运算来实现平滑角度(this.rot.y)逐渐接近目标角度,但我不知道该用什么其他的方法来实现平滑角度反方向接近目标角度

img

求真人来解答,也在外网上找了很多教程,但都不是我想要的,并且如果可以的话新代码不要破坏原有的平滑旋转

  • 写回答

20条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2024-01-13 15:23
    关注
    获得1.60元问题酬金

    引自免费微信小程序:皆我百晓生

    要实现大角度旋转的平滑效果,你可以使用三角函数来实现。具体步骤如下:

    1. 首先,计算出目标角度和当前角度之间的差值:
    float angleDiff = this.tarRot.y - this.rot.y;
    
    1. 判断差值是否大于180度,如果是则减去360度,使得差值小于180度:
    if (angleDiff > 180f)
    {
        angleDiff -= 360f;
    }
    else if (angleDiff < -180f)
    {
        angleDiff += 360f;
    }
    
    1. 设置一个角速度参数,控制旋转速度的快慢。你可以根据需要调整这个参数的值:
    float rotationSpeed = 100f; // 调整旋转速度
    
    1. 根据角速度参数和帧间隔时间nFrame,计算出每帧需要旋转的角度:
    float rotateAngle = rotationSpeed * nFrame;
    
    1. 将每帧旋转的角度累加到当前角度上,并限制在0到360度之间:
    this.rot.y += rotateAngle;
    this.rot.y %= 360f; // 限制在0到360度之间
    
    1. 如果累加的角度已经超过目标角度,那么将目标角度赋值给当前角度,确保最终的角度和目标角度一致:
    if (Mathf.Abs(angleDiff) <= Mathf.Abs(rotateAngle))
    {
        this.rot.y = this.tarRot.y;
    }
    

    完整的代码如下:

    float angleDiff = this.tarRot.y - this.rot.y;
    if (angleDiff > 180f)
    {
        angleDiff -= 360f;
    }
    else if (angleDiff < -180f)
    {
        angleDiff += 360f;
    }
    
    float rotationSpeed = 100f;  // 调整旋转速度
    float rotateAngle = rotationSpeed * nFrame;
    
    this.rot.y += rotateAngle;
    this.rot.y %= 360f;
    
    if (Mathf.Abs(angleDiff) <= Mathf.Abs(rotateAngle))
    {
        this.rot.y = this.tarRot.y;
    }
    

    这样修改后的代码就可以实现大角度旋转的平滑效果了。

    评论

报告相同问题?

问题事件

  • 系统已结题 1月21日
  • 创建了问题 1月13日