[osg-users] Perspective Axes Rotation Indicator

2009-10-06 Thread Sean Spicer
Hi Osg-Users,
Here's a topic that I cannot seem to find any reference in the archives for.
 I'm trying to create an Axes rotation indicator Glyph in the lower
left-hand corner of our viewer (X, Y, Z).  I've got working code for this
(see below), but it is an orthographic projection, while my scene is
perspective.  The axes rotation indicator works correctly, (e.g. it
correctly matches the rotation of the trackball  scene) but because it is
ortho and the scene is perspective, it's quite jarring to the user.  Can
someone suggest how I can modify the code below so that it correctly maps
the axes in perspective (ideally, the same perspective frustum as my scene)?

Many thanks.

Sean

Code
---

#ifndef OsgAxes_h
#define OsgAxes_h

// OSG Includes
#include osg/Group
#include osg/Geometry
#include osg/Camera
#include osg/Quat
#include osg/MatrixTransform
#include osg/Referenced
#include osg/NodeCallback
#include osgGA/TrackballManipulator

class OsgAxes : public osg::Group
{

public:

// Public Constructor
explicit OsgAxes(const osgGA::TrackballManipulator trackball);

// Public Destructor
virtual ~OsgAxes();

void updateCurrentRotation();

private:

osg::Geometry *createAxes();

// Prevent Copy  Assignment
 OsgAxes(const OsgAxes );
OsgAxes operator=(const OsgAxes );

osg::ref_ptrosg::MatrixTransform m_rotation;

const osgGA::TrackballManipulator m_trackball;
};

class AxesNodeCallback : public osg::NodeCallback
{
public:
virtual void operator()(osg::Node* node, osg::NodeVisitor* nv)
 {
osg::ref_ptrOsgAxes axes =
dynamic_castOsgAxes* (node);
 if(axes)
{
axes-updateCurrentRotation();
 }
traverse(node, nv);
}
};

OsgAxes::OsgAxes(const osgGA::TrackballManipulator trackball)
: m_trackball(trackball)
{
osg::Camera *camera = new osg::Camera;
 //camera-setProjectionMatrix(osg::Matrix::ortho2D(0, 1280, 0, 1024));
camera-setProjectionMatrix(osg::Matrix::ortho2D(0, 1280, 0, 1024));
 camera-setReferenceFrame(osg::Transform::ABSOLUTE_RF);
camera-setViewMatrix(osg::Matrix::identity());
 camera-setClearMask(GL_DEPTH_BUFFER_BIT);
camera-setRenderOrder(osg::Camera::POST_RENDER);
 camera-setAllowEventFocus(false);

osg::Geode* geode = new osg::Geode();

// turn lighting off for the text and disable depth test to ensure it's
always ontop.
osg::StateSet* stateset = geode-getOrCreateStateSet();
 stateset-setMode(GL_LIGHTING,osg::StateAttribute::OFF);

geode-addDrawable(createAxes());

m_rotation = new osg::MatrixTransform();
m_rotation-setMatrix(osg::Matrix::identity());
 m_rotation-addChild(geode);

osg::MatrixTransform *scale = new osg::MatrixTransform();
 scale-setMatrix(osg::Matrix::scale(osg::Vec3(100.0f, 100.0f, 100.0f)));
scale-addChild(m_rotation.get());

osg::MatrixTransform *translate = new osg::MatrixTransform();
translate-setMatrix(osg::Matrix::translate(osg::Vec3(100.0f, 100.0f,
0.0f)));
 translate-addChild(scale);

camera-addChild(translate);
 addChild(camera);

setUpdateCallback(new AxesNodeCallback);
}

OsgAxes::~OsgAxes()
{

}

