Fix bug with camera following anchor node

This commit is contained in:
Emil Axelsson
2019-08-22 10:27:59 +02:00
parent 0f36cf0dd4
commit 13cb950480
2 changed files with 12 additions and 8 deletions
@@ -83,7 +83,7 @@ public:
ScriptCameraStates& scriptStates();
const ScriptCameraStates& scriptStates() const;
bool shouldFollowAnchorRotation() const;
bool shouldFollowAnchorRotation(const glm::dvec3& cameraPosition) const;
bool followingAnchorRotation() const;
const SceneGraphNode* anchorNode() const;
const SceneGraphNode* aimNode() const;
@@ -290,8 +290,8 @@ private:
/**
* Interpolates between rotationDiff and a 0 rotation.
*/
glm::dquat interpolateRotationDifferential(double deltaTime,
double interpolationTime, const glm::dquat& rotationDiff);
glm::dquat interpolateRotationDifferential(double deltaTime, double interpolationTime,
const glm::dvec3 cameraPosition, const glm::dquat& rotationDiff);
/**
* Get the vector from the camera to the surface of the anchor object in world space.
+9 -5
View File
@@ -369,7 +369,7 @@ void OrbitalNavigator::resetVelocities() {
_websocketStates.resetVelocities();
_scriptStates.resetVelocities();
if (shouldFollowAnchorRotation()) {
if (shouldFollowAnchorRotation(_camera->positionVec3())) {
_followRotationInterpolator.end();
}
else {
@@ -459,6 +459,7 @@ void OrbitalNavigator::updateCameraStateFromStates(double deltaTime) {
anchorNodeRotationDiff = interpolateRotationDifferential(
deltaTime,
_followRotationInterpolationTime,
pose.position,
anchorNodeRotationDiff
);
@@ -701,7 +702,8 @@ void OrbitalNavigator::setRetargetInterpolationTime(float durationInSeconds) {
_retargetInterpolationTime = durationInSeconds;
}
bool OrbitalNavigator::shouldFollowAnchorRotation() const {
bool OrbitalNavigator::shouldFollowAnchorRotation(const glm::dvec3& cameraPosition) const
{
if (!_anchorNode) {
return false;
}
@@ -709,7 +711,7 @@ bool OrbitalNavigator::shouldFollowAnchorRotation() const {
const glm::dmat4 modelTransform = _anchorNode->modelTransform();
const glm::dmat4 inverseModelTransform = _anchorNode->inverseModelTransform();
const glm::dvec3 cameraPositionModelSpace = glm::dvec3(inverseModelTransform *
glm::dvec4(_camera->positionVec3(), 1.0));
glm::dvec4(cameraPosition, 1.0));
const SurfacePositionHandle positionHandle =
_anchorNode->calculateSurfacePositionHandle(cameraPositionModelSpace);
@@ -719,7 +721,7 @@ bool OrbitalNavigator::shouldFollowAnchorRotation() const {
) * _followAnchorNodeRotationDistance;
const double distanceToCamera =
glm::distance(_camera->positionVec3(), _anchorNode->worldPosition());
glm::distance(cameraPosition, _anchorNode->worldPosition());
return distanceToCamera < maximumDistanceForRotation;
}
@@ -1277,10 +1279,12 @@ glm::dvec3 OrbitalNavigator::pushToSurface(double minHeightAboveGround,
glm::dquat OrbitalNavigator::interpolateRotationDifferential(double deltaTime,
double interpolationTime,
const glm::dvec3 cameraPosition,
const glm::dquat& rotationDiff)
{
// Interpolate with a negative delta time if distance is too large to follow
const double interpolationSign = shouldFollowAnchorRotation() ? 1.0 : -1.0;
const double interpolationSign =
shouldFollowAnchorRotation(cameraPosition) ? 1.0 : -1.0;
_followRotationInterpolator.setInterpolationTime(static_cast<float>(
interpolationTime