Skip to content

Commit

Permalink
improve zoom controls on orbitcamera
Browse files Browse the repository at this point in the history
  • Loading branch information
lshoek committed Jun 21, 2022
1 parent fe7cec6 commit 531d991
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 7 deletions.
29 changes: 26 additions & 3 deletions modules/napcameracontrol/src/orbitcontroller.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@ RTTI_BEGIN_CLASS(nap::OrbitController)
RTTI_PROPERTY("RotateSpeed", &nap::OrbitController::mRotateSpeed, nap::rtti::EPropertyMetaData::Default)
RTTI_PROPERTY("PerspCameraComponent", &nap::OrbitController::mPerspCameraComponent, nap::rtti::EPropertyMetaData::Required)
RTTI_PROPERTY("LookAtPosition", &nap::OrbitController::mLookAtPos, nap::rtti::EPropertyMetaData::Default)
RTTI_PROPERTY("MinimumZoomDistance", &nap::OrbitController::mMinZoomDistance, nap::rtti::EPropertyMetaData::Default)
RTTI_PROPERTY("LimitZoomDistance", &nap::OrbitController::mLimitZoomDistance, nap::rtti::EPropertyMetaData::Default)
RTTI_END_CLASS

RTTI_BEGIN_CLASS_NO_DEFAULT_CONSTRUCTOR(nap::OrbitControllerInstance)
Expand Down Expand Up @@ -115,11 +117,12 @@ namespace nap
if (!mEnabled)
return;

auto* resource = getComponent<OrbitController>();
if (mMode == EMode::Rotating)
{
// We are using the relative movement of the mouse to update the camera
float yaw = -(pointerMoveEvent.mRelX) * getComponent<OrbitController>()->mRotateSpeed;
float pitch = pointerMoveEvent.mRelY * getComponent<OrbitController>()->mRotateSpeed;
float yaw = -(pointerMoveEvent.mRelX) * resource->mRotateSpeed;
float pitch = pointerMoveEvent.mRelY * resource->mRotateSpeed;

// We need to rotate around the target point. We always first rotate around the local X axis (pitch), and then
// we rotate around the y axis (yaw).
Expand Down Expand Up @@ -147,12 +150,32 @@ namespace nap
if (abs(pointerMoveEvent.mRelY) > abs(pointerMoveEvent.mRelX))
pointer_move = pointerMoveEvent.mRelY;

nap::Logger::info("%d, %d", pointerMoveEvent.mRelX, pointerMoveEvent.mRelY);

// Increase/decrease distance to target
float distance = pointer_move * getComponent<OrbitController>()->mMovementSpeed;
const glm::vec3& direction = mTransformComponent->getLocalTransform()[2];
const glm::vec3& translate = mTransformComponent->getLocalTransform()[3];

mTransformComponent->setTranslate(translate - direction * distance);
glm::vec3 new_translate = translate - direction * distance;

// Limit the zoom distance
if (resource->mLimitZoomDistance)
{
// Evaluate the change in translation
const glm::vec3 lookdir_prevframe = glm::normalize(mLookAtPos - translate);
const glm::vec3 lookdir_curframe = glm::normalize(mLookAtPos - new_translate);

// Ensure the look direction does not flip
if (glm::dot(lookdir_prevframe, lookdir_curframe) < 0.0f)
return;

// Ensure the distance from the target does not exceed the specified minimum
if (glm::length(mLookAtPos - new_translate) < resource->mMinZoomDistance)
new_translate = -lookdir_prevframe * resource->mMinZoomDistance;
}

mTransformComponent->setTranslate(new_translate);
}
}

Expand Down
10 changes: 6 additions & 4 deletions modules/napcameracontrol/src/orbitcontroller.h
Original file line number Diff line number Diff line change
Expand Up @@ -38,10 +38,12 @@ namespace nap
*/
virtual void getDependentComponents(std::vector<rtti::TypeInfo>& components) const override;

float mMovementSpeed = 0.5f; ///< Property: "MovementSpeed" The speed with which to move
float mRotateSpeed = 0.005f; ///< Property: "RotateSpeed" The speed with which to rotate
glm::vec3 mLookAtPos; ///< Property: "LookAtPosition" The world space position to look at

float mMovementSpeed = 0.5f; ///< Property: "MovementSpeed" The speed with which to move
float mRotateSpeed = 0.005f; ///< Property: "RotateSpeed" The speed with which to rotate
float mMinZoomDistance = 0.5f; ///< Property: "MinimumZoomDistance" Limits the camera from moving too close to the lookat position, to use 'LimitZoomDistance' must be enabled
bool mLimitZoomDistance = false; ///< Property: "LimitZoomDistance" Whether to limit the camera from moving past the lookat position
glm::vec3 mLookAtPos; ///< Property: "LookAtPosition" The world space position to look at

ComponentPtr<PerspCameraComponent> mPerspCameraComponent; ///< Property: "PerspCameraComponent" Link to perspective camera that we are controlling
};

Expand Down

0 comments on commit 531d991

Please sign in to comment.