Skip to content

Commit b1c1809

Browse files
Fixed scaled rotation matrix for Pose (and derived) nodes (cyberbotics#6246)
* Fixed scaled rotation matrix * Cleanup: horizontal drag only used for top nodes * Cleanup unused method
1 parent 0670c55 commit b1c1809

5 files changed

Lines changed: 8 additions & 33 deletions

File tree

src/webots/gui/WbDragPoseEvent.cpp

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -93,10 +93,7 @@ WbDragHorizontalEvent::WbDragHorizontalEvent(const QPoint &initialPosition, WbVi
9393
normalizedMouseRay.normalize();
9494
if (abs(normalizedMouseRay.direction().dot(mUpWorldVector)) > DRAG_HORIZONTAL_MIN_COS) {
9595
mIsMouseRayValid = true;
96-
97-
// in case mSelectedPose is not child of root (ex: Root --> Transform(s) --> mSelectedPose = uppermostSolid)
98-
if (!mSelectedPose->isTopPose())
99-
mCoordinateTransform = WbRotation(mSelectedPose->rotationMatrix()).toQuaternion().conjugated();
96+
assert(mSelectedPose->baseNode()->upperPose() == NULL); // is top Pose node
10097
} else {
10198
mIsMouseRayValid = false;
10299
WbLog::warning(tr("To drag this element, first rotate the view so that the horizontal plane is clearly visible."));
@@ -117,10 +114,6 @@ void WbDragHorizontalEvent::apply(const QPoint &currentMousePosition) {
117114
displacementFromInitialPosition.setX(displacementFromInitialPosition.x() / mScaleFromParents.x());
118115
displacementFromInitialPosition.setZ(displacementFromInitialPosition.z() / mScaleFromParents.z());
119116

120-
// express the displacement in the coordinate frame of the Solid (in case it has some parent Transform(s)).
121-
if (!mSelectedPose->isTopPose())
122-
displacementFromInitialPosition = mCoordinateTransform * displacementFromInitialPosition;
123-
124117
mSelectedPose->setTranslation((mInitialPosition + displacementFromInitialPosition).rounded(WbPrecision::GUI_MEDIUM));
125118
mSelectedPose->emitTranslationOrRotationChangedByUser();
126119
}

src/webots/nodes/WbAbstractPose.cpp

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,6 @@ void WbAbstractPose::init(WbBaseNode *node) {
3939
mMatrix = NULL;
4040
mMatrixNeedUpdate = true;
4141
mVrmlMatrixNeedUpdate = true;
42-
mIsTopPose = false;
43-
mHasSearchedTopPose = false;
4442
mTranslateRotateManipulator = NULL;
4543

4644
mTranslateRotateManipulatorInitialized = false;
@@ -223,15 +221,6 @@ const WbMatrix4 &WbAbstractPose::vrmlMatrix() const {
223221
return mVrmlMatrix;
224222
}
225223

226-
bool WbAbstractPose::isTopPose() const {
227-
if (!mHasSearchedTopPose) {
228-
mIsTopPose = mBaseNode->upperPose() == NULL;
229-
mHasSearchedTopPose = true;
230-
}
231-
232-
return mIsTopPose;
233-
}
234-
235224
// Position and orientation setters
236225

237226
void WbAbstractPose::setTranslationAndRotation(double tx, double ty, double tz, double rx, double ry, double rz, double angle) {

src/webots/nodes/WbAbstractPose.hpp

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -72,10 +72,14 @@ class WbAbstractPose {
7272
WbVector3 yAxis() const { return matrix().yAxis(); }
7373
WbVector3 zAxis() const { return matrix().zAxis(); }
7474

75-
bool isTopPose() const;
76-
7775
// 3x3 absolute rotation matrix
78-
virtual WbMatrix3 rotationMatrix() const { return matrix().extracted3x3Matrix(); }
76+
virtual WbMatrix3 rotationMatrix() const {
77+
const WbMatrix4 &m = matrix();
78+
const WbVector3 &s = m.scale();
79+
WbMatrix3 rm = m.extracted3x3Matrix();
80+
rm.scale(1.0 / s.x(), 1.0 / s.y(), 1.0 / s.z());
81+
return rm;
82+
}
7983

8084
// position in 'world' coordinates
8185
WbVector3 position() const { return matrix().translation(); }
@@ -139,8 +143,6 @@ class WbAbstractPose {
139143
void updateRotationFieldVisibility() const;
140144

141145
virtual void updateMatrix() const;
142-
mutable bool mHasSearchedTopPose;
143-
mutable bool mIsTopPose;
144146
};
145147

146148
void inline WbAbstractPose::setTranslationAndRotationFromOde(double tx, double ty, double tz, double rx, double ry, double rz,

src/webots/nodes/WbTransform.cpp

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -127,14 +127,6 @@ const WbVector3 &WbTransform::absoluteScale() const {
127127
return mAbsoluteScale;
128128
}
129129

130-
WbMatrix3 WbTransform::rotationMatrix() const {
131-
const WbMatrix4 &m = matrix();
132-
const WbVector3 &s = m.scale();
133-
WbMatrix3 rm = m.extracted3x3Matrix();
134-
rm.scale(1.0 / s.x(), 1.0 / s.y(), 1.0 / s.z());
135-
return rm;
136-
}
137-
138130
const WbMatrix4 &WbTransform::vrmlMatrix() const {
139131
if (mVrmlMatrixNeedUpdate) {
140132
mVrmlMatrix.fromVrml(translation(), rotation(), scale());

src/webots/nodes/WbTransform.hpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,6 @@ class WbTransform : public WbPose {
5757
mutable bool mAbsoluteScaleNeedUpdate;
5858

5959
// 3x3 absolute rotation matrix
60-
WbMatrix3 rotationMatrix() const override;
6160
const WbMatrix4 &vrmlMatrix() const override;
6261

6362
protected:

0 commit comments

Comments
 (0)