osg::Geometry * OsgAxes::createAxes()
{
osg::Geometry* geom = new osg::Geometry;

osg::Vec3Array* vertices = new osg::Vec3Array;
vertices-push_back(osg::Vec3(0.0f, 0.0f, 0.0f));
 vertices-push_back(osg::Vec3(0.5f, 0.0f, 0.0f));
vertices-push_back(osg::Vec3(0.0f, 0.0f, 0.0f));
 vertices-push_back(osg::Vec3(0.0f, 0.5f, 0.0f));
vertices-push_back(osg::Vec3(0.0f, 0.0f, 0.0f));
 vertices-push_back(osg::Vec3(0.0f, 0.0f, 1.0f));
geom-setVertexArray(vertices);

osg::Vec3Array* normals = new osg::Vec3Array;
normals-push_back(osg::Vec3(0.0f,0.0f,1.0f));
 geom-setNormalArray(normals);
geom-setNormalBinding(osg::Geometry::BIND_OVERALL);

osg::Vec4Array* colors = new osg::Vec4Array;
colors-push_back(osg::Vec4(1.0f,0.0,0.0f,1.0f));
 colors-push_back(osg::Vec4(0.0f,1.0,0.0f,1.0f));
colors-push_back(osg::Vec4(0.0f,0.0,1.0f,1.0f));
 geom-setColorArray(colors);
geom-setColorBinding(osg::Geometry::BIND_PER_PRIMITIVE);

geom-addPrimitiveSet(new osg::DrawArrays(GL_LINES,0,6));

osg::StateSet* stateset = geom-getOrCreateStateSet();
 osg::LineWidth *lw = new osg::LineWidth(2.0f);
stateset-setAttribute(lw);

return geom;
}

void OsgAxes::updateCurrentRotation()
{
osg::Matrix mat(m_trackball.getRotation().inverse());
 m_rotation-setMatrix(mat);
}


---
End Code
___
osg-users mailing list
osg-users@lists.openscenegraph.org
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org


Re: [osg-users] Perspective Axes Rotation Indicator

2009-10-06 Thread Pierre Bourdin (gmail)
Hi Sean,

Le mardi 06 octobre 2009 à 09:26 -0500, Sean Spicer a écrit :
 Hi Osg-Users,
 
 
 Here's a topic that I cannot seem to find any reference in the
 archives for.  I'm trying to create an Axes rotation indicator Glyph
 in the lower left-hand corner of our viewer (X, Y, Z).  I've got
 working code for this (see below), but it is an orthographic
 projection, while my scene is perspective.  The axes rotation
 indicator works correctly, (e.g. it correctly matches the rotation of
 the trackball  scene) but because it is ortho and the scene is
 perspective, it's quite jarring to the user.  Can someone suggest how
 I can modify the code below so that it correctly maps the axes in
 perspective (ideally, the same perspective frustum as my scene)?
 
Maybe you could have look at delta3d Compass class:
http://delta3d.sourceforge.net/API/html/classdt_core_1_1_compass.html

I think it is doing exactly what you're looking for...
 
 Many thanks.
 
