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

自定义Vector类存储NaN值问题及碰撞处理逻辑求助

解决Vector类归一化导致NaN的问题

问题根源

NaN出现的核心原因是归一化零向量:当计算当前向量与上一向量的差值时,如果两者完全相同(差值向量为(0, 0)),此时计算向量长度会得到0,执行x/长度和y/长度就会触发除以零,最终得到NaN值。

修复步骤

1. 给normalize函数加零向量判断

修改Vector类的normalize方法,先检查向量长度是否接近0(考虑浮点数精度,用极小值如1e-9判断),如果是则直接返回原向量或安全默认值,避免除以零:

// 示例伪代码,根据你的实际编程语言调整
Vector normalize(const Vector& vec) {
    double length = sqrt(vec.x * vec.x + vec.y * vec.y);
    // 处理零向量/近似零向量的情况
    if (length < 1e-9) {
        return Vector(0, 0); // 或返回原向量,根据需求选择
    }
    return Vector(vec.x / length, vec.y / length);
}

2. 在碰撞处理逻辑前置检查

在执行归一化前,先判断差值向量是否为近似零向量,如果是则跳过后续的归一化+叠加操作,避免无效计算:

// 碰撞处理逻辑片段
Vector delta = currentVector - prevVector;
double deltaLength = sqrt(delta.x * delta.x + delta.y * delta.y);
if (deltaLength < 1e-9) {
    // 差值过小,无需处理,防止NaN
    return;
}
Vector normalizedDelta = normalize(delta);
// 后续叠加逻辑...

3. 调试验证

在Vector类的赋值逻辑或normalize方法中添加日志,输出x和y的值,确认NaN出现的时机,验证修复是否生效:

void Vector::setX(double xVal) {
    if (isnan(xVal)) {
        printf("NaN detected in X value!\n");
        // 可添加堆栈跟踪定位调用来源
        std::stacktrace::current().dump();
    }
    x = xVal;
}

额外建议

平台跳跃游戏的碰撞处理中,差值向量为零的情况通常意味着玩家卡在碰撞体内(移动方向完全被阻挡),除了避免NaN,还可以考虑直接将玩家位置重置到上一帧的安全位置,或者检测碰撞法线方向进行推开,比单纯叠加归一化向量更高效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 21:15:41