From 867acfe5b4efefb93151abe6764f6ab1391cf3a5 Mon Sep 17 00:00:00 2001 From: epernod Date: Thu, 8 Jan 2026 09:51:37 +0100 Subject: [PATCH] [Visual] Update BaseCamera init logic when a camera is set in the scene with custom Data inputs --- .../src/sofa/component/visual/BaseCamera.cpp | 36 +++++++++---------- .../src/sofa/component/visual/BaseCamera.h | 1 - 2 files changed, 17 insertions(+), 20 deletions(-) diff --git a/Sofa/Component/Visual/src/sofa/component/visual/BaseCamera.cpp b/Sofa/Component/Visual/src/sofa/component/visual/BaseCamera.cpp index c8fd1b55266..2ca6623d436 100644 --- a/Sofa/Component/Visual/src/sofa/component/visual/BaseCamera.cpp +++ b/Sofa/Component/Visual/src/sofa/component/visual/BaseCamera.cpp @@ -108,25 +108,25 @@ void BaseCamera::init() { if(d_position.isSet()) { - if(!d_orientation.isSet()) + if (!d_orientation.isSet() && d_lookAt.isSet()) { d_distance.setValue((d_lookAt.getValue() - d_position.getValue()).norm()); - const Quat q = getOrientationFromLookAt(d_position.getValue(), d_lookAt.getValue()); + const Quat q = getOrientationFromLookAt(d_position.getValue(), d_lookAt.getValue()); d_orientation.setValue(q); } - else if(!d_lookAt.isSet()) + else if (!d_lookAt.isSet() && d_orientation.isSet()) { - //distance assumed to be set - if(!d_distance.isSet()) - msg_warning() << "Missing distance parameter ; taking default value (0.0, 0.0, 0.0)" ; + // distance assumed to be set + if (!d_distance.isSet()) + msg_warning() << "Missing distance parameter. Will use default value (0.0, 0.0, 0.0) to compute lookAt"; const type::Vec3 lookat = getLookAtFromOrientation(d_position.getValue(), d_distance.getValue(), d_orientation.getValue()); d_lookAt.setValue(lookat); } - else + else if (!d_lookAt.isSet() && !d_orientation.isSet()) { - msg_warning() << "Too many missing parameters ; taking default ..." ; + msg_warning() << "Too many missing parameters: If camera position is set, please also specify the orientation and lookAt value (or at least one of the two). Will use default values." ; b_setDefaultParameters = true; } } @@ -143,7 +143,7 @@ void BaseCamera::init() } else { - msg_warning() << "Too many missing parameters ; taking default ..." ; + msg_warning() << "Too many missing parameters: If camera position is not set, please specify at least the lookAt and orientation to compute the position. Will use default values." ; b_setDefaultParameters = true; } } @@ -167,13 +167,6 @@ void BaseCamera::reinit() updateOutputData(); } -void BaseCamera::bwdInit() -{ - d_minBBox.setValue(getContext()->f_bbox.getValue().minBBox()); - d_maxBBox.setValue(getContext()->f_bbox.getValue().maxBBox()); - - updateOutputData(); -} void BaseCamera::translate(const type::Vec3& t) { @@ -720,6 +713,9 @@ void BaseCamera::fitSphere(const type::Vec3 ¢er, SReal radius) void BaseCamera::fitBoundingBox(const type::Vec3 &min, const type::Vec3 &max) { + if (!b_setDefaultParameters) + return; + SReal diameter = std::max(fabs(max[1]-min[1]), fabs(max[0]-min[0])); diameter = std::max((SReal)fabs(max[2]-min[2]), diameter); const type::Vec3 center = (min + max)*0.5; @@ -915,9 +911,11 @@ void BaseCamera::updateOutputData() //TODO: other info to update d_minBBox.setValue(getContext()->f_bbox.getValue().minBBox()); d_maxBBox.setValue(getContext()->f_bbox.getValue().maxBBox()); - - d_zNear.setValue(currentZNear); - d_zFar.setValue(currentZFar); + if (d_computeZClip.getValue()) + { + d_zNear.setValue(currentZNear); + d_zFar.setValue(currentZFar); + } } void BaseCamera::handleEvent(sofa::core::objectmodel::Event* event) diff --git a/Sofa/Component/Visual/src/sofa/component/visual/BaseCamera.h b/Sofa/Component/Visual/src/sofa/component/visual/BaseCamera.h index cd3a7ef26b6..a27b16ea180 100644 --- a/Sofa/Component/Visual/src/sofa/component/visual/BaseCamera.h +++ b/Sofa/Component/Visual/src/sofa/component/visual/BaseCamera.h @@ -87,7 +87,6 @@ class SOFA_COMPONENT_VISUAL_API BaseCamera : public core::objectmodel::BaseObjec void init() override; void reinit() override; - void bwdInit() override; void activate(); void desactivate();