mirror of
https://github.com/mozilla/gecko-dev.git
synced 2025-02-01 19:39:13 +00:00
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:
parent
088f996216
commit
a0b122309a
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user