BulletSim: normalize quaternian rotations when building compound linksets.
Attempt to fix vehicles being twisted off the ground when they go physical.user_profiles
parent
84118c5735
commit
ddd97cb78e
|
@ -347,21 +347,21 @@ public sealed class BSLinksetCompound : BSLinkset
|
||||||
// Bullet presumes an object's origin (relative <0,0,0>) is its center-of-mass
|
// Bullet presumes an object's origin (relative <0,0,0>) is its center-of-mass
|
||||||
OMV.Vector3 centerOfMassW = ComputeLinksetCenterOfMass();
|
OMV.Vector3 centerOfMassW = ComputeLinksetCenterOfMass();
|
||||||
|
|
||||||
OMV.Quaternion invRootOrientation = OMV.Quaternion.Inverse(LinksetRoot.RawOrientation);
|
OMV.Quaternion invRootOrientation = OMV.Quaternion.Normalize(OMV.Quaternion.Inverse(LinksetRoot.RawOrientation));
|
||||||
|
|
||||||
// 'centerDisplacement' is the value to subtract from children to give physical offset position
|
// 'centerDisplacement' is the value to subtract from children to give physical offset position
|
||||||
OMV.Vector3 centerDisplacement = (centerOfMassW - LinksetRoot.RawPosition) * invRootOrientation;
|
OMV.Vector3 centerDisplacementV = (centerOfMassW - LinksetRoot.RawPosition) * invRootOrientation;
|
||||||
if (UseBulletSimRootOffsetHack || disableCOM)
|
if (UseBulletSimRootOffsetHack || disableCOM)
|
||||||
{
|
{
|
||||||
centerDisplacement = OMV.Vector3.Zero;
|
centerDisplacementV = OMV.Vector3.Zero;
|
||||||
LinksetRoot.ClearDisplacement();
|
LinksetRoot.ClearDisplacement();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
LinksetRoot.SetEffectiveCenterOfMassDisplacement(centerDisplacement);
|
LinksetRoot.SetEffectiveCenterOfMassDisplacement(centerDisplacementV);
|
||||||
}
|
}
|
||||||
DetailLog("{0},BSLinksetCompound.RecomputeLinksetCompound,COM,rootPos={1},com={2},comDisp={3}",
|
DetailLog("{0},BSLinksetCompound.RecomputeLinksetCompound,COM,rootPos={1},com={2},comDisp={3}",
|
||||||
LinksetRoot.LocalID, LinksetRoot.RawPosition, centerOfMassW, centerDisplacement);
|
LinksetRoot.LocalID, LinksetRoot.RawPosition, centerOfMassW, centerDisplacementV);
|
||||||
|
|
||||||
// Add the shapes of all the components of the linkset
|
// Add the shapes of all the components of the linkset
|
||||||
int memberIndex = 1;
|
int memberIndex = 1;
|
||||||
|
@ -372,8 +372,8 @@ public sealed class BSLinksetCompound : BSLinkset
|
||||||
|
|
||||||
// Get a reference to the shape of the child and add that shape to the linkset compound shape
|
// Get a reference to the shape of the child and add that shape to the linkset compound shape
|
||||||
BSShape childShape = cPrim.PhysShape.GetReference(m_physicsScene, cPrim);
|
BSShape childShape = cPrim.PhysShape.GetReference(m_physicsScene, cPrim);
|
||||||
OMV.Vector3 offsetPos = (cPrim.RawPosition - LinksetRoot.RawPosition) * invRootOrientation - centerDisplacement;
|
OMV.Vector3 offsetPos = (cPrim.RawPosition - LinksetRoot.RawPosition) * invRootOrientation - centerDisplacementV;
|
||||||
OMV.Quaternion offsetRot = cPrim.RawOrientation * invRootOrientation;
|
OMV.Quaternion offsetRot = OMV.Quaternion.Normalize(cPrim.RawOrientation) * invRootOrientation;
|
||||||
m_physicsScene.PE.AddChildShapeToCompoundShape(linksetShape.physShapeInfo, childShape.physShapeInfo, offsetPos, offsetRot);
|
m_physicsScene.PE.AddChildShapeToCompoundShape(linksetShape.physShapeInfo, childShape.physShapeInfo, offsetPos, offsetRot);
|
||||||
DetailLog("{0},BSLinksetCompound.RecomputeLinksetCompound,addChild,indx={1},cShape={2},offPos={3},offRot={4}",
|
DetailLog("{0},BSLinksetCompound.RecomputeLinksetCompound,addChild,indx={1},cShape={2},offPos={3},offRot={4}",
|
||||||
LinksetRoot.LocalID, memberIndex, childShape, offsetPos, offsetRot);
|
LinksetRoot.LocalID, memberIndex, childShape, offsetPos, offsetRot);
|
||||||
|
|
Loading…
Reference in New Issue