Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 22 additions & 11 deletions Sofa/Component/Visual/src/sofa/component/visual/BaseCamera.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -217,23 +217,23 @@ void BaseCamera::moveCamera(const type::Vec3 &p, const Quat &q)
updateOutputData();
}

type::Vec3 BaseCamera::cameraToWorldCoordinates(const type::Vec3& p)
type::Vec3 BaseCamera::cameraToWorldCoordinates(const type::Vec3& p) const
{
return d_orientation.getValue().rotate(p) + d_position.getValue();
}

type::Vec3 BaseCamera::worldToCameraCoordinates(const type::Vec3& p)
type::Vec3 BaseCamera::worldToCameraCoordinates(const type::Vec3& p) const
{
return d_orientation.getValue().inverseRotate(p - d_position.getValue());
}

type::Vec3 BaseCamera::cameraToWorldTransform(const type::Vec3& v)
type::Vec3 BaseCamera::cameraToWorldTransform(const type::Vec3& v) const
{
const Quat q = d_orientation.getValue();
return q.rotate(v) ;
}

type::Vec3 BaseCamera::worldToCameraTransform(const type::Vec3& v)
type::Vec3 BaseCamera::worldToCameraTransform(const type::Vec3& v) const
{
return d_orientation.getValue().inverseRotate(v);
}
Expand Down Expand Up @@ -305,7 +305,7 @@ void BaseCamera::setCameraType(unsigned int type)
}


