Bug 1650714 - Part 2: Correct XRRigidTransform inverse math r=daoshengmu,kip,lsalzman

Differential Revision: https://phabricator.services.mozilla.com/D82433
This commit is contained in:
Imanol Fernandez 2020-07-10 22:01:11 +00:00
parent 088f996216
commit a0b122309a
3 changed files with 15 additions and 12 deletions

View File

@ -79,7 +79,7 @@ already_AddRefed<XRViewerPose> XRFrame::GetViewerPose(
gfx::Matrix4x4Double originTransform;
originTransform.SetRotationFromQuaternion(
aReferenceSpace.GetEffectiveOriginOrientation());
aReferenceSpace.GetEffectiveOriginOrientation().Inverse());
originTransform.PreTranslate(-aReferenceSpace.GetEffectiveOriginPosition());
headTransform *= originTransform;
@ -155,7 +155,8 @@ already_AddRefed<XRPose> XRFrame::GetPose(const XRSpace& aSpace,
const bool emulatedPosition = aSpace.IsPositionEmulated();
gfx::Matrix4x4Double base;
base.SetRotationFromQuaternion(aBaseSpace.GetEffectiveOriginOrientation());
base.SetRotationFromQuaternion(
aBaseSpace.GetEffectiveOriginOrientation().Inverse());
base.PreTranslate(-aBaseSpace.GetEffectiveOriginPosition());
gfx::Matrix4x4Double matrix = aSpace.GetEffectiveOriginTransform() * base;

View File

@ -140,11 +140,9 @@ void XRRigidTransform::UpdateInternal() {
mOrientation->SetW(mRawOrientation.w);
}
if (mInverse) {
gfx::QuaternionDouble q(mRawOrientation);
gfx::PointDouble3D p = -mRawPosition;
p = q.RotatePoint(p);
q.Invert();
mInverse->Update(p, q);
gfx::Matrix4x4Double inverseMatrix = mRawTransformMatrix;
Unused << inverseMatrix.Invert();
mInverse->Update(inverseMatrix);
}
}
@ -175,11 +173,9 @@ void XRRigidTransform::GetMatrix(JSContext* aCx,
already_AddRefed<XRRigidTransform> XRRigidTransform::Inverse() {
if (!mInverse) {
gfx::QuaternionDouble q(mRawOrientation);
gfx::PointDouble3D p = -mRawPosition;
p = q.RotatePoint(p);
q.Invert();
mInverse = new XRRigidTransform(mParent, p, q);
gfx::Matrix4x4Double inverseMatrix = mRawTransformMatrix;
Unused << inverseMatrix.Invert();
mInverse = new XRRigidTransform(mParent, inverseMatrix);
}
RefPtr<XRRigidTransform> inverse = mInverse;

View File

@ -122,6 +122,12 @@ class BaseQuaternion {
BaseQuaternion& Invert() { return Conjugate().Normalize(); }
BaseQuaternion Inverse() const {
BaseQuaternion q = *this;
q.Invert();
return q;
}
Point3DTyped<UnknownUnits, T> RotatePoint(
const Point3DTyped<UnknownUnits, T>& aPoint) const {
T uvx = T(2.0) * (y * aPoint.z - z * aPoint.y);