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

Unity齿轮物理实现问题:比例大于1时旋转轴异常

解决Unity齿轮旋转比例大于1时的轴翻转问题

问题根源

原代码的核心问题在于:

  • 直接使用eulerAngles计算旋转,Unity的欧拉角会以0-360度的最短路径表示角度,当旋转超过180度时会出现数值跳变,乘以大于1的比例后触发轴翻转。
  • 错误使用Quaternion.Inverse,齿轮传动是正向的旋转映射,不需要反转目标旋转。
  • 未处理角度的循环累加,仅依赖当前相对旋转计算导致状态不稳定。

解决方案1:基于累计角度增量实现

通过跟踪目标齿轮的旋转增量,累加后按传动比映射到当前齿轮,避免欧拉角跳变问题:

private Quaternion _startRotation;
private float _targetInitialYAngle;
private float _totalTargetRotation;
public Gear targetGear; // 目标齿轮引用
public float transmissionRatio = -2f; // 传动比:目标转180度时当前转360度,反向旋转所以带负号

void Start()
{
    _startRotation = transform.rotation;
    _targetInitialYAngle = targetGear.transform.eulerAngles.y;
    _totalTargetRotation = 0f;
}

void Update()
{
    // 计算目标齿轮的Y轴旋转增量(自动处理360度循环)
    float currentTargetY = targetGear.transform.eulerAngles.y;
    float deltaRotation = Mathf.DeltaAngle(_targetInitialYAngle, currentTargetY);
    _totalTargetRotation += deltaRotation;

    // 按传动比计算当前齿轮的旋转角度
    float currentGearRotation = _totalTargetRotation * transmissionRatio;

    // 应用最终旋转
    transform.rotation = _startRotation * Quaternion.Euler(0, currentGearRotation, 0);
}

解决方案2:基于四元数轴角转换实现

完全避开欧拉角问题,用四元数的轴角转换处理旋转映射:

private Quaternion _startRotation;
private Quaternion _targetStartRotation;
public Gear targetGear;
public float transmissionRatio = 2f; // 传动比数值,反向通过单独乘-1实现

void Start()
{
    _startRotation = transform.rotation;
    _targetStartRotation = targetGear.transform.rotation;
}

void Update()
{
    // 计算目标齿轮相对于初始状态的旋转增量
    Quaternion targetDelta = targetGear.transform.rotation * Quaternion.Inverse(_targetStartRotation);
    
    // 将增量转换为轴角格式
    targetDelta.ToAngleAxis(out float angle, out Vector3 axis);
    
    // 齿轮反向旋转,角度乘以传动比
    float newAngle = angle * transmissionRatio * -1;
    
    // 创建当前齿轮的旋转增量
    Quaternion gearDelta = Quaternion.AngleAxis(newAngle, axis);
    
    // 应用初始旋转+增量
    transform.rotation = _startRotation * gearDelta;
}

关键说明

  • 传动比的符号:齿轮传动方向相反,所以需要给传动比添加负号(或单独乘-1)。
  • 针对需求:目标齿轮转半圈(180度)时大齿轮转一整圈(360度),传动比数值为2,反向后最终比例为-2。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 01:23:32