double BaseCamera::getHorizontalFieldOfView()
double BaseCamera::getHorizontalFieldOfView() const
{
const sofa::core::visual::VisualParams* vp = sofa::core::visual::VisualParams::defaultInstance();
const core::visual::VisualParams::Viewport viewport = vp->viewport();
Expand Down Expand Up @@ -661,6 +661,9 @@ void BaseCamera::computeZ()
{
if (d_computeZClip.getValue())
{
const auto sceneCenter = getSceneCenter();
const auto sceneRadius = getSceneRadius();

//modelview transform
sofa::type::Transform<SReal> world_H_cam(d_position.getValue(), this->getOrientation());

Expand Down Expand Up @@ -737,9 +740,7 @@ void BaseCamera::setView(const type::Vec3& position, const Quat &orientation)

void BaseCamera::setDefaultView(const type::Vec3 & gravity)
{
const type::Vec3 & minBBox = d_minBBox.getValue();
const type::Vec3 & maxBBox = d_maxBBox.getValue();
sceneCenter = (minBBox + maxBBox)*0.5;
const auto sceneCenter = getSceneCenter();

if (b_setDefaultParameters)
{
Expand Down Expand Up @@ -770,7 +771,7 @@ void BaseCamera::setDefaultView(const type::Vec3 & gravity)

//Distance
const double coeff = 3.0;
const double dist = (minBBox - sceneCenter).norm() * coeff;
const double dist = (d_minBBox.getValue() - getSceneCenter()).norm() * coeff;
d_distance.setValue(dist);
currentDistance = dist;

Expand All @@ -782,7 +783,7 @@ void BaseCamera::setDefaultView(const type::Vec3 & gravity)
computeZ();
}

void BaseCameraXMLExportSingleParameter(tinyxml2::XMLElement* root, core::objectmodel::BaseData& data, const std::string& comment)
void BaseCameraXMLExportSingleParameter(tinyxml2::XMLElement* root, const core::objectmodel::BaseData& data, const std::string& comment)
{
tinyxml2::XMLElement* node = root->GetDocument()->NewElement( data.getName().c_str() );
node->SetAttribute("value", data.getValueString().c_str() );
Expand All @@ -794,7 +795,7 @@ void BaseCameraXMLExportSingleParameter(tinyxml2::XMLElement* root, core::object
root->LinkEndChild(node);
}

bool BaseCamera::exportParametersInFile(const std::string& viewFilename)
bool BaseCamera::exportParametersInFile(const std::string& viewFilename) const
{
tinyxml2::XMLDocument doc;
tinyxml2::XMLDeclaration* decl = doc.NewDeclaration();
Expand Down Expand Up @@ -920,6 +921,16 @@ void BaseCamera::updateOutputData()
d_zFar.setValue(currentZFar);
}

type::Vec3 BaseCamera::getSceneCenter() const
{
return (d_minBBox.getValue() + d_maxBBox.getValue()) * 0.5_sreal;
}

SReal BaseCamera::getSceneRadius() const
{
return 0.5_sreal * (d_maxBBox.getValue() - d_minBBox.getValue()).norm();
}

void BaseCamera::handleEvent(sofa::core::objectmodel::Event* event)
{
if (sofa::simulation::AnimateBeginEvent::checkEventType(event))
Expand Down
32 changes: 15 additions & 17 deletions Sofa/Component/Visual/src/sofa/component/visual/BaseCamera.h
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,7 @@ class SOFA_COMPONENT_VISUAL_API BaseCamera : public core::objectmodel::BaseObjec
void desactivate();
bool isActivated();

bool exportParametersInFile(const std::string& viewFilename);
bool exportParametersInFile(const std::string& viewFilename) const;
bool importParametersFromFile(const std::string& viewFilename);

void translate(const type::Vec3& t);
Expand All @@ -120,24 +120,25 @@ class SOFA_COMPONENT_VISUAL_API BaseCamera : public core::objectmodel::BaseObjec
type::Ray toRay() const;


type::Vec3 cameraToWorldCoordinates(const type::Vec3& p);
type::Vec3 worldToCameraCoordinates(const type::Vec3& p);
type::Vec3 cameraToWorldTransform(const type::Vec3& v);
type::Vec3 worldToCameraTransform(const type::Vec3& v);
type::Vec3 cameraToWorldCoordinates(const type::Vec3& p) const;
type::Vec3 worldToCameraCoordinates(const type::Vec3& p) const;
type::Vec3 cameraToWorldTransform(const type::Vec3& v) const;
type::Vec3 worldToCameraTransform(const type::Vec3& v) const;
type::Vec3 screenToWorldCoordinates(int x, int y);
type::Vec2 worldToScreenCoordinates(const type::Vec3& p);

void fitSphere(const type::Vec3& center, SReal radius);
void fitBoundingBox(const type::Vec3& min,const type::Vec3& max);


type::Vec3 getPosition()
const type::Vec3& getPosition() const
{
return d_position.getValue();
}

Quat getOrientation() ;
type::Vec3 getLookAt()
Quat getOrientation();

const type::Vec3& getLookAt() const
{
return d_lookAt.getValue();
}
Expand All @@ -148,12 +149,12 @@ class SOFA_COMPONENT_VISUAL_API BaseCamera : public core::objectmodel::BaseObjec
return d_distance.getValue();
}

double getFieldOfView()
double getFieldOfView() const
{
return d_fieldOfView.getValue();
}

double getHorizontalFieldOfView() ;
double getHorizontalFieldOfView() const;

unsigned int getCameraType() const ;

Expand All @@ -164,9 +165,6 @@ class SOFA_COMPONENT_VISUAL_API BaseCamera : public core::objectmodel::BaseObjec
d_minBBox.setValue(min);
d_maxBBox.setValue(max);

sceneCenter = (min + max)*0.5;
sceneRadius = 0.5*(max - min).norm();

computeZ();
}

Expand All @@ -176,12 +174,12 @@ class SOFA_COMPONENT_VISUAL_API BaseCamera : public core::objectmodel::BaseObjec
d_heightViewport.setValue(h);
}

double getZNear()
double getZNear() const
{
return currentZNear;
}

double getZFar()
double getZFar() const
{
return currentZFar;
}
Expand Down Expand Up @@ -260,8 +258,8 @@ class SOFA_COMPONENT_VISUAL_API BaseCamera : public core::objectmodel::BaseObjec
protected:
void updateOutputData();

type::Vec3 sceneCenter;
SReal sceneRadius;
type::Vec3 getSceneCenter() const;
SReal getSceneRadius() const;

bool b_setDefaultParameters;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -85,14 +85,14 @@ void InteractiveCamera::moveCamera(int x, int y)
break;
case SCENE_CENTER_PIVOT:
default:
pivot = sceneCenter;
pivot = getSceneCenter();
break;
}
rotateWorldAroundPoint(newQuat, pivot, m_startingCameraOrientation, m_startingCameraPosition);
}
else if (currentMode == ZOOM_MODE)
{
const double zoomStep = d_zoomSpeed.getValue() * (0.01 * sceneRadius ) / heightViewport;
const double zoomStep = d_zoomSpeed.getValue() * (0.01 * getSceneRadius() ) / heightViewport;
double zoomDistance = zoomStep * -(y - lastMousePosY);

type::Vec3 trans(0.0, 0.0, zoomDistance);
Expand All @@ -109,7 +109,7 @@ void InteractiveCamera::moveCamera(int x, int y)
else if (currentMode == PAN_MODE)
{
type::Vec3 trans(lastMousePosX - x, y-lastMousePosY, 0.0);
trans = cameraToWorldTransform(trans) * d_panSpeed.getValue() * (0.01 * sceneRadius ) ;
trans = cameraToWorldTransform(trans) * d_panSpeed.getValue() * (0.01 * getSceneRadius() ) ;
translate(trans);
if ( !d_fixedLookAtPoint.getValue() )
{
Expand All @@ -126,7 +126,7 @@ void InteractiveCamera::moveCamera(int x, int y)
}
else if (currentMode == WHEEL_ZOOM_MODE)
{
const double zoomStep = d_zoomSpeed.getValue() * (0.01 * sceneRadius ) / heightViewport;
const double zoomStep = d_zoomSpeed.getValue() * (0.01 * getSceneRadius() ) / heightViewport;
double zoomDistance = zoomStep * -(y*0.5);

type::Vec3 trans(0.0, 0.0, zoomDistance);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -503,7 +503,7 @@ void RecordedCamera::moveCamera_mouse(int x, int y)
break;
case SCENE_CENTER_PIVOT :
default:
pivot = sceneCenter;
pivot = getSceneCenter();
break;
}

Expand Down