mirror of
https://github.com/overte-org/overte.git
synced 2025-08-08 18:16:45 +02:00
Merge pull request #9 from AndrewMeadows/motor-action
remove unused parameters from Hinge and ConeTwist constraints
This commit is contained in:
commit
f40c7bde71
5 changed files with 28 additions and 127 deletions
|
@ -59,11 +59,9 @@ void ObjectActionMotor::updateActionWorker(btScalar deltaTimeStep) {
|
||||||
|
|
||||||
if (_angularTimeScale < MAX_MOTOR_TIMESCALE) {
|
if (_angularTimeScale < MAX_MOTOR_TIMESCALE) {
|
||||||
|
|
||||||
if (!_otherID.isNull()) {
|
if (other) {
|
||||||
if (other) {
|
glm::vec3 otherAngularVelocity = other->getAngularVelocity();
|
||||||
glm::vec3 otherAngularVelocity = other->getAngularVelocity();
|
rigidBody->setAngularVelocity(glmToBullet(_angularVelocityTarget + otherAngularVelocity));
|
||||||
rigidBody->setAngularVelocity(glmToBullet(_angularVelocityTarget + otherAngularVelocity));
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
rigidBody->setAngularVelocity(glmToBullet(_angularVelocityTarget));
|
rigidBody->setAngularVelocity(glmToBullet(_angularVelocityTarget));
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,8 +15,8 @@
|
||||||
#include "ObjectConstraintConeTwist.h"
|
#include "ObjectConstraintConeTwist.h"
|
||||||
#include "PhysicsLogging.h"
|
#include "PhysicsLogging.h"
|
||||||
|
|
||||||
|
const uint16_t CONE_TWIST_VERSION_WITH_UNUSED_PAREMETERS = 1;
|
||||||
const uint16_t ObjectConstraintConeTwist::constraintVersion = 1;
|
const uint16_t ObjectConstraintConeTwist::constraintVersion = 2;
|
||||||
const glm::vec3 DEFAULT_CONE_TWIST_AXIS(1.0f, 0.0f, 0.0f);
|
const glm::vec3 DEFAULT_CONE_TWIST_AXIS(1.0f, 0.0f, 0.0f);
|
||||||
|
|
||||||
ObjectConstraintConeTwist::ObjectConstraintConeTwist(const QUuid& id, EntityItemPointer ownerEntity) :
|
ObjectConstraintConeTwist::ObjectConstraintConeTwist(const QUuid& id, EntityItemPointer ownerEntity) :
|
||||||
|
@ -56,18 +56,12 @@ void ObjectConstraintConeTwist::updateConeTwist() {
|
||||||
float swingSpan1;
|
float swingSpan1;
|
||||||
float swingSpan2;
|
float swingSpan2;
|
||||||
float twistSpan;
|
float twistSpan;
|
||||||
float softness;
|
|
||||||
float biasFactor;
|
|
||||||
float relaxationFactor;
|
|
||||||
|
|
||||||
withReadLock([&]{
|
withReadLock([&]{
|
||||||
constraint = static_cast<btConeTwistConstraint*>(_constraint);
|
constraint = static_cast<btConeTwistConstraint*>(_constraint);
|
||||||
swingSpan1 = _swingSpan1;
|
swingSpan1 = _swingSpan1;
|
||||||
swingSpan2 = _swingSpan2;
|
swingSpan2 = _swingSpan2;
|
||||||
twistSpan = _twistSpan;
|
twistSpan = _twistSpan;
|
||||||
softness = _softness;
|
|
||||||
biasFactor = _biasFactor;
|
|
||||||
relaxationFactor = _relaxationFactor;
|
|
||||||
});
|
});
|
||||||
|
|
||||||
if (!constraint) {
|
if (!constraint) {
|
||||||
|
@ -76,10 +70,7 @@ void ObjectConstraintConeTwist::updateConeTwist() {
|
||||||
|
|
||||||
constraint->setLimit(swingSpan1,
|
constraint->setLimit(swingSpan1,
|
||||||
swingSpan2,
|
swingSpan2,
|
||||||
twistSpan,
|
twistSpan);
|
||||||
softness,
|
|
||||||
biasFactor,
|
|
||||||
relaxationFactor);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -171,9 +162,6 @@ bool ObjectConstraintConeTwist::updateArguments(QVariantMap arguments) {
|
||||||
float swingSpan1;
|
float swingSpan1;
|
||||||
float swingSpan2;
|
float swingSpan2;
|
||||||
float twistSpan;
|
float twistSpan;
|
||||||
float softness;
|
|
||||||
float biasFactor;
|
|
||||||
float relaxationFactor;
|
|
||||||
|
|
||||||
bool needUpdate = false;
|
bool needUpdate = false;
|
||||||
bool somethingChanged = ObjectDynamic::updateArguments(arguments);
|
bool somethingChanged = ObjectDynamic::updateArguments(arguments);
|
||||||
|
@ -227,25 +215,6 @@ bool ObjectConstraintConeTwist::updateArguments(QVariantMap arguments) {
|
||||||
twistSpan = _twistSpan;
|
twistSpan = _twistSpan;
|
||||||
}
|
}
|
||||||
|
|
||||||
ok = true;
|
|
||||||
softness = EntityDynamicInterface::extractFloatArgument("coneTwist constraint", arguments, "softness", ok, false);
|
|
||||||
if (!ok) {
|
|
||||||
softness = _softness;
|
|
||||||
}
|
|
||||||
|
|
||||||
ok = true;
|
|
||||||
biasFactor = EntityDynamicInterface::extractFloatArgument("coneTwist constraint", arguments, "biasFactor", ok, false);
|
|
||||||
if (!ok) {
|
|
||||||
biasFactor = _biasFactor;
|
|
||||||
}
|
|
||||||
|
|
||||||
ok = true;
|
|
||||||
relaxationFactor =
|
|
||||||
EntityDynamicInterface::extractFloatArgument("coneTwist constraint", arguments, "relaxationFactor", ok, false);
|
|
||||||
if (!ok) {
|
|
||||||
relaxationFactor = _relaxationFactor;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (somethingChanged ||
|
if (somethingChanged ||
|
||||||
pivotInA != _pivotInA ||
|
pivotInA != _pivotInA ||
|
||||||
axisInA != _axisInA ||
|
axisInA != _axisInA ||
|
||||||
|
@ -254,10 +223,7 @@ bool ObjectConstraintConeTwist::updateArguments(QVariantMap arguments) {
|
||||||
axisInB != _axisInB ||
|
axisInB != _axisInB ||
|
||||||
swingSpan1 != _swingSpan1 ||
|
swingSpan1 != _swingSpan1 ||
|
||||||
swingSpan2 != _swingSpan2 ||
|
swingSpan2 != _swingSpan2 ||
|
||||||
twistSpan != _twistSpan ||
|
twistSpan != _twistSpan) {
|
||||||
softness != _softness ||
|
|
||||||
biasFactor != _biasFactor ||
|
|
||||||
relaxationFactor != _relaxationFactor) {
|
|
||||||
// something changed
|
// something changed
|
||||||
needUpdate = true;
|
needUpdate = true;
|
||||||
}
|
}
|
||||||
|
@ -273,9 +239,6 @@ bool ObjectConstraintConeTwist::updateArguments(QVariantMap arguments) {
|
||||||
_swingSpan1 = swingSpan1;
|
_swingSpan1 = swingSpan1;
|
||||||
_swingSpan2 = swingSpan2;
|
_swingSpan2 = swingSpan2;
|
||||||
_twistSpan = twistSpan;
|
_twistSpan = twistSpan;
|
||||||
_softness = softness;
|
|
||||||
_biasFactor = biasFactor;
|
|
||||||
_relaxationFactor = relaxationFactor;
|
|
||||||
|
|
||||||
_active = true;
|
_active = true;
|
||||||
|
|
||||||
|
@ -303,9 +266,6 @@ QVariantMap ObjectConstraintConeTwist::getArguments() {
|
||||||
arguments["swingSpan1"] = _swingSpan1;
|
arguments["swingSpan1"] = _swingSpan1;
|
||||||
arguments["swingSpan2"] = _swingSpan2;
|
arguments["swingSpan2"] = _swingSpan2;
|
||||||
arguments["twistSpan"] = _twistSpan;
|
arguments["twistSpan"] = _twistSpan;
|
||||||
arguments["softness"] = _softness;
|
|
||||||
arguments["biasFactor"] = _biasFactor;
|
|
||||||
arguments["relaxationFactor"] = _relaxationFactor;
|
|
||||||
});
|
});
|
||||||
return arguments;
|
return arguments;
|
||||||
}
|
}
|
||||||
|
@ -330,9 +290,6 @@ QByteArray ObjectConstraintConeTwist::serialize() const {
|
||||||
dataStream << _swingSpan1;
|
dataStream << _swingSpan1;
|
||||||
dataStream << _swingSpan2;
|
dataStream << _swingSpan2;
|
||||||
dataStream << _twistSpan;
|
dataStream << _twistSpan;
|
||||||
dataStream << _softness;
|
|
||||||
dataStream << _biasFactor;
|
|
||||||
dataStream << _relaxationFactor;
|
|
||||||
});
|
});
|
||||||
|
|
||||||
return serializedConstraintArguments;
|
return serializedConstraintArguments;
|
||||||
|
@ -351,7 +308,7 @@ void ObjectConstraintConeTwist::deserialize(QByteArray serializedArguments) {
|
||||||
|
|
||||||
uint16_t serializationVersion;
|
uint16_t serializationVersion;
|
||||||
dataStream >> serializationVersion;
|
dataStream >> serializationVersion;
|
||||||
if (serializationVersion != ObjectConstraintConeTwist::constraintVersion) {
|
if (serializationVersion > ObjectConstraintConeTwist::constraintVersion) {
|
||||||
assert(false);
|
assert(false);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -370,9 +327,12 @@ void ObjectConstraintConeTwist::deserialize(QByteArray serializedArguments) {
|
||||||
dataStream >> _swingSpan1;
|
dataStream >> _swingSpan1;
|
||||||
dataStream >> _swingSpan2;
|
dataStream >> _swingSpan2;
|
||||||
dataStream >> _twistSpan;
|
dataStream >> _twistSpan;
|
||||||
dataStream >> _softness;
|
if (serializationVersion == CONE_TWIST_VERSION_WITH_UNUSED_PAREMETERS) {
|
||||||
dataStream >> _biasFactor;
|
float softness, biasFactor, relaxationFactor;
|
||||||
dataStream >> _relaxationFactor;
|
dataStream >> softness;
|
||||||
|
dataStream >> biasFactor;
|
||||||
|
dataStream >> relaxationFactor;
|
||||||
|
}
|
||||||
|
|
||||||
_active = true;
|
_active = true;
|
||||||
});
|
});
|
||||||
|
|
|
@ -46,9 +46,6 @@ protected:
|
||||||
float _swingSpan1 { TWO_PI };
|
float _swingSpan1 { TWO_PI };
|
||||||
float _swingSpan2 { TWO_PI };;
|
float _swingSpan2 { TWO_PI };;
|
||||||
float _twistSpan { TWO_PI };;
|
float _twistSpan { TWO_PI };;
|
||||||
float _softness { 1.0f };
|
|
||||||
float _biasFactor {0.3f };
|
|
||||||
float _relaxationFactor { 1.0f };
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // hifi_ObjectConstraintConeTwist_h
|
#endif // hifi_ObjectConstraintConeTwist_h
|
||||||
|
|
|
@ -16,7 +16,8 @@
|
||||||
#include "PhysicsLogging.h"
|
#include "PhysicsLogging.h"
|
||||||
|
|
||||||
|
|
||||||
const uint16_t ObjectConstraintHinge::constraintVersion = 1;
|
const uint16_t HINGE_VERSION_WITH_UNUSED_PAREMETERS = 1;
|
||||||
|
const uint16_t ObjectConstraintHinge::constraintVersion = 2;
|
||||||
const glm::vec3 DEFAULT_HINGE_AXIS(1.0f, 0.0f, 0.0f);
|
const glm::vec3 DEFAULT_HINGE_AXIS(1.0f, 0.0f, 0.0f);
|
||||||
|
|
||||||
ObjectConstraintHinge::ObjectConstraintHinge(const QUuid& id, EntityItemPointer ownerEntity) :
|
ObjectConstraintHinge::ObjectConstraintHinge(const QUuid& id, EntityItemPointer ownerEntity) :
|
||||||
|
@ -56,25 +57,19 @@ void ObjectConstraintHinge::updateHinge() {
|
||||||
glm::vec3 axisInA;
|
glm::vec3 axisInA;
|
||||||
float low;
|
float low;
|
||||||
float high;
|
float high;
|
||||||
float softness;
|
|
||||||
float biasFactor;
|
|
||||||
float relaxationFactor;
|
|
||||||
|
|
||||||
withReadLock([&]{
|
withReadLock([&]{
|
||||||
axisInA = _axisInA;
|
axisInA = _axisInA;
|
||||||
constraint = static_cast<btHingeConstraint*>(_constraint);
|
constraint = static_cast<btHingeConstraint*>(_constraint);
|
||||||
low = _low;
|
low = _low;
|
||||||
high = _high;
|
high = _high;
|
||||||
biasFactor = _biasFactor;
|
|
||||||
relaxationFactor = _relaxationFactor;
|
|
||||||
softness = _softness;
|
|
||||||
});
|
});
|
||||||
|
|
||||||
if (!constraint) {
|
if (!constraint) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
constraint->setLimit(low, high, softness, biasFactor, relaxationFactor);
|
constraint->setLimit(low, high);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -159,9 +154,6 @@ bool ObjectConstraintHinge::updateArguments(QVariantMap arguments) {
|
||||||
glm::vec3 axisInB;
|
glm::vec3 axisInB;
|
||||||
float low;
|
float low;
|
||||||
float high;
|
float high;
|
||||||
float softness;
|
|
||||||
float biasFactor;
|
|
||||||
float relaxationFactor;
|
|
||||||
|
|
||||||
bool needUpdate = false;
|
bool needUpdate = false;
|
||||||
bool somethingChanged = ObjectDynamic::updateArguments(arguments);
|
bool somethingChanged = ObjectDynamic::updateArguments(arguments);
|
||||||
|
@ -209,25 +201,6 @@ bool ObjectConstraintHinge::updateArguments(QVariantMap arguments) {
|
||||||
high = _high;
|
high = _high;
|
||||||
}
|
}
|
||||||
|
|
||||||
ok = true;
|
|
||||||
softness = EntityDynamicInterface::extractFloatArgument("hinge constraint", arguments, "softness", ok, false);
|
|
||||||
if (!ok) {
|
|
||||||
softness = _softness;
|
|
||||||
}
|
|
||||||
|
|
||||||
ok = true;
|
|
||||||
biasFactor = EntityDynamicInterface::extractFloatArgument("hinge constraint", arguments, "biasFactor", ok, false);
|
|
||||||
if (!ok) {
|
|
||||||
biasFactor = _biasFactor;
|
|
||||||
}
|
|
||||||
|
|
||||||
ok = true;
|
|
||||||
relaxationFactor = EntityDynamicInterface::extractFloatArgument("hinge constraint", arguments,
|
|
||||||
"relaxationFactor", ok, false);
|
|
||||||
if (!ok) {
|
|
||||||
relaxationFactor = _relaxationFactor;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (somethingChanged ||
|
if (somethingChanged ||
|
||||||
pivotInA != _pivotInA ||
|
pivotInA != _pivotInA ||
|
||||||
axisInA != _axisInA ||
|
axisInA != _axisInA ||
|
||||||
|
@ -235,10 +208,7 @@ bool ObjectConstraintHinge::updateArguments(QVariantMap arguments) {
|
||||||
pivotInB != _pivotInB ||
|
pivotInB != _pivotInB ||
|
||||||
axisInB != _axisInB ||
|
axisInB != _axisInB ||
|
||||||
low != _low ||
|
low != _low ||
|
||||||
high != _high ||
|
high != _high) {
|
||||||
softness != _softness ||
|
|
||||||
biasFactor != _biasFactor ||
|
|
||||||
relaxationFactor != _relaxationFactor) {
|
|
||||||
// something changed
|
// something changed
|
||||||
needUpdate = true;
|
needUpdate = true;
|
||||||
}
|
}
|
||||||
|
@ -253,9 +223,6 @@ bool ObjectConstraintHinge::updateArguments(QVariantMap arguments) {
|
||||||
_axisInB = axisInB;
|
_axisInB = axisInB;
|
||||||
_low = low;
|
_low = low;
|
||||||
_high = high;
|
_high = high;
|
||||||
_softness = softness;
|
|
||||||
_biasFactor = biasFactor;
|
|
||||||
_relaxationFactor = relaxationFactor;
|
|
||||||
|
|
||||||
_active = true;
|
_active = true;
|
||||||
|
|
||||||
|
@ -282,9 +249,6 @@ QVariantMap ObjectConstraintHinge::getArguments() {
|
||||||
arguments["otherAxis"] = glmToQMap(_axisInB);
|
arguments["otherAxis"] = glmToQMap(_axisInB);
|
||||||
arguments["low"] = _low;
|
arguments["low"] = _low;
|
||||||
arguments["high"] = _high;
|
arguments["high"] = _high;
|
||||||
arguments["softness"] = _softness;
|
|
||||||
arguments["biasFactor"] = _biasFactor;
|
|
||||||
arguments["relaxationFactor"] = _relaxationFactor;
|
|
||||||
if (_constraint) {
|
if (_constraint) {
|
||||||
arguments["angle"] = static_cast<btHingeConstraint*>(_constraint)->getHingeAngle(); // [-PI,PI]
|
arguments["angle"] = static_cast<btHingeConstraint*>(_constraint)->getHingeAngle(); // [-PI,PI]
|
||||||
} else {
|
} else {
|
||||||
|
@ -310,9 +274,6 @@ QByteArray ObjectConstraintHinge::serialize() const {
|
||||||
dataStream << _axisInB;
|
dataStream << _axisInB;
|
||||||
dataStream << _low;
|
dataStream << _low;
|
||||||
dataStream << _high;
|
dataStream << _high;
|
||||||
dataStream << _softness;
|
|
||||||
dataStream << _biasFactor;
|
|
||||||
dataStream << _relaxationFactor;
|
|
||||||
|
|
||||||
dataStream << localTimeToServerTime(_expires);
|
dataStream << localTimeToServerTime(_expires);
|
||||||
dataStream << _tag;
|
dataStream << _tag;
|
||||||
|
@ -334,7 +295,7 @@ void ObjectConstraintHinge::deserialize(QByteArray serializedArguments) {
|
||||||
|
|
||||||
uint16_t serializationVersion;
|
uint16_t serializationVersion;
|
||||||
dataStream >> serializationVersion;
|
dataStream >> serializationVersion;
|
||||||
if (serializationVersion != ObjectConstraintHinge::constraintVersion) {
|
if (serializationVersion > ObjectConstraintHinge::constraintVersion) {
|
||||||
assert(false);
|
assert(false);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -347,9 +308,12 @@ void ObjectConstraintHinge::deserialize(QByteArray serializedArguments) {
|
||||||
dataStream >> _axisInB;
|
dataStream >> _axisInB;
|
||||||
dataStream >> _low;
|
dataStream >> _low;
|
||||||
dataStream >> _high;
|
dataStream >> _high;
|
||||||
dataStream >> _softness;
|
if (serializationVersion == HINGE_VERSION_WITH_UNUSED_PAREMETERS) {
|
||||||
dataStream >> _biasFactor;
|
float softness, biasFactor, relaxationFactor;
|
||||||
dataStream >> _relaxationFactor;
|
dataStream >> softness;
|
||||||
|
dataStream >> biasFactor;
|
||||||
|
dataStream >> relaxationFactor;
|
||||||
|
}
|
||||||
|
|
||||||
quint64 serverExpires;
|
quint64 serverExpires;
|
||||||
dataStream >> serverExpires;
|
dataStream >> serverExpires;
|
||||||
|
|
|
@ -48,27 +48,9 @@ protected:
|
||||||
|
|
||||||
// https://gamedev.stackexchange.com/questions/71436/what-are-the-parameters-for-bthingeconstraintsetlimit
|
// https://gamedev.stackexchange.com/questions/71436/what-are-the-parameters-for-bthingeconstraintsetlimit
|
||||||
//
|
//
|
||||||
// softness: a negative measure of the friction that determines how much the hinge rotates for a given force. A high
|
// softness: unused
|
||||||
// softness would make the hinge rotate easily like it's oiled then.
|
// biasFactor: unused
|
||||||
// biasFactor: an offset for the relaxed rotation of the hinge. It won't be right in the middle of the low and high angles
|
// relaxationFactor: unused
|
||||||
// anymore. 1.0f is the neural value.
|
|
||||||
// relaxationFactor: a measure of how much force is applied internally to bring the hinge in its central rotation.
|
|
||||||
// This is right in the middle of the low and high angles. For example, consider a western swing door. After
|
|
||||||
// walking through it will swing in both directions but at the end it stays right in the middle.
|
|
||||||
|
|
||||||
// http://javadoc.jmonkeyengine.org/com/jme3/bullet/joints/HingeJoint.html
|
|
||||||
//
|
|
||||||
// _softness - the factor at which the velocity error correction starts operating, i.e. a softness of 0.9 means that
|
|
||||||
// the vel. corr starts at 90% of the limit range.
|
|
||||||
// _biasFactor - the magnitude of the position correction. It tells you how strictly the position error (drift) is
|
|
||||||
// corrected.
|
|
||||||
// _relaxationFactor - the rate at which velocity errors are corrected. This can be seen as the strength of the
|
|
||||||
// limits. A low value will make the the limits more spongy.
|
|
||||||
|
|
||||||
|
|
||||||
float _softness { 0.9f };
|
|
||||||
float _biasFactor { 0.3f };
|
|
||||||
float _relaxationFactor { 1.0f };
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // hifi_ObjectConstraintHinge_h
|
#endif // hifi_ObjectConstraintHinge_h
|
||||||
|
|
Loading…
Reference in a new issue