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