Je suis actuellement à la recherche dans Eigen::Isometry3f
, défini comme typedef Transform<float,3,Isometry> Isometry3f;
. Par conséquent, je ne peux pas, par exemple, affecter un Affine3f
à Isometry3f
, ce qui est bon pour garder l'isométrie intacte. (La raison est que Mode
est cochée dans l'opérateur d'affectation de Transform
.)Comment s'assurer que l'isométrie propre reste isométrique?
Je peux cependant - via le Transform::operator(...)
, les raccourcis à Transform::m_matrix(...)
- font
Eigen::Isometry3f iso;
iso.setIdentity();
iso(1, 1) = 2; //works (but should not ?!)
et détruisent ainsi l'isométrie.
Q1: Ne devrait pas Transform::operator(...)
être désavouée ou au moins émettre un avertissement? Si vous voulez vraiment gâcher, vous pouvez toujours utiliser Transform.matrix()(1,1) = 2
...
Q2: Y at-il d'autres pièges où je pourrais accidentellement détruire mon isométrie?
Q3: S'il y a d'autres pièges: quelle est l'intention de Mode==Isometry
? N'est-ce pas pour assurer la fermeture/sécurité?
Il me semble qu'il y a des endroits où Eigen prend la responsabilité de préserver les isométries, comme l'échelle, le cisaillement et l'assignation ou la concaténation interdits avec des non-isométries. Pourquoi ne pas passer à l'étape suivante et interdire l'accès à la matrice à travers des objets transformés de type isométrie? Alternative: faire clairement comprendre aux docs que c'est un indice puisque les docs de 'Transform' disent seulement que' _Mode' est "le type de transformation" et ne mentionnent pas son utilisation interne comme indice - peut-être incorrect -. Peut-être alors l'enum 'TransformTraits' ne devrait pas être utilisé comme indicateur de mode de stockage et indice pour l'inverse, etc. – Thomas
Rendre opérateur() et linear() const pour Isometry serait pénible pour l'utilisateur et cela casserait le code existant. En revanche, appeler échelle/cisaillement et les goûts est un non sens pour les isométries. Mais je suis d'accord que le document pourrait être plus clair et avertir de tels pièges. – ggael