Cheers, Pierre.
 
 Sean
 
 
 Code
 ---
 
 
 #ifndef OsgAxes_h
 #define OsgAxes_h
 
 
 // OSG Includes
 #include osg/Group
 #include osg/Geometry
 #include osg/Camera
 #include osg/Quat
 #include osg/MatrixTransform
 #include osg/Referenced
 #include osg/NodeCallback
 #include osgGA/TrackballManipulator
 
 
 class OsgAxes : public osg::Group
 {
 
 
 public:
 
 
 // Public Constructor
 explicit OsgAxes(const osgGA::TrackballManipulator trackball);
 
 
 // Public Destructor
 virtual ~OsgAxes();
 
 
 void updateCurrentRotation();
 
 
 private:
 
 
 osg::Geometry *createAxes();
 
 
 // Prevent Copy  Assignment
 OsgAxes(const OsgAxes );
 OsgAxes operator=(const OsgAxes ); 
 
 
 osg::ref_ptrosg::MatrixTransform m_rotation; 
 
 
 const osgGA::TrackballManipulator m_trackball;
 };
 
 
 class AxesNodeCallback : public osg::NodeCallback 
 {
 public:
 virtual void operator()(osg::Node* node, osg::NodeVisitor* nv)
 {
 osg::ref_ptrOsgAxes axes = 
 dynamic_castOsgAxes* (node);
 if(axes)
 {
 axes-updateCurrentRotation();
 }
 traverse(node, nv); 
 }
 };
 
 
 OsgAxes::OsgAxes(const osgGA::TrackballManipulator trackball)
 : m_trackball(trackball)
 {
 osg::Camera *camera = new osg::Camera;
 //camera-setProjectionMatrix(osg::Matrix::ortho2D(0, 1280, 0, 1024));
 camera-setProjectionMatrix(osg::Matrix::ortho2D(0, 1280, 0, 1024));
 camera-setReferenceFrame(osg::Transform::ABSOLUTE_RF);
 camera-setViewMatrix(osg::Matrix::identity());
 camera-setClearMask(GL_DEPTH_BUFFER_BIT);
 camera-setRenderOrder(osg::Camera::POST_RENDER);
 camera-setAllowEventFocus(false);
 
 
 osg::Geode* geode = new osg::Geode();
 
 
 // turn lighting off for the text and disable depth test to ensure
 it's always ontop.
 osg::StateSet* stateset = geode-getOrCreateStateSet();
 stateset-setMode(GL_LIGHTING,osg::StateAttribute::OFF);
 
 
 geode-addDrawable(createAxes());
 
 
 m_rotation = new osg::MatrixTransform();
 m_rotation-setMatrix(osg::Matrix::identity());
 m_rotation-addChild(geode);
 
 
 osg::MatrixTransform *scale = new osg::MatrixTransform();
 scale-setMatrix(osg::Matrix::scale(osg::Vec3(100.0f, 100.0f,
 100.0f)));
 scale-addChild(m_rotation.get());
 
 
 osg::MatrixTransform *translate = new osg::MatrixTransform();
 translate-setMatrix(osg::Matrix::translate(osg::Vec3(100.0f, 100.0f,
 0.0f)));
 translate-addChild(scale);
 
 
 camera-addChild(translate);
 addChild(camera);
 
 
 setUpdateCallback(new AxesNodeCallback);
 }
 
 
 OsgAxes::~OsgAxes()
 {
 
 
 }
 
 
 osg::Geometry * OsgAxes::createAxes()
 {
 osg::Geometry* geom = new osg::Geometry;
 
 
 osg::Vec3Array* vertices = new osg::Vec3Array;
 vertices-push_back(osg::Vec3(0.0f, 0.0f, 0.0f));
 vertices-push_back(osg::Vec3(0.5f, 0.0f, 0.0f));
 vertices-push_back(osg::Vec3(0.0f, 0.0f, 0.0f));
 vertices-push_back(osg::Vec3(0.0f, 0.5f, 0.0f));
 vertices-push_back(osg::Vec3(0.0f, 0.0f, 0.0f));
 vertices-push_back(osg::Vec3(0.0f, 0.0f, 1.0f));
 geom-setVertexArray(vertices);
 
 
 osg::Vec3Array* normals = new osg::Vec3Array;
 normals-push_back(osg::Vec3(0.0f,0.0f,1.0f));
 geom-setNormalArray(normals);
 geom-setNormalBinding(osg::Geometry::BIND_OVERALL);
 
 
 osg::Vec4Array* colors = new osg::Vec4Array;
 colors-push_back(osg::Vec4(1.0f,0.0,0.0f,1.0f));
 colors-push_back(osg::Vec4(0.0f,1.0,0.0f,1.0f));
 colors-push_back(osg::Vec4(0.0f,0.0,1.0f,1.0f));
 geom-setColorArray(colors);
 geom-setColorBinding(osg::Geometry::BIND_PER_PRIMITIVE);
 
 
 geom-addPrimitiveSet(new osg::DrawArrays(GL_LINES,0,6));
 
 
 osg::StateSet* stateset = geom-getOrCreateStateSet();
 osg::LineWidth *lw = new osg::LineWidth(2.0f);
 stateset-setAttribute(lw);
 
 
 return geom;
 }
 
 
 void OsgAxes::updateCurrentRotation()
 {
 osg::Matrix mat(m_trackball.getRotation().inverse());
 m_rotation-setMatrix(mat);
 }
 
 
 
 
 ---
 End Code
 
 
 ___
 osg-users mailing list
 osg-users@lists.openscenegraph.org
 http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org