mirror of
https://github.com/overte-org/overte.git
synced 2025-08-09 05:58:27 +02:00
Moved animation after physics, hand poses are in world frame.
There are still some debug hacks enabled so I can test in the vive room.
This commit is contained in:
parent
807d31743c
commit
ab19d3e5a2
7 changed files with 68 additions and 41 deletions
|
@ -3218,13 +3218,12 @@ void Application::update(float deltaTime) {
|
||||||
|
|
||||||
controller::Pose leftHandPose = userInputMapper->getPoseState(controller::Action::LEFT_HAND);
|
controller::Pose leftHandPose = userInputMapper->getPoseState(controller::Action::LEFT_HAND);
|
||||||
controller::Pose rightHandPose = userInputMapper->getPoseState(controller::Action::RIGHT_HAND);
|
controller::Pose rightHandPose = userInputMapper->getPoseState(controller::Action::RIGHT_HAND);
|
||||||
myAvatar->setHandControllerPoses(leftHandPose, rightHandPose);
|
auto myAvatarMatrix = createMatFromQuatAndPos(myAvatar->getOrientation(), myAvatar->getPosition());
|
||||||
|
myAvatar->setHandControllerPosesInWorldFrame(leftHandPose.transform(myAvatarMatrix), rightHandPose.transform(myAvatarMatrix));
|
||||||
|
|
||||||
updateThreads(deltaTime); // If running non-threaded, then give the threads some time to process...
|
updateThreads(deltaTime); // If running non-threaded, then give the threads some time to process...
|
||||||
updateDialogs(deltaTime); // update various stats dialogs if present
|
updateDialogs(deltaTime); // update various stats dialogs if present
|
||||||
|
|
||||||
_avatarUpdate->synchronousProcess();
|
|
||||||
|
|
||||||
if (_physicsEnabled) {
|
if (_physicsEnabled) {
|
||||||
PerformanceTimer perfTimer("physics");
|
PerformanceTimer perfTimer("physics");
|
||||||
AvatarManager* avatarManager = DependencyManager::get<AvatarManager>().data();
|
AvatarManager* avatarManager = DependencyManager::get<AvatarManager>().data();
|
||||||
|
@ -3296,6 +3295,8 @@ void Application::update(float deltaTime) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_avatarUpdate->synchronousProcess();
|
||||||
|
|
||||||
{
|
{
|
||||||
PerformanceTimer perfTimer("overlays");
|
PerformanceTimer perfTimer("overlays");
|
||||||
_overlays.update(deltaTime);
|
_overlays.update(deltaTime);
|
||||||
|
|
|
@ -113,9 +113,9 @@ std::shared_ptr<Avatar> AvatarActionHold::getTarget(float deltaTimeStep, glm::qu
|
||||||
// fetch the hand controller pose
|
// fetch the hand controller pose
|
||||||
controller::Pose pose;
|
controller::Pose pose;
|
||||||
if (isRightHand) {
|
if (isRightHand) {
|
||||||
pose = avatarManager->getMyAvatar()->getRightHandControllerPose();
|
pose = avatarManager->getMyAvatar()->getRightHandControllerPoseInWorldFrame();
|
||||||
} else {
|
} else {
|
||||||
pose = avatarManager->getMyAvatar()->getLeftHandControllerPose();
|
pose = avatarManager->getMyAvatar()->getLeftHandControllerPoseInWorldFrame();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pose.isValid()) {
|
if (pose.isValid()) {
|
||||||
|
|
|
@ -512,39 +512,38 @@ void MyAvatar::updateFromTrackers(float deltaTime) {
|
||||||
-MAX_LEAN, MAX_LEAN));
|
-MAX_LEAN, MAX_LEAN));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
glm::vec3 MyAvatar::getLeftHandPosition() const {
|
glm::vec3 MyAvatar::getLeftHandPosition() const {
|
||||||
auto pose = getLeftHandControllerPose();
|
auto pose = getLeftHandControllerPoseInAvatarFrame();
|
||||||
return pose.isValid() ? pose.getTranslation() : glm::vec3(0.0f);
|
return pose.isValid() ? pose.getTranslation() : glm::vec3(0.0f);
|
||||||
}
|
}
|
||||||
|
|
||||||
glm::vec3 MyAvatar::getRightHandPosition() const {
|
glm::vec3 MyAvatar::getRightHandPosition() const {
|
||||||
auto pose = getRightHandControllerPose();
|
auto pose = getRightHandControllerPoseInAvatarFrame();
|
||||||
return pose.isValid() ? pose.getTranslation() : glm::vec3(0.0f);
|
return pose.isValid() ? pose.getTranslation() : glm::vec3(0.0f);
|
||||||
}
|
}
|
||||||
|
|
||||||
glm::vec3 MyAvatar::getLeftHandTipPosition() const {
|
glm::vec3 MyAvatar::getLeftHandTipPosition() const {
|
||||||
const float TIP_LENGTH = 0.3f;
|
const float TIP_LENGTH = 0.3f;
|
||||||
auto pose = getLeftHandControllerPose();
|
auto pose = getLeftHandControllerPoseInAvatarFrame();
|
||||||
return pose.isValid() ? pose.getTranslation() * pose.getRotation() + glm::vec3(0.0f, TIP_LENGTH, 0.0f) : glm::vec3(0.0f);
|
return pose.isValid() ? pose.getTranslation() * pose.getRotation() + glm::vec3(0.0f, TIP_LENGTH, 0.0f) : glm::vec3(0.0f);
|
||||||
}
|
}
|
||||||
|
|
||||||
glm::vec3 MyAvatar::getRightHandTipPosition() const {
|
glm::vec3 MyAvatar::getRightHandTipPosition() const {
|
||||||
const float TIP_LENGTH = 0.3f;
|
const float TIP_LENGTH = 0.3f;
|
||||||
auto pose = getRightHandControllerPose();
|
auto pose = getRightHandControllerPoseInAvatarFrame();
|
||||||
return pose.isValid() ? pose.getTranslation() * pose.getRotation() + glm::vec3(0.0f, TIP_LENGTH, 0.0f) : glm::vec3(0.0f);
|
return pose.isValid() ? pose.getTranslation() * pose.getRotation() + glm::vec3(0.0f, TIP_LENGTH, 0.0f) : glm::vec3(0.0f);
|
||||||
}
|
}
|
||||||
|
|
||||||
controller::Pose MyAvatar::getLeftHandPose() const {
|
controller::Pose MyAvatar::getLeftHandPose() const {
|
||||||
return getLeftHandControllerPose();
|
return getLeftHandControllerPoseInAvatarFrame();
|
||||||
}
|
}
|
||||||
|
|
||||||
controller::Pose MyAvatar::getRightHandPose() const {
|
controller::Pose MyAvatar::getRightHandPose() const {
|
||||||
return getRightHandControllerPose();
|
return getRightHandControllerPoseInAvatarFrame();
|
||||||
}
|
}
|
||||||
|
|
||||||
controller::Pose MyAvatar::getLeftHandTipPose() const {
|
controller::Pose MyAvatar::getLeftHandTipPose() const {
|
||||||
auto pose = getLeftHandControllerPose();
|
auto pose = getLeftHandControllerPoseInAvatarFrame();
|
||||||
glm::vec3 tipTrans = getLeftHandTipPosition();
|
glm::vec3 tipTrans = getLeftHandTipPosition();
|
||||||
pose.velocity += glm::cross(pose.getAngularVelocity(), pose.getTranslation() - tipTrans);
|
pose.velocity += glm::cross(pose.getAngularVelocity(), pose.getTranslation() - tipTrans);
|
||||||
pose.translation = tipTrans;
|
pose.translation = tipTrans;
|
||||||
|
@ -552,7 +551,7 @@ controller::Pose MyAvatar::getLeftHandTipPose() const {
|
||||||
}
|
}
|
||||||
|
|
||||||
controller::Pose MyAvatar::getRightHandTipPose() const {
|
controller::Pose MyAvatar::getRightHandTipPose() const {
|
||||||
auto pose = getRightHandControllerPose();
|
auto pose = getRightHandControllerPoseInAvatarFrame();
|
||||||
glm::vec3 tipTrans = getRightHandTipPosition();
|
glm::vec3 tipTrans = getRightHandTipPosition();
|
||||||
pose.velocity += glm::cross(pose.getAngularVelocity(), pose.getTranslation() - tipTrans);
|
pose.velocity += glm::cross(pose.getAngularVelocity(), pose.getTranslation() - tipTrans);
|
||||||
pose.translation = tipTrans;
|
pose.translation = tipTrans;
|
||||||
|
@ -697,8 +696,8 @@ void MyAvatar::setEnableDebugDrawPosition(bool isEnabled) {
|
||||||
void MyAvatar::setEnableDebugDrawHandControllers(bool isEnabled) {
|
void MyAvatar::setEnableDebugDrawHandControllers(bool isEnabled) {
|
||||||
_enableDebugDrawHandControllers = isEnabled;
|
_enableDebugDrawHandControllers = isEnabled;
|
||||||
if (!isEnabled) {
|
if (!isEnabled) {
|
||||||
DebugDraw::getInstance().removeMyAvatarMarker("leftHandController");
|
DebugDraw::getInstance().removeMarker("leftHandController");
|
||||||
DebugDraw::getInstance().removeMyAvatarMarker("rightHandController");
|
DebugDraw::getInstance().removeMarker("rightHandController");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1096,24 +1095,34 @@ static controller::Pose applyLowVelocityFilter(const controller::Pose& oldPose,
|
||||||
return finalPose;
|
return finalPose;
|
||||||
}
|
}
|
||||||
|
|
||||||
void MyAvatar::setHandControllerPoses(const controller::Pose& left, const controller::Pose& right) {
|
void MyAvatar::setHandControllerPosesInWorldFrame(const controller::Pose& left, const controller::Pose& right) {
|
||||||
if (controller::InputDevice::getLowVelocityFilter()) {
|
if (controller::InputDevice::getLowVelocityFilter()) {
|
||||||
auto oldLeftPose = getLeftHandControllerPose();
|
auto oldLeftPose = getLeftHandControllerPoseInWorldFrame();
|
||||||
auto oldRightPose = getRightHandControllerPose();
|
auto oldRightPose = getRightHandControllerPoseInWorldFrame();
|
||||||
_leftHandControllerPoseCache.set(applyLowVelocityFilter(oldLeftPose, left));
|
_leftHandControllerPoseInWorldFrameCache.set(applyLowVelocityFilter(oldLeftPose, left));
|
||||||
_rightHandControllerPoseCache.set(applyLowVelocityFilter(oldRightPose, right));
|
_rightHandControllerPoseInWorldFrameCache.set(applyLowVelocityFilter(oldRightPose, right));
|
||||||
} else {
|
} else {
|
||||||
_leftHandControllerPoseCache.set(left);
|
_leftHandControllerPoseInWorldFrameCache.set(left);
|
||||||
_rightHandControllerPoseCache.set(right);
|
_rightHandControllerPoseInWorldFrameCache.set(right);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
controller::Pose MyAvatar::getLeftHandControllerPose() const {
|
controller::Pose MyAvatar::getLeftHandControllerPoseInWorldFrame() const {
|
||||||
return _leftHandControllerPoseCache.get();
|
return _leftHandControllerPoseInWorldFrameCache.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
controller::Pose MyAvatar::getRightHandControllerPose() const {
|
controller::Pose MyAvatar::getRightHandControllerPoseInWorldFrame() const {
|
||||||
return _rightHandControllerPoseCache.get();
|
return _rightHandControllerPoseInWorldFrameCache.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
controller::Pose MyAvatar::getLeftHandControllerPoseInAvatarFrame() const {
|
||||||
|
glm::mat4 invAvatarMatrix = glm::inverse(createMatFromQuatAndPos(getOrientation(), getPosition()));
|
||||||
|
return getLeftHandControllerPoseInWorldFrame().transform(invAvatarMatrix);
|
||||||
|
}
|
||||||
|
|
||||||
|
controller::Pose MyAvatar::getRightHandControllerPoseInAvatarFrame() const {
|
||||||
|
glm::mat4 invAvatarMatrix = glm::inverse(createMatFromQuatAndPos(getOrientation(), getPosition()));
|
||||||
|
return getRightHandControllerPoseInWorldFrame().transform(invAvatarMatrix);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MyAvatar::prepareForPhysicsSimulation() {
|
void MyAvatar::prepareForPhysicsSimulation() {
|
||||||
|
@ -1360,20 +1369,23 @@ void MyAvatar::preRender(RenderArgs* renderArgs) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_enableDebugDrawHandControllers) {
|
if (_enableDebugDrawHandControllers) {
|
||||||
auto leftHandPose = getLeftHandControllerPose();
|
auto leftHandPose = getLeftHandControllerPoseInWorldFrame();
|
||||||
auto rightHandPose = getRightHandControllerPose();
|
auto rightHandPose = getRightHandControllerPoseInWorldFrame();
|
||||||
|
|
||||||
if (leftHandPose.isValid()) {
|
if (leftHandPose.isValid()) {
|
||||||
DebugDraw::getInstance().addMyAvatarMarker("leftHandController", leftHandPose.getRotation(), leftHandPose.getTranslation(), glm::vec4(1));
|
DebugDraw::getInstance().addMarker("leftHandController", leftHandPose.getRotation(), leftHandPose.getTranslation(), glm::vec4(1));
|
||||||
} else {
|
} else {
|
||||||
DebugDraw::getInstance().removeMyAvatarMarker("leftHandController");
|
DebugDraw::getInstance().removeMarker("leftHandController");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (rightHandPose.isValid()) {
|
if (rightHandPose.isValid()) {
|
||||||
DebugDraw::getInstance().addMyAvatarMarker("rightHandController", rightHandPose.getRotation(), rightHandPose.getTranslation(), glm::vec4(1));
|
DebugDraw::getInstance().addMarker("rightHandController", rightHandPose.getRotation(), rightHandPose.getTranslation(), glm::vec4(1));
|
||||||
} else {
|
} else {
|
||||||
DebugDraw::getInstance().removeMyAvatarMarker("rightHandController");
|
DebugDraw::getInstance().removeMarker("rightHandController");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// AJT: REMOVE
|
||||||
|
DebugDraw::getInstance().addMyAvatarMarker("REFERENCE", glm::quat(), glm::vec3(0.0f, 0.7f, -0.5f), glm::vec4(1));
|
||||||
}
|
}
|
||||||
|
|
||||||
DebugDraw::getInstance().updateMyAvatarPos(getPosition());
|
DebugDraw::getInstance().updateMyAvatarPos(getPosition());
|
||||||
|
|
|
@ -249,9 +249,11 @@ public:
|
||||||
|
|
||||||
virtual void rebuildCollisionShape() override;
|
virtual void rebuildCollisionShape() override;
|
||||||
|
|
||||||
void setHandControllerPoses(const controller::Pose& left, const controller::Pose& right);
|
void setHandControllerPosesInWorldFrame(const controller::Pose& left, const controller::Pose& right);
|
||||||
controller::Pose MyAvatar::getLeftHandControllerPose() const;
|
controller::Pose getLeftHandControllerPoseInWorldFrame() const;
|
||||||
controller::Pose MyAvatar::getRightHandControllerPose() const;
|
controller::Pose getRightHandControllerPoseInWorldFrame() const;
|
||||||
|
controller::Pose getLeftHandControllerPoseInAvatarFrame() const;
|
||||||
|
controller::Pose getRightHandControllerPoseInAvatarFrame() const;
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
void increaseSize();
|
void increaseSize();
|
||||||
|
@ -450,8 +452,9 @@ private:
|
||||||
bool _hoverReferenceCameraFacingIsCaptured { false };
|
bool _hoverReferenceCameraFacingIsCaptured { false };
|
||||||
glm::vec3 _hoverReferenceCameraFacing { 0.0f, 0.0f, -1.0f }; // hmd sensor space
|
glm::vec3 _hoverReferenceCameraFacing { 0.0f, 0.0f, -1.0f }; // hmd sensor space
|
||||||
|
|
||||||
ThreadSafeValueCache<controller::Pose> _leftHandControllerPoseCache { controller::Pose() };
|
// These are stored in WORLD frame
|
||||||
ThreadSafeValueCache<controller::Pose> _rightHandControllerPoseCache { controller::Pose() };
|
ThreadSafeValueCache<controller::Pose> _leftHandControllerPoseInWorldFrameCache { controller::Pose() };
|
||||||
|
ThreadSafeValueCache<controller::Pose> _rightHandControllerPoseInWorldFrameCache { controller::Pose() };
|
||||||
|
|
||||||
float AVATAR_MOVEMENT_ENERGY_CONSTANT { 0.001f };
|
float AVATAR_MOVEMENT_ENERGY_CONSTANT { 0.001f };
|
||||||
float AUDIO_ENERGY_CONSTANT { 0.000001f };
|
float AUDIO_ENERGY_CONSTANT { 0.000001f };
|
||||||
|
|
|
@ -126,7 +126,7 @@ void SkeletonModel::updateRig(float deltaTime, glm::mat4 parentTransform) {
|
||||||
|
|
||||||
Rig::HandParameters handParams;
|
Rig::HandParameters handParams;
|
||||||
|
|
||||||
auto leftPose = myAvatar->getLeftHandControllerPose();
|
auto leftPose = myAvatar->getLeftHandControllerPoseInAvatarFrame();
|
||||||
if (leftPose.isValid()) {
|
if (leftPose.isValid()) {
|
||||||
handParams.isLeftEnabled = true;
|
handParams.isLeftEnabled = true;
|
||||||
handParams.leftPosition = Quaternions::Y_180 * leftPose.getTranslation();
|
handParams.leftPosition = Quaternions::Y_180 * leftPose.getTranslation();
|
||||||
|
@ -135,7 +135,7 @@ void SkeletonModel::updateRig(float deltaTime, glm::mat4 parentTransform) {
|
||||||
handParams.isLeftEnabled = false;
|
handParams.isLeftEnabled = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto rightPose = myAvatar->getRightHandControllerPose();
|
auto rightPose = myAvatar->getRightHandControllerPoseInAvatarFrame();
|
||||||
if (rightPose.isValid()) {
|
if (rightPose.isValid()) {
|
||||||
handParams.isRightEnabled = true;
|
handParams.isRightEnabled = true;
|
||||||
handParams.rightPosition = Quaternions::Y_180 * rightPose.getTranslation();
|
handParams.rightPosition = Quaternions::Y_180 * rightPose.getTranslation();
|
||||||
|
|
|
@ -392,13 +392,18 @@ void AnimDebugDraw::update() {
|
||||||
|
|
||||||
assert(numVerts == (v - verts));
|
assert(numVerts == (v - verts));
|
||||||
|
|
||||||
|
// This render item bound shit is broken.
|
||||||
|
// Fuck that, use the big ass bound instead.
|
||||||
|
/*
|
||||||
render::Item::Bound theBound;
|
render::Item::Bound theBound;
|
||||||
for (int i = 0; i < numVerts; i++) {
|
for (int i = 0; i < numVerts; i++) {
|
||||||
theBound += verts[i].pos;
|
theBound += verts[i].pos;
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
data._isVisible = (numVerts > 0);
|
data._isVisible = (numVerts > 0);
|
||||||
data._bound = theBound;
|
|
||||||
|
//data._bound = theBound;
|
||||||
data._indexBuffer->resize(sizeof(uint16_t) * numVerts);
|
data._indexBuffer->resize(sizeof(uint16_t) * numVerts);
|
||||||
uint16_t* indices = (uint16_t*)data._indexBuffer->editData();
|
uint16_t* indices = (uint16_t*)data._indexBuffer->editData();
|
||||||
for (int i = 0; i < numVerts; i++) {
|
for (int i = 0; i < numVerts; i++) {
|
||||||
|
|
|
@ -481,6 +481,12 @@ void SixenseManager::InputDevice::handlePoseEvent(float deltaTime, const control
|
||||||
// transform pose into avatar frame.
|
// transform pose into avatar frame.
|
||||||
auto nextPose = controller::Pose(pos, rot, velocity, angularVelocity).transform(controllerToAvatar);
|
auto nextPose = controller::Pose(pos, rot, velocity, angularVelocity).transform(controllerToAvatar);
|
||||||
|
|
||||||
|
if (!left) {
|
||||||
|
// AJT: HACK TO DEBUG IK
|
||||||
|
nextPose.translation = glm::vec3(0.25f, 0.7f, -0.5f);
|
||||||
|
nextPose.rotation = glm::quat();
|
||||||
|
}
|
||||||
|
|
||||||
if (prevPose.isValid() && (deltaTime > std::numeric_limits<float>::epsilon())) {
|
if (prevPose.isValid() && (deltaTime > std::numeric_limits<float>::epsilon())) {
|
||||||
nextPose.velocity = (nextPose.getTranslation() - prevPose.getTranslation()) / deltaTime;
|
nextPose.velocity = (nextPose.getTranslation() - prevPose.getTranslation()) / deltaTime;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue