[osg-users] Recommended way to render a scene from multiple independent viewpoints
Hannes Naude
naude.jj at gmail.com
Tue Apr 11 05:11:12 PDT 2017
I think I solved my own problem. I was planning to use
viewer.addSlave(cam,...)
and then use
cam->setReferenceFrame(osg::Transform::ABSOLUTE_RF)
to decouple the slave camera from the master. (If this is not the best
approach, I would still like to hear, but it seems pretty clean)
It turned out that I did not even need the second call. I think this is
because I have an update callback attached to each of the slave cameras
that explicitly sets the view matrix to match the world-to-local matrix of
some node in the scenegraph and thereby overrides the slaving.
By the way, this is something else that has bothered me. The requirement
for a camera to track a node in the scenegraph seems like it should be
extremely common. But in order to implement this I had to write my own
little NodeTracker Callback as follows:
class NodeTracker : public NodeCallback
{
public:
NodePath _nodepath;
NodeTracker(Node* node):_nodepath(node->getParentalNodePaths()[0]){}
virtual void operator()(Node* node, NodeVisitor* nv)
{
ref_ptr<Camera> cam=node->asCamera();
if(cam)
{
Matrix mat2=cam->getViewMatrix();
Matrix mat=computeWorldToLocal(_nodepath);
cam->setViewMatrix(mat);
}
traverse(node, nv);
}
};
It feels like this is such a common requirement that something like it
should be built into OSG. I had a look at the tutorial on the subject :
http://trac.openscenegraph.org/projects/osg//wiki/Support/Tutorials/CameraControlNodeFollowing
but it recommends a solution that seems even more generally useful and is
quite verbose, yet is not included in osg. What am I missing here?
Regards
Hannes Naude
On Tue, Apr 11, 2017 at 1:08 PM, Hannes Naude <naude.jj at gmail.com> wrote:
> Hi all
>
> I am trying to render a single scene from multiple viewpoints. I initially
> implemented this with a compositeviewer as per the osgthirdpersonview
> example. This worked fine except that my update callbacks appeared to be
> getting called more than once per render cycle. I assumed that the update
> traversal was being done for each view separately and therefore nodes that
> are present in multiple views will have their update callbacks called
> multiple times. So, at this point I tried to do the same thing but with a
> single View, somewhat similar to the osgCamera example. But, I do not want
> to add my cameras with viewer.addSlave as I want them to move independently
> of one another. So I tried adding them into the scene graph and giving each
> their own GraphicsContext, but even though the windows corresponding to
> these GraphicsContexts get created, it appears as if all rendering is done
> in a single window with multiple viewpoints being rendered over one another.
>
> Obviously there are many ways to skin this cat, but I would appreciate
> some guidance on the recommended approach. To recap my requirements are :
> - Multiple cameras viewing the same scene.
> - Camera positions and orientations must be independently controlled.
> - Node update callbacks should be called only once per Node per render
> cycle.
>
> Any help will be appreciated
>
> Regards
> Hannes Naude
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.openscenegraph.org/pipermail/osg-users-openscenegraph.org/attachments/20170411/8cd5c64d/attachment-0003.htm>
More information about the osg-users
mailing list