You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

赛车游戏车轮旋转异常:每360度X轴旋转后Z轴翻转

问题解决:赛车车轮旋转时Z轴翻转的问题

问题原因

你遇到的是Unity欧拉角的万向锁/数值表示歧义问题:当直接读取localEulerAngles时,Unity会将旋转用0-360范围内的欧拉角表示,但不同的欧拉角组合可能对应同一个四元数旋转。当X轴旋转接近360°时,Unity会自动将X轴重置为0,并通过翻转Z轴来保持旋转的视觉等价性,这就导致了你看到的车轮Z轴莫名翻转的现象。

你的代码里每次都基于当前localEulerAngles来构建转向旋转,相当于把Unity自动调整的欧拉角数值当成了“真实”的旋转状态,进而引入了错误。

修复方案

不要直接操作localEulerAngles,而是维护一个独立的变量来累计车轮绕X轴的旋转角度,分开处理转向(Y轴)和滚动(X轴)的旋转:

// 新增变量:累计车轮绕X轴的旋转角度
private float wheelRollAngle = 0f;

private void Update()
{
    // 处理车轮转向(Y轴)
    transform.localRotation = Quaternion.Euler(transform.localRotation.eulerAngles.x, steerAngle, transform.localRotation.eulerAngles.z);

    // 计算本次帧需要增加的滚动角度
    float rollDelta = Vector3.Dot(rb.GetPointVelocity(wheelMesh.transform.position), transform.forward) 
                      * Time.deltaTime / wheelCircumference * 360f;
    wheelRollAngle += rollDelta;

    // 直接用累计角度构建旋转:Y轴是转向角度,X轴是累计滚动角度,Z轴保持初始值(这里用0f示例)
    wheelMesh.transform.localRotation = Quaternion.Euler(-wheelRollAngle, steerAngle, 0f);

    Debug.Log(wheelMesh.transform.localEulerAngles);
}

关键说明

  • 用独立变量wheelRollAngle累计滚动角度,彻底避免读取localEulerAngles带来的数值歧义问题
  • 直接通过Quaternion.Euler构建最终旋转,明确指定三个轴的旋转值,让Unity无需自动调整欧拉角数值
  • 如果车轮初始Z轴有固定偏移,把代码里的0f换成对应的初始Z轴角度即可

内容的提问来源于stack exchange,提问作者Lackoon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 07:19:57