Referentials do math using meters

This commit is contained in:
Andrew Meadows 2015-02-26 13:42:08 -08:00
parent 8d4ea143ce
commit 9ad88c3793
3 changed files with 25 additions and 33 deletions

View file

@ -21,7 +21,6 @@ ModelReferential::ModelReferential(Referential* referential, EntityTree* tree, A
{
_translation = referential->getTranslation();
_rotation = referential->getRotation();
_scale = referential->getScale();
unpackExtraData(reinterpret_cast<unsigned char*>(referential->getExtraData().data()),
referential->getExtraData().size());
@ -32,7 +31,7 @@ ModelReferential::ModelReferential(Referential* referential, EntityTree* tree, A
const EntityItem* item = _tree->findEntityByID(_entityID);
if (item != NULL) {
_refScale = item->getLargestDimensionInDomainUnits();
_lastRefDimension = item->getDimensionsInMeters();
_refRotation = item->getRotation();
_refPosition = item->getPositionInMeters();
update();
@ -51,14 +50,13 @@ ModelReferential::ModelReferential(const QUuid& entityID, EntityTree* tree, Avat
return;
}
_refScale = item->getLargestDimensionInDomainUnits();
_lastRefDimension = item->getDimensionsInMeters();
_refRotation = item->getRotation();
_refPosition = item->getPositionInMeters();
glm::quat refInvRot = glm::inverse(_refRotation);
_scale = _avatar->getTargetScale() / _refScale;
_rotation = refInvRot * _avatar->getOrientation();
_translation = refInvRot * (avatar->getPosition() - _refPosition) / _refScale;
_translation = refInvRot * (avatar->getPosition() - _refPosition);
}
void ModelReferential::update() {
@ -68,9 +66,10 @@ void ModelReferential::update() {
}
bool somethingChanged = false;
if (item->getLargestDimensionInDomainUnits() != _refScale) {
_refScale = item->getLargestDimensionInDomainUnits();
_avatar->setTargetScale(_refScale * _scale, true);
if (item->getDimensionsInMeters() != _lastRefDimension) {
glm::vec3 oldDimension = _lastRefDimension;
_lastRefDimension = item->getDimensionsInMeters();
_translation *= _lastRefDimension / oldDimension;
somethingChanged = true;
}
if (item->getRotation() != _refRotation) {
@ -78,9 +77,9 @@ void ModelReferential::update() {
_avatar->setOrientation(_refRotation * _rotation, true);
somethingChanged = true;
}
if (item->getPositionInDomainUnits() != _refPosition || somethingChanged) {
_refPosition = item->getPositionInDomainUnits();
_avatar->setPosition(_refPosition * (float)TREE_SCALE + _refRotation * (_translation * _refScale), true);
if (item->getPositionInMeters() != _refPosition || somethingChanged) {
_refPosition = item->getPositionInMeters();
_avatar->setPosition(_refPosition + _refRotation * _translation, true);
}
}
@ -108,7 +107,7 @@ JointReferential::JointReferential(Referential* referential, EntityTree* tree, A
const EntityItem* item = _tree->findEntityByID(_entityID);
const Model* model = getModel(item);
if (!isValid() || model == NULL || _jointIndex >= (uint32_t)(model->getJointStateCount())) {
_refScale = item->getLargestDimensionInDomainUnits();
_lastRefDimension = item->getDimensionsInMeters();
model->getJointRotationInWorldFrame(_jointIndex, _refRotation);
model->getJointPositionInWorldFrame(_jointIndex, _refPosition);
}
@ -119,7 +118,6 @@ JointReferential::JointReferential(uint32_t jointIndex, const QUuid& entityID, E
ModelReferential(entityID, tree, avatar),
_jointIndex(jointIndex)
{
// TODO: Andrew to fix this using meters
_type = JOINT;
const EntityItem* item = _tree->findEntityByID(_entityID);
const Model* model = getModel(item);
@ -129,19 +127,17 @@ JointReferential::JointReferential(uint32_t jointIndex, const QUuid& entityID, E
return;
}
_refScale = item->getLargestDimensionInDomainUnits();
_lastRefDimension = item->getDimensionsInMeters();
model->getJointRotationInWorldFrame(_jointIndex, _refRotation);
model->getJointPositionInWorldFrame(_jointIndex, _refPosition);
glm::quat refInvRot = glm::inverse(_refRotation);
_scale = _avatar->getTargetScale() / _refScale;
_rotation = refInvRot * _avatar->getOrientation();
// BUG! _refPosition is in domain units, but avatar is in meters
_translation = refInvRot * (avatar->getPosition() - _refPosition) / _refScale;
_translation = refInvRot * (avatar->getPosition() - _refPosition);
}
void JointReferential::update() {
// TODO: Andrew to fix this using meters
const EntityItem* item = _tree->findEntityByID(_entityID);
const Model* model = getModel(item);
if (!isValid() || model == NULL || _jointIndex >= (uint32_t)(model->getJointStateCount())) {
@ -149,9 +145,10 @@ void JointReferential::update() {
}
bool somethingChanged = false;
if (item->getLargestDimensionInDomainUnits() != _refScale) {
_refScale = item->getLargestDimensionInDomainUnits();
_avatar->setTargetScale(_refScale * _scale, true);
if (item->getDimensionsInMeters() != _lastRefDimension) {
glm::vec3 oldDimension = _lastRefDimension;
_lastRefDimension = item->getDimensionsInMeters();
_translation *= _lastRefDimension / oldDimension;
somethingChanged = true;
}
if (item->getRotation() != _refRotation) {
@ -159,10 +156,9 @@ void JointReferential::update() {
_avatar->setOrientation(_refRotation * _rotation, true);
somethingChanged = true;
}
if (item->getPositionInDomainUnits() != _refPosition || somethingChanged) {
if (item->getPositionInMeters() != _refPosition || somethingChanged) {
model->getJointPositionInWorldFrame(_jointIndex, _refPosition);
// BUG! _refPosition is in domain units, but avatar is in meters
_avatar->setPosition(_refPosition + _refRotation * (_translation * _refScale), true);
_avatar->setPosition(_refPosition + _refRotation * _translation, true);
}
}

View file

@ -76,7 +76,6 @@ int Referential::pack(unsigned char* destinationBuffer) const {
destinationBuffer += packFloatVec3ToSignedTwoByteFixed(destinationBuffer, _translation, 0);
destinationBuffer += packOrientationQuatToBytes(destinationBuffer, _rotation);
destinationBuffer += packFloatScalarToSignedTwoByteFixed(destinationBuffer, _scale, 0);
return destinationBuffer - startPosition;
}
@ -91,7 +90,6 @@ int Referential::unpack(const unsigned char* sourceBuffer) {
sourceBuffer += unpackFloatVec3FromSignedTwoByteFixed(sourceBuffer, _translation, 0);
sourceBuffer += unpackOrientationQuatFromBytes(sourceBuffer, _rotation);
sourceBuffer += unpackFloatScalarFromSignedTwoByteFixed((const int16_t*) sourceBuffer, &_scale, 0);
return sourceBuffer - startPosition;
}

View file

@ -39,7 +39,6 @@ public:
glm::vec3 getTranslation() const { return _translation; }
glm::quat getRotation() const { return _rotation; }
float getScale() const {return _scale; }
QByteArray getExtraData() const { return _extraDataBuffer; }
virtual void update() {}
@ -62,14 +61,13 @@ protected:
AvatarData* _avatar;
QByteArray _extraDataBuffer;
glm::vec3 _refPosition;
glm::quat _refRotation;
float _refScale;
glm::vec3 _refPosition; // position of object in world-frame
glm::quat _refRotation; // rotation of object in world-frame
glm::vec3 _lastRefDimension; // dimension of object when _translation was last computed
glm::vec3 _translation;
glm::quat _rotation;
float _scale;
glm::vec3 _translation; // offset of avatar in object local-frame
glm::quat _rotation; // rotation of avatar in object local-frame
};
#endif // hifi_Referential_h
#endif // hifi_Referential_h