Eigen库AlignedBox3d两种1.5倍缩放代码结果不一致问题咨询
结论
两段代码的缩放逻辑完全不同,运行结果不一致属于正常现象。
差异原因
第一种实现逻辑
以边界框自身的几何中心为缩放锚点:
- 先计算得到边界框的中心坐标,再基于半对角线长度放大1.5倍,向中心两侧对称延伸得到新的min、max坐标
- 缩放后边界框的中心和原边界框中心完全重合,所以会出现负的min坐标,和你得到的第一种输出结果一致。
第二种实现逻辑
以全局坐标原点(0,0,0)为缩放锚点:
- 你构造的
Eigen::Affine变换仅包含UniformScaling(1.5)纯缩放分量,没有平移分量 Eigen::AlignedBox::transform方法会直接对边界框的两个顶点(min、max)应用变换,原min点为(0,0,0),缩放后坐标不变,原max点每个分量乘以1.5,得到的就是你看到的第二种输出结果。
修正方案
如果要让第二种实现和第一种实现效果一致,需要构造带平移的缩放变换,将缩放锚点指定为边界框自身中心,代码如下:
Eigen::Vector3d center = bb.center(); Eigen::Transform<double, 3, Eigen::Affine> transform; transform.setIdentity(); // 变换执行顺序:先将点平移到以bb中心为原点的坐标系 → 执行缩放 → 平移回原全局坐标系 transform.translate(center); transform.scale(1.5); transform.translate(-center); bb.transform(transform);
内容的提问来源于stack exchange,提问作者user7262359
相关产品推荐
相关产品推荐

