diff --git a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp
index 7f363dd36f..c222853088 100644
--- a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp
+++ b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp
@@ -1848,6 +1848,13 @@ void Avatar::setPositionViaScript(const glm::vec3& position) {
updateAttitude(getWorldOrientation());
}
+void Avatar::setFeetPositionViaScript(const glm::vec3& position) {
+ auto feetAjustment = getWorldPosition() - getWorldFeetPosition();
+ auto _goToPosition = position + feetAjustment;
+ setWorldPosition(_goToPosition);
+ updateAttitude(getWorldOrientation());
+}
+
void Avatar::setOrientationViaScript(const glm::quat& orientation) {
setWorldOrientation(orientation);
updateAttitude(orientation);
diff --git a/libraries/avatars-renderer/src/avatars-renderer/Avatar.h b/libraries/avatars-renderer/src/avatars-renderer/Avatar.h
index 7bb15ecbf7..891f125b28 100644
--- a/libraries/avatars-renderer/src/avatars-renderer/Avatar.h
+++ b/libraries/avatars-renderer/src/avatars-renderer/Avatar.h
@@ -437,6 +437,7 @@ public:
Q_INVOKABLE glm::vec3 getWorldFeetPosition();
void setPositionViaScript(const glm::vec3& position) override;
+ void setFeetPositionViaScript(const glm::vec3& position) override;
void setOrientationViaScript(const glm::quat& orientation) override;
/**jsdoc
diff --git a/libraries/avatars/src/AvatarData.h b/libraries/avatars/src/AvatarData.h
index 59a2e2a53e..5857a7dcaa 100755
--- a/libraries/avatars/src/AvatarData.h
+++ b/libraries/avatars/src/AvatarData.h
@@ -488,6 +488,7 @@ class AvatarData : public QObject, public SpatiallyNestable {
// IMPORTANT: The JSDoc for the following properties should be copied to MyAvatar.h and ScriptableAvatar.h.
/*
* @property {Vec3} position - The position of the avatar.
+ * @property {Vec3} feetPosition - The feet position of the avatar.
* @property {number} scale=1.0 - The scale of the avatar. The value can be set to anything between 0.005
and
* 1000.0
. When the scale value is fetched, it may temporarily be further limited by the domain's settings.
* @property {number} density - The density of the avatar in kg/m3. The density is used to work out its mass in
@@ -536,6 +537,7 @@ class AvatarData : public QObject, public SpatiallyNestable {
* Read-only.
*/
Q_PROPERTY(glm::vec3 position READ getWorldPosition WRITE setPositionViaScript)
+ Q_PROPERTY(glm::vec3 feetPosition READ getWorldFeetPosition WRITE setFeetPositionViaScript)
Q_PROPERTY(float scale READ getDomainLimitedScale WRITE setTargetScale)
Q_PROPERTY(float density READ getDensity)
Q_PROPERTY(glm::vec3 handPosition READ getHandPosition WRITE setHandPosition)
@@ -629,6 +631,7 @@ public:
void setBodyRoll(float bodyRoll);
virtual void setPositionViaScript(const glm::vec3& position);
+ virtual void setFeetPositionViaScript(const glm::vec3& position);
virtual void setOrientationViaScript(const glm::quat& orientation);
virtual void updateAttitude(const glm::quat& orientation) {}
diff --git a/libraries/avatars/src/ScriptAvatarData.cpp b/libraries/avatars/src/ScriptAvatarData.cpp
index 18717c8ca3..3228445f81 100644
--- a/libraries/avatars/src/ScriptAvatarData.cpp
+++ b/libraries/avatars/src/ScriptAvatarData.cpp
@@ -31,6 +31,13 @@ glm::vec3 ScriptAvatarData::getPosition() const {
return glm::vec3();
}
}
+glm::vec3 ScriptAvatarData::getFeetPosition() const {
+ if (AvatarSharedPointer sharedAvatarData = _avatarData.lock()) {
+ return sharedAvatarData->getWorldFeetPosition();
+ } else {
+ return glm::vec3();
+ }
+}
float ScriptAvatarData::getTargetScale() const {
if (AvatarSharedPointer sharedAvatarData = _avatarData.lock()) {
return sharedAvatarData->getTargetScale();
diff --git a/libraries/avatars/src/ScriptAvatarData.h b/libraries/avatars/src/ScriptAvatarData.h
index 9c5c2c6918..5b962d23df 100644
--- a/libraries/avatars/src/ScriptAvatarData.h
+++ b/libraries/avatars/src/ScriptAvatarData.h
@@ -20,6 +20,7 @@
* Information about an avatar.
* @typedef {object} AvatarData
* @property {Vec3} position - The avatar's position.
+ * @property {Vec3} feetPosition - The avatar's feet position.
* @property {number} scale - The target scale of the avatar without any restrictions on permissible values imposed by the
* domain.
* @property {Vec3} handPosition - A user-defined hand position, in world coordinates. The position moves with the avatar but
@@ -70,6 +71,7 @@ class ScriptAvatarData : public QObject {
// PHYSICAL PROPERTIES: POSITION AND ORIENTATION
//
Q_PROPERTY(glm::vec3 position READ getPosition)
+ Q_PROPERTY(glm::vec3 feetPosition READ getFeetPosition)
Q_PROPERTY(float scale READ getTargetScale)
Q_PROPERTY(glm::vec3 handPosition READ getHandPosition)
Q_PROPERTY(float bodyPitch READ getBodyPitch)
@@ -124,6 +126,7 @@ public:
// PHYSICAL PROPERTIES: POSITION AND ORIENTATION
//
glm::vec3 getPosition() const;
+ glm::vec3 getFeetPosition() const;
float getTargetScale() const;
glm::vec3 getHandPosition() const;
float getBodyPitch() const;