mirror of
https://github.com/overte-org/overte.git
synced 2025-08-10 13:33:27 +02:00
try to make code that converts bullet-calculated values to parent-frame values more effecient
This commit is contained in:
parent
998a5594c0
commit
eba518cb65
3 changed files with 17 additions and 67 deletions
|
@ -271,44 +271,25 @@ bool EntityMotionState::isCandidateForOwnership() const {
|
||||||
bool EntityMotionState::remoteSimulationOutOfSync(uint32_t simulationStep) {
|
bool EntityMotionState::remoteSimulationOutOfSync(uint32_t simulationStep) {
|
||||||
// NOTE: we only get here if we think we own the simulation
|
// NOTE: we only get here if we think we own the simulation
|
||||||
assert(_body);
|
assert(_body);
|
||||||
|
|
||||||
|
bool parentTransformSuccess;
|
||||||
|
Transform localToWorld = _entity->getParentTransform(parentTransformSuccess);
|
||||||
|
Transform worldToLocal;
|
||||||
|
Transform worldVelocityToLocal;
|
||||||
|
if (parentTransformSuccess) {
|
||||||
|
localToWorld.evalInverse(worldToLocal);
|
||||||
|
worldVelocityToLocal = worldToLocal;
|
||||||
|
worldVelocityToLocal.setTranslation(glm::vec3(0.0f));
|
||||||
|
}
|
||||||
|
|
||||||
// if we've never checked before, our _lastStep will be 0, and we need to initialize our state
|
// if we've never checked before, our _lastStep will be 0, and we need to initialize our state
|
||||||
if (_lastStep == 0) {
|
if (_lastStep == 0) {
|
||||||
btTransform xform = _body->getWorldTransform();
|
btTransform xform = _body->getWorldTransform();
|
||||||
|
_serverPosition = worldToLocal.transform(bulletToGLM(xform.getOrigin()));
|
||||||
// _serverPosition = _entity->worldPositionToParent(bulletToGLM(xform.getOrigin()));
|
_serverRotation = worldToLocal.getRotation() * bulletToGLM(xform.getRotation());
|
||||||
// _serverRotation = _entity->worldRotationToParent(bulletToGLM(xform.getRotation()));
|
_serverVelocity = worldVelocityToLocal.transform(getBodyLinearVelocityGTSigma());
|
||||||
// _serverVelocity = _entity->worldVelocityToParent(getBodyLinearVelocityGTSigma());
|
|
||||||
|
|
||||||
|
|
||||||
_serverPosition = bulletToGLM(xform.getOrigin());
|
|
||||||
_serverRotation = bulletToGLM(xform.getRotation());
|
|
||||||
_serverVelocity = getBodyLinearVelocityGTSigma();
|
|
||||||
bool success;
|
|
||||||
Transform parentTransform = _entity->getParentTransform(success);
|
|
||||||
if (success) {
|
|
||||||
Transform bodyTransform;
|
|
||||||
bodyTransform.setTranslation(_serverPosition);
|
|
||||||
bodyTransform.setRotation(_serverRotation);
|
|
||||||
Transform result;
|
|
||||||
Transform::inverseMult(result, parentTransform, bodyTransform);
|
|
||||||
_serverPosition = result.getTranslation();
|
|
||||||
_serverRotation = result.getRotation();
|
|
||||||
|
|
||||||
// transform velocity into parent-frame
|
|
||||||
parentTransform.setTranslation(glm::vec3(0.0f));
|
|
||||||
Transform velocityTransform;
|
|
||||||
velocityTransform.setTranslation(_serverVelocity);
|
|
||||||
Transform myWorldTransform;
|
|
||||||
Transform::mult(myWorldTransform, parentTransform, velocityTransform);
|
|
||||||
myWorldTransform.setTranslation(_serverVelocity);
|
|
||||||
Transform::inverseMult(result, parentTransform, myWorldTransform);
|
|
||||||
_serverVelocity = result.getTranslation();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
_serverAcceleration = Vectors::ZERO;
|
_serverAcceleration = Vectors::ZERO;
|
||||||
_serverAngularVelocity = _entity->worldVelocityToParent(bulletToGLM(_body->getAngularVelocity()));
|
_serverAngularVelocity = worldVelocityToLocal.transform(bulletToGLM(_body->getAngularVelocity()));
|
||||||
_lastStep = simulationStep;
|
_lastStep = simulationStep;
|
||||||
_serverActionData = _entity->getActionData();
|
_serverActionData = _entity->getActionData();
|
||||||
_numInactiveUpdates = 1;
|
_numInactiveUpdates = 1;
|
||||||
|
@ -381,7 +362,7 @@ bool EntityMotionState::remoteSimulationOutOfSync(uint32_t simulationStep) {
|
||||||
// compute position error
|
// compute position error
|
||||||
|
|
||||||
btTransform worldTrans = _body->getWorldTransform();
|
btTransform worldTrans = _body->getWorldTransform();
|
||||||
glm::vec3 position = _entity->worldPositionToParent(bulletToGLM(worldTrans.getOrigin()));
|
glm::vec3 position = worldToLocal.transform(bulletToGLM(worldTrans.getOrigin()));
|
||||||
|
|
||||||
float dx2 = glm::distance2(position, _serverPosition);
|
float dx2 = glm::distance2(position, _serverPosition);
|
||||||
const float MAX_POSITION_ERROR_SQUARED = 0.000004f; // corresponds to 2mm
|
const float MAX_POSITION_ERROR_SQUARED = 0.000004f; // corresponds to 2mm
|
||||||
|
@ -416,7 +397,7 @@ bool EntityMotionState::remoteSimulationOutOfSync(uint32_t simulationStep) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
const float MIN_ROTATION_DOT = 0.99999f; // This corresponds to about 0.5 degrees of rotation
|
const float MIN_ROTATION_DOT = 0.99999f; // This corresponds to about 0.5 degrees of rotation
|
||||||
glm::quat actualRotation = _entity->worldRotationToParent(bulletToGLM(worldTrans.getRotation()));
|
glm::quat actualRotation = worldToLocal.getRotation() * bulletToGLM(worldTrans.getRotation());
|
||||||
|
|
||||||
#ifdef WANT_DEBUG
|
#ifdef WANT_DEBUG
|
||||||
if ((fabsf(glm::dot(actualRotation, _serverRotation)) < MIN_ROTATION_DOT)) {
|
if ((fabsf(glm::dot(actualRotation, _serverRotation)) < MIN_ROTATION_DOT)) {
|
||||||
|
|
|
@ -174,15 +174,6 @@ glm::vec3 SpatiallyNestable::worldToLocal(const glm::vec3& position,
|
||||||
return result.getTranslation();
|
return result.getTranslation();
|
||||||
}
|
}
|
||||||
|
|
||||||
glm::vec3 SpatiallyNestable::worldPositionToParent(const glm::vec3& position) {
|
|
||||||
bool success;
|
|
||||||
glm::vec3 result = SpatiallyNestable::worldToLocal(position, getParentID(), getParentJointIndex(), success);
|
|
||||||
if (!success) {
|
|
||||||
qDebug() << "Warning -- worldToLocal failed" << getID();
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
glm::vec3 SpatiallyNestable::worldVelocityToLocal(const glm::vec3& velocity, // can be linear or angular
|
glm::vec3 SpatiallyNestable::worldVelocityToLocal(const glm::vec3& velocity, // can be linear or angular
|
||||||
const QUuid& parentID, int parentJointIndex,
|
const QUuid& parentID, int parentJointIndex,
|
||||||
bool& success) {
|
bool& success) {
|
||||||
|
@ -225,15 +216,6 @@ glm::vec3 SpatiallyNestable::worldVelocityToLocal(const glm::vec3& velocity, //
|
||||||
return result.getTranslation();
|
return result.getTranslation();
|
||||||
}
|
}
|
||||||
|
|
||||||
glm::vec3 SpatiallyNestable::worldVelocityToParent(const glm::vec3& velocity) {
|
|
||||||
bool success;
|
|
||||||
glm::vec3 result = SpatiallyNestable::worldVelocityToLocal(velocity, getParentID(), getParentJointIndex(), success);
|
|
||||||
if (!success) {
|
|
||||||
qDebug() << "Warning -- worldVelocityToLocal failed" << getID();
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
glm::quat SpatiallyNestable::worldToLocal(const glm::quat& orientation,
|
glm::quat SpatiallyNestable::worldToLocal(const glm::quat& orientation,
|
||||||
const QUuid& parentID, int parentJointIndex,
|
const QUuid& parentID, int parentJointIndex,
|
||||||
bool& success) {
|
bool& success) {
|
||||||
|
@ -274,15 +256,6 @@ glm::quat SpatiallyNestable::worldToLocal(const glm::quat& orientation,
|
||||||
return result.getRotation();
|
return result.getRotation();
|
||||||
}
|
}
|
||||||
|
|
||||||
glm::quat SpatiallyNestable::worldRotationToParent(const glm::quat& orientation) {
|
|
||||||
bool success;
|
|
||||||
glm::quat result = SpatiallyNestable::worldToLocal(orientation, getParentID(), getParentJointIndex(), success);
|
|
||||||
if (!success) {
|
|
||||||
qDebug() << "Warning -- worldToLocal failed" << getID();
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
glm::vec3 SpatiallyNestable::localToWorld(const glm::vec3& position,
|
glm::vec3 SpatiallyNestable::localToWorld(const glm::vec3& position,
|
||||||
const QUuid& parentID, int parentJointIndex,
|
const QUuid& parentID, int parentJointIndex,
|
||||||
bool& success) {
|
bool& success) {
|
||||||
|
|
|
@ -53,10 +53,6 @@ public:
|
||||||
static glm::vec3 localToWorld(const glm::vec3& position, const QUuid& parentID, int parentJointIndex, bool& success);
|
static glm::vec3 localToWorld(const glm::vec3& position, const QUuid& parentID, int parentJointIndex, bool& success);
|
||||||
static glm::quat localToWorld(const glm::quat& orientation, const QUuid& parentID, int parentJointIndex, bool& success);
|
static glm::quat localToWorld(const glm::quat& orientation, const QUuid& parentID, int parentJointIndex, bool& success);
|
||||||
|
|
||||||
glm::vec3 worldPositionToParent(const glm::vec3& position);
|
|
||||||
glm::vec3 worldVelocityToParent(const glm::vec3& velocity);
|
|
||||||
glm::quat worldRotationToParent(const glm::quat& orientation);
|
|
||||||
|
|
||||||
// world frame
|
// world frame
|
||||||
virtual const Transform getTransform(bool& success, int depth = 0) const;
|
virtual const Transform getTransform(bool& success, int depth = 0) const;
|
||||||
virtual void setTransform(const Transform& transform, bool& success);
|
virtual void setTransform(const Transform& transform, bool& success);
|
||||||
|
|
Loading…
Reference in a new issue