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

Unity手部追踪增益调整报错:手部位置为无限大问题排查

问题排查与代码修正

核心问题分析

  1. 成员变量未正确初始化
    你在Start()方法中重新声明了Vector3 posOrigin局部变量,导致类的私有成员posOrigin始终保持默认的Vector3(0,0,0),而非handRenderer的初始位置,这是计算逻辑混乱的根源。

  2. 参数顺序完全颠倒
    transfo()方法定义的参数顺序是(origin, actual),但调用时你传入的是(handRenderer当前位置, posOrigin初始位置),导致差值计算逻辑完全反向,若增益值较大,极易引发数值异常。

  3. 缺少空引用校验
    未检查hand和handRenderer是否正确赋值,一旦引用为空,不仅会触发空引用错误,还可能导致后续计算出现非法数值。

修正后的代码

// Variables
public GameObject hand;
public GameObject handRenderer;
private Vector3 posOrigin;

// Settings
public float gain = 1f; // 提供默认增益值,避免未赋值风险

// Start is called before the first frame update
void Start()
{
    if (handRenderer != null)
    {
        // 直接给成员变量赋值,避免局部变量覆盖
        posOrigin = handRenderer.transform.position;
    }
    else
    {
        Debug.LogError("请在Inspector中为handRenderer赋值!");
    }
}

// Update is called once per frame
void Update()
{
    // 引用为空时直接跳过,避免异常
    if (hand == null || handRenderer == null) return;

    Vector3 currentHandPos = handRenderer.transform.position;
    // 修正参数顺序:传入初始位置origin,当前位置actual
    float dx = transfo(posOrigin.x, currentHandPos.x);
    float dz = transfo(posOrigin.z, currentHandPos.z);
    
    // 计算并设置目标位置
    hand.transform.position = new Vector3(posOrigin.x + dx, 0, posOrigin.z + dz);
}

float transfo(float origin, float actual)
{
    return gain * (actual - origin);
}

额外排查建议

  • 先在Inspector中确认hand和handRenderer的引用是否正确指向了对应的对象。
  • 测试时先将gain设为1f,确认基础追踪逻辑正常后,再逐步调整增益值(避免过大的增益导致数值溢出)。
  • 若handRenderer的位置本身就出现无限大/NaN,需优先排查手部追踪模块的问题:比如设备连接状态、SDK初始化是否正常、追踪目标是否被正确识别。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 05:45:48