如何确保本征等距保持等距?
How to ensure Eigen isometry stays isometric?
我目前正在调查 Eigen::Isometry3f
,定义为
typedef Transform<float,3,Isometry> Isometry3f;
。
因此,例如,我无法将 Affine3f
分配给 Isometry3f
,这有助于保持等距完整。 (原因是 Mode
在 Transform
的赋值运算符中被选中。)
不过我可以 - 通过 Transform::operator(...)
,Transform::m_matrix(...)
的快捷方式 - 做
Eigen::Isometry3f iso;
iso.setIdentity();
iso(1, 1) = 2; //works (but should not ?!)
从而破坏等距。
Q1:
Transform::operator(...)
不应该被禁止或至少发出警告吗?如果你真的想搞砸你仍然可以使用 Transform.matrix()(1,1) = 2
...
Q2:
还有其他陷阱,我可能会不小心破坏我的等距图吗?
Q3:
如果还有其他陷阱:Mode==Isometry
的意图是什么?不是保证closedness/safety吗?
Mode==Isometry
的主要目的是提高一些操作的速度,比如反转,或者旋转部分的提取。它本质上说 "I, the user, guaranty to Eigen that the underlying matrix represent an isometry"。因此,用户有责任不自行拍摄。您还可以通过用坏矩阵替换线性部分来打破初始等距:
iso.linear() = Matrix3f::Random();
检查等距并不便宜,所以到处添加检查会破坏最初的目的。也许,添加 bool Transform::checkIsometry()
有助于跟踪用户代码中的问题,但这超出了 SO 的范围。
我目前正在调查 Eigen::Isometry3f
,定义为
typedef Transform<float,3,Isometry> Isometry3f;
。
因此,例如,我无法将 Affine3f
分配给 Isometry3f
,这有助于保持等距完整。 (原因是 Mode
在 Transform
的赋值运算符中被选中。)
不过我可以 - 通过 Transform::operator(...)
,Transform::m_matrix(...)
的快捷方式 - 做
Eigen::Isometry3f iso;
iso.setIdentity();
iso(1, 1) = 2; //works (but should not ?!)
从而破坏等距。
Q1:
Transform::operator(...)
不应该被禁止或至少发出警告吗?如果你真的想搞砸你仍然可以使用 Transform.matrix()(1,1) = 2
...
Q2: 还有其他陷阱,我可能会不小心破坏我的等距图吗?
Q3:
如果还有其他陷阱:Mode==Isometry
的意图是什么?不是保证closedness/safety吗?
Mode==Isometry
的主要目的是提高一些操作的速度,比如反转,或者旋转部分的提取。它本质上说 "I, the user, guaranty to Eigen that the underlying matrix represent an isometry"。因此,用户有责任不自行拍摄。您还可以通过用坏矩阵替换线性部分来打破初始等距:
iso.linear() = Matrix3f::Random();
检查等距并不便宜,所以到处添加检查会破坏最初的目的。也许,添加 bool Transform::checkIsometry()
有助于跟踪用户代码中的问题,但这超出了 SO 的范围。