<div dir="ltr"><div><div>HI Gianni,<br><br></div>There is no need to modify the OSG code, all you need to do is move the update of your transform to after the call to updateTraversals().  You could do this lots of different ways - all under your application control.  Personally I'd do it by expanding the call to viewer->frame() to it's component parts as I suggested earlier.  Alternatively you could subclass from the Viewer/CompositeViewer and override the updateTraversal() method - it's a virtual method to allow you to customize things.<br><br></div>Robert.<br></div><div class="gmail_extra"><br><div class="gmail_quote">On 5 August 2015 at 16:58, Gianni Ambrosio <span dir="ltr"><<a href="mailto:g.ambrosio+osg@gmail.com" target="_blank">g.ambrosio+osg@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi Robert, I didn't understand your answer.<br>
<br>
I use OSG 3.0.1 but I tried with 3.4.0.-rc8 and the behavior is the same. Moreover updateTraversal() of CompositeViewer is basically the same for these versions.<br>
Anyway we are probably talking of a slightly different scenario: I have a slave camera which update callback needs an up to date viewer master camera's view matrix. In this case, as you told me, since the master camera matrix is updated (with the inverse matrix of the manipulator) after the slave camera update callback, then the value is that of the previous frame. I can understand and the reason is in CompositeViewer::updateTraversal() because the for loop "// Do UpdateTraversal for slaves with their own subgraph" is done before "view->getCameraManipulator()->updateCamera(*(view->getCamera()));".<br>
So, to make scenarios like mine working, my suggestion is to move:<br>
<br>
<br>
Code:<br>
<span class=""><br>
            // Do UpdateTraversal for slaves with their own subgraph<br>
            for(unsigned int i=0; i<view->getNumSlaves(); ++i)<br>
            {<br>
                osg::View::Slave& slave = view->getSlave(i);<br>
                osg::Camera* camera = slave._camera.get();<br>
                if(camera && !slave._useMastersSceneData)<br>
                {<br>
                    camera->accept(*_updateVisitor);<br>
                }<br>
            }<br>
<br>
<br>
<br>
<br>
</span>after<br>
<span class=""><br>
<br>
Code:<br>
<br>
        if (view->getCameraManipulator())<br>
        {<br>
            view->setFusionDistance( view->getCameraManipulator()->getFusionDistanceMode(),<br>
                                    view->getCameraManipulator()->getFusionDistanceValue() );<br>
<br>
</span>            view->getCameraManipulator()->updateCamera(*(view->getCamera()));<br>
<br>
        }<br>
<br>
<br>
<br>
<br>
I tried this solution and it works fine.<br>
With this modification the scene remains updated before the main camera, so nothing you already told me should be broken.<br>
Moreover the for loop to move down is related to slave cameras with thier own subgraph.<br>
<br>
Regards,<br>
Gianni[/code]<br>
<span class=""><br>
------------------<br>
Read this topic online here:<br>
</span><a href="http://forum.openscenegraph.org/viewtopic.php?p=64634#64634" rel="noreferrer" target="_blank">http://forum.openscenegraph.org/viewtopic.php?p=64634#64634</a><br>
<div class="HOEnZb"><div class="h5"><br>
<br>
<br>
<br>
<br>
_______________________________________________<br>
osg-users mailing list<br>
<a href="mailto:osg-users@lists.openscenegraph.org">osg-users@lists.openscenegraph.org</a><br>
<a href="http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org" rel="noreferrer" target="_blank">http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org</a><br>
</div></div></blockquote></div><br></div>