Updates to the camera code related to stereo, adding fusion distance.
This commit is contained in:
parent
1326f4616d
commit
8aa72d85cf
@ -122,9 +122,20 @@ class SG_EXPORT Camera: public osg::Referenced
|
||||
/** Calculate and return the projection aspect ratio.
|
||||
* Aspect ratio is defined as width/height.*/
|
||||
const double calc_aspectRatio() const;
|
||||
|
||||
|
||||
const Matrix& getProjectionMatrix() const;
|
||||
|
||||
|
||||
/** set the fusion distance, the distance in model coords, when viewing stereo, that the
|
||||
* left and right eye images converge. This value is dual of the screen distance,
|
||||
* which is distance between viewers eyes and display device, while the fusion distance is
|
||||
* this equivilant distance but in the virtual world (model coords.)*/
|
||||
inline const double setFusionDistance() const { return _fusionDistance; }
|
||||
|
||||
/** get fusion distance.*/
|
||||
inline const double getFusionDistance() const { return _fusionDistance; }
|
||||
|
||||
|
||||
enum LookAtType
|
||||
{
|
||||
USE_HOME_POSITON,
|
||||
@ -184,8 +195,6 @@ class SG_EXPORT Camera: public osg::Referenced
|
||||
/** calculate side vector.*/
|
||||
const Vec3 getSideVector() const;
|
||||
|
||||
/** get focal distance.*/
|
||||
inline const double getFocalLength() const { return _focalLength; }
|
||||
|
||||
|
||||
enum TransformMode
|
||||
@ -237,10 +246,19 @@ class SG_EXPORT Camera: public osg::Referenced
|
||||
const Matrix& getModelViewMatrix() const;
|
||||
|
||||
|
||||
/** Switch on/off the use of the near clipping plane which creating the
|
||||
* getClippingVolume(), uses the camera _znear value for the position of the
|
||||
* near clipping plane. By default this value is off.*/
|
||||
void setUseNearClippingPlane(const bool use);
|
||||
/** get whether the ClippingVolume uses a near clipping plane.*/
|
||||
const bool getUseNearClippingPlane() const { return _useNearClippingPlane; }
|
||||
|
||||
|
||||
/** Switch on/off the use of the far clipping plane which creating the
|
||||
* getClippingVolume(), uses the camera _zfar value for the position
|
||||
* of the far clipping plane. By default this value is off.*/
|
||||
void setUseFarClippingPlane(const bool use);
|
||||
/** Get whether the ClippingVolume uses a far clipping plane.*/
|
||||
const bool getUseFarClippingPlane() const { return _useFarClippingPlane; }
|
||||
|
||||
/** get the view frustum clipping in model coordinates */
|
||||
@ -262,6 +280,9 @@ class SG_EXPORT Camera: public osg::Referenced
|
||||
* specialize the camera for each eye view.*/
|
||||
void adjustEyeOffsetForStereo(const osg::Vec3& offset,float screenDistance);
|
||||
|
||||
/** Set up the OpenGL projection and model view matrices.*/
|
||||
virtual void apply(State& state);
|
||||
|
||||
protected:
|
||||
|
||||
void copy(const Camera&);
|
||||
@ -291,7 +312,7 @@ class SG_EXPORT Camera: public osg::Referenced
|
||||
Vec3 _center;
|
||||
Vec3 _up;
|
||||
|
||||
double _focalLength;
|
||||
double _fusionDistance;
|
||||
|
||||
TransformMode _attachedTransformMode;
|
||||
ref_ptr<Matrix> _eyeToModelTransform;
|
||||
@ -311,12 +332,11 @@ class SG_EXPORT Camera: public osg::Referenced
|
||||
mutable ref_ptr<Matrix> _inversemp;
|
||||
|
||||
void calculateMatricesAndClippingVolume() const;
|
||||
|
||||
// values to offset
|
||||
bool _useEyeOffset;
|
||||
osg::Vec3 _eyeOffset;
|
||||
float _screenDistance;
|
||||
|
||||
// used for offsetting camera to ajust for left and right stereo views.
|
||||
bool _useEyeOffset;
|
||||
osg::Vec3 _eyeOffset;
|
||||
float _screenDistance;
|
||||
|
||||
};
|
||||
|
||||
|
@ -2,6 +2,7 @@
|
||||
#include <osg/Camera>
|
||||
#include <osg/Types>
|
||||
#include <osg/Notify>
|
||||
#include <osg/State>
|
||||
|
||||
using namespace osg;
|
||||
|
||||
@ -23,7 +24,7 @@ Camera::Camera()
|
||||
_center.set(0.0f,0.0f,-1.0f);
|
||||
_up.set(0.0f,1.0f,0.0f);
|
||||
|
||||
_focalLength = 1.0f;
|
||||
_fusionDistance = 1.0f;
|
||||
|
||||
_useNearClippingPlane = false;
|
||||
_useFarClippingPlane = false;
|
||||
@ -73,7 +74,7 @@ void Camera::copy(const Camera& camera)
|
||||
_center = camera._center;
|
||||
_up = camera._up;
|
||||
|
||||
_focalLength = camera._focalLength;
|
||||
_fusionDistance = camera._fusionDistance;
|
||||
|
||||
_attachedTransformMode = camera._attachedTransformMode;
|
||||
_eyeToModelTransform = camera._eyeToModelTransform;
|
||||
@ -218,11 +219,11 @@ void Camera::setNearFar(const double zNear, const double zFar)
|
||||
* Typicall used after resizeing a window.*/
|
||||
void Camera::adjustAspectRatio(const double newAspectRatio, const AdjustAspectRatioMode aa)
|
||||
{
|
||||
if (newAspectRatio<0.01f || newAspectRatio>100.0f)
|
||||
{
|
||||
notify(NOTICE)<<"Warning: aspect ratio out of range (0.01..100) in Camera::adjustAspectRatio("<<newAspectRatio<<","<<aa<<")"<<std::endl;
|
||||
return;
|
||||
}
|
||||
if (newAspectRatio<0.01f || newAspectRatio>100.0f)
|
||||
{
|
||||
notify(NOTICE)<<"Warning: aspect ratio out of range (0.01..100) in Camera::adjustAspectRatio("<<newAspectRatio<<","<<aa<<")"<<std::endl;
|
||||
return;
|
||||
}
|
||||
|
||||
double previousAspectRatio = (_right-_left)/(_top-_bottom);
|
||||
double deltaRatio = newAspectRatio/previousAspectRatio;
|
||||
@ -334,7 +335,7 @@ void Camera::home()
|
||||
_up.set(0.0f,1.0f,0.0f);
|
||||
|
||||
// need to set to appropriate values..
|
||||
_focalLength = 1.0f;
|
||||
_fusionDistance = 1.0f;
|
||||
|
||||
_dirty = true;
|
||||
}
|
||||
@ -357,9 +358,6 @@ void Camera::setLookAt(const Vec3& eye,
|
||||
|
||||
ensureOrthogonalUpVector();
|
||||
|
||||
// need to set to appropriate values..
|
||||
_focalLength = (center-eye).length();
|
||||
|
||||
_dirty = true;
|
||||
}
|
||||
|
||||
@ -374,9 +372,6 @@ void Camera::setLookAt(const double eyeX, const double eyeY, const double eyeZ,
|
||||
_up.set(upX,upY,upZ);
|
||||
|
||||
ensureOrthogonalUpVector();
|
||||
|
||||
// need to set to appropriate values..
|
||||
_focalLength = (_center-_eye).length();
|
||||
|
||||
_dirty = true;
|
||||
}
|
||||
@ -393,8 +388,6 @@ void Camera::transformLookAt(const Matrix& matrix)
|
||||
_up -= _eye;
|
||||
_up.normalize();
|
||||
|
||||
_focalLength = (_center-_eye).length();
|
||||
|
||||
_dirty = true;
|
||||
}
|
||||
|
||||
@ -702,7 +695,7 @@ void Camera::calculateMatricesAndClippingVolume() const
|
||||
|
||||
if (_useEyeOffset)
|
||||
{
|
||||
(*_modelViewMatrix) = (*_modelViewMatrix) * Matrix::translate(-_eyeOffset*_focalLength/_screenDistance);
|
||||
(*_modelViewMatrix) = (*_modelViewMatrix) * Matrix::translate(-_eyeOffset*_fusionDistance/_screenDistance);
|
||||
}
|
||||
|
||||
|
||||
@ -818,3 +811,18 @@ void Camera::adjustEyeOffsetForStereo(const osg::Vec3& offset,float screenDistan
|
||||
_screenDistance = screenDistance;
|
||||
_dirty = true;
|
||||
}
|
||||
|
||||
void Camera::apply(State& state)
|
||||
{
|
||||
const Matrix& projectionMat = getProjectionMatrix();
|
||||
glMatrixMode( GL_PROJECTION );
|
||||
glLoadMatrixf(projectionMat.ptr());
|
||||
|
||||
// set up camera modelview.
|
||||
const Matrix& modelView = getModelViewMatrix();
|
||||
glMatrixMode( GL_MODELVIEW );
|
||||
glLoadMatrixf(modelView.ptr());
|
||||
|
||||
state.setCamera(this);
|
||||
|
||||
}
|
||||
|
@ -103,8 +103,7 @@ void RenderStage::draw(osg::State& state,RenderLeaf*& previous)
|
||||
// set up projection
|
||||
const Matrix& projectionMat = _camera->getProjectionMatrix();
|
||||
glMatrixMode( GL_PROJECTION );
|
||||
glLoadIdentity();
|
||||
glMultMatrixf(projectionMat.ptr());
|
||||
glLoadMatrixf(projectionMat.ptr());
|
||||
|
||||
glMatrixMode( GL_MODELVIEW );
|
||||
glLoadIdentity();
|
||||
@ -117,7 +116,7 @@ void RenderStage::draw(osg::State& state,RenderLeaf*& previous)
|
||||
|
||||
// set up camera modelview.
|
||||
const Matrix& modelView = _camera->getModelViewMatrix();
|
||||
glMultMatrixf(modelView.ptr());
|
||||
glLoadMatrixf(modelView.ptr());
|
||||
|
||||
|
||||
if (getLightingMode()==RenderStageLighting::SKY_LIGHT && light)
|
||||
|
@ -331,15 +331,6 @@ void SceneView::draw()
|
||||
left_camera->adjustEyeOffsetForStereo(osg::Vec3(-iod*0.5,0.0f,0.0f),screenDistance);
|
||||
right_camera->adjustEyeOffsetForStereo(osg::Vec3(iod*0.5,0.0f,0.0f),screenDistance);
|
||||
|
||||
|
||||
osg::ColorMatrix* cm = new osg::ColorMatrix;
|
||||
cm->setMatrix(osg::Matrix(0.3f,0.3f,0.3f,0.0f,
|
||||
0.6f,0.6f,0.6f,0.0f,
|
||||
0.1f,0.1f,0.1f,0.0f,
|
||||
0.0f,0.0f,0.0f,1.0f));
|
||||
|
||||
_globalState->setAttribute(cm);
|
||||
|
||||
osg::ColorMask* red = new osg::ColorMask;
|
||||
osg::ColorMask* green = new osg::ColorMask;
|
||||
|
||||
|
@ -184,6 +184,7 @@ bool TrackballManipulator::calcMovement()
|
||||
// return if there is no movement.
|
||||
if (dx==0 && dy==0) return false;
|
||||
|
||||
float focalLength = (_camera->getCenterPoint()-_camera->getEyePoint()).length();
|
||||
unsigned int buttonMask = _ga_t1->getButtonMask();
|
||||
if (buttonMask==GUIEventAdapter::LEFT_BUTTON)
|
||||
{
|
||||
@ -229,8 +230,9 @@ bool TrackballManipulator::calcMovement()
|
||||
{
|
||||
|
||||
// pan model.
|
||||
|
||||
|
||||
float scale = 0.0015f*_camera->getFocalLength();
|
||||
float scale = 0.0015f*focalLength;
|
||||
|
||||
osg::Vec3 uv = _camera->getUpVector();
|
||||
osg::Vec3 sv = _camera->getSideVector();
|
||||
@ -240,7 +242,7 @@ bool TrackballManipulator::calcMovement()
|
||||
mat.makeTranslate(dv.x(),dv.y(),dv.z());
|
||||
|
||||
_camera->transformLookAt(mat);
|
||||
|
||||
|
||||
return true;
|
||||
|
||||
}
|
||||
@ -249,7 +251,7 @@ bool TrackballManipulator::calcMovement()
|
||||
|
||||
// zoom model.
|
||||
|
||||
float fd = _camera->getFocalLength();
|
||||
float fd = focalLength;
|
||||
float scale = 1.0f-dy*0.001f;
|
||||
if (fd*scale>_modelScale*_minimumZoomScale)
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user