Hi Wojtek,

I moved forward with this. Actually I made it work and it works well on the
dome. The distortion is coming in realtime from their server and it is
changing only the projection matrix. What I did, I saved the pre-distorted
matrix in the Camera as UserData and
in  MinimalShadowMap::ViewData::cullShadowReceivingScene I set the clamp to
use this matrix, so it is now standard matrix and all works fine

osg::RefMatrix* mx =
dynamic_cast<osg::RefMatrix*>(_cv->getRenderInfo()->getCurrentCamera()->getUserData());
_clampedProjection = *mx;//*_cv->getProjectionMatrix();

But, as I mentioned this is rather workaround that works well then a real
solution. Once you get back from vacation I will ping you again and if you
have time and will we (you :-) ) can try to make it proper

Cheers,
Nick



On Wed, Aug 6, 2014 at 10:57 PM, Trajce Nikolov NICK <
[email protected]> wrote:

> Hi again Wojtek,
>
> I read the code of MinimalShadowMap and tried to understand it (at least
> the part of the clamping of the projection matrix). Did some hacks and got
> some result. The best results I have got is that the shadows are now still
> but flickering. Before they were based on the heading and were changing
> with the heading. Nevermind. Here are my findings:
>
> It seam that you clamp the projection matrix only if you have the far
> plane set for the polytope to cut the scene for shadow receival. This is
> the snippet from MinimalShadowMap::ViewData::cullShadowReceivingScene:
>
> // Aditionally clamp far plane if shadows don't need to be cast as
>     // far as main projection far plane
>     if( 0 < *_maxFarPlanePtr )
>         clampProjection( _clampedProjection, 0.f, *_maxFarPlanePtr );
>
> and only there. Now in clampProjection and did some changes to force the
> algorithm path to follow as this is a standard projection matrix but affect
> only those parts of the matrix which are affected by the far plane. Bellow
> is the hacked method. Now all seam to be good across channels only the
> shadows are somewhat as very low res even the setting of the far plane is
> very near (1000m) and the resolution of the texture is pretty high (2048).
> When I set the the far plane to 0 I have the shadow low res again since the
> polytope of the scene is not clamped. Any hints? Thanks again:
>
> void MinimalShadowMap::ViewData::clampProjection
>                     ( osg::Matrixd & projection, float new_near, float
> new_far )
> {
>     double r, l, t, b, n, f;
>     bool perspective = projection.getFrustum( l, r, b, t, n, f );
> perspective = true;
>     if( !perspective && !projection.getOrtho( l, r, b, t, n, f ) )
>     {
>         // What to do here ?
>         OSG_WARN << "MinimalShadowMap::clampProjectionFarPlane failed -
> non standard matrix" << std::endl;
>
>     } else if( n < new_near || new_far < f ) {
>
> #if 0
>         if( n < new_near && new_near < f ) {
>             if( perspective ) {
>                 l *= new_near / n;
>                 r *= new_near / n;
>                 b *= new_near / n;
>                 t *= new_near / n;
>             }
>             n = new_near;
>         }
> #endif
>         //if( n < new_far && new_far < f )
>  {
>             f = new_far;
>         }
>
>         if( perspective )
> #if 0
>             projection.makeFrustum( l, r, b, t, n, f );
> #else
> {
> n = 0.0;
> double C = (fabs(f)>DBL_MAX) ? -1. : -(f+n)/(f-n);
>  double D = (fabs(f)>DBL_MAX) ? -2.*n : -2.0*f*n/(f-n);
> //SET_ROW(0, 2.0*zNear/(right-left),                    0.0, 0.0,  0.0 )
>  //SET_ROW(1,                    0.0, 2.0*zNear/(top-bottom), 0.0,  0.0 )
> //SET_ROW(2,                      A,                      B,   C, -1.0 )
>  //SET_ROW(3,                    0.0,                    0.0,   D,  0.0 )
> projection(2,2) = C;
> projection(3,2) = D;
>  }
> #endif
>         else
>             projection.makeOrtho( l, r, b, t, n, f );
>     }
> }
>
>
>
>
> On Wed, Aug 6, 2014 at 12:05 PM, Trajce Nikolov NICK <
> [email protected]> wrote:
>
>> Hi Wojtek,
>>
>> thanks for the fast reply. I am going to investigate this but there is no
>> source code (black box) so it is hard to say. I took very naive approach
>> for the moment since I am not familiar with the code of the
>> MinimalShadowMap that much and will try to force the conditions in the
>> snippet as the non standard matrix is valid projection matrix and see the
>> results. But will wait for you when you get back from vacation and will
>> ping you again if you can give more hints. Enjoy the vacation!!!!
>>
>> Thanks as always!
>>
>> Nick
>>
>>
>> On Wed, Aug 6, 2014 at 11:59 AM, Wojciech Lewandowski <
>> [email protected]> wrote:
>>
>>> Hi, Trajce,
>>>
>>> I am on vacations. Quick answer is impossible in my opinion. I would bet
>>> that projection software uses some matrix tricks and it would be hard to
>>> figure it out without seeing the code and solution. There is a chance
>>> though, that matrix obtained there is not a right projection matrix used to
>>> render particular channels. As far as I know such solutions, there are a
>>> channel passes which render each channel to offscreen texture/pixelbuffer
>>> and final pass which projects those on sphere or other irregular surface
>>> and then blasts this to screen and projector optics does the rest. So it
>>> may be a chance that projection matrix obtained is for final pass and if
>>> you obtain channel matrices they may turn out to be regular. This of course
>>> brings question why the code obtained wrong perspective matrix instead of
>>> right one ? And here I have no answer too, it has to be traced and debugged
>>> with original code.
>>>
>>> Cheers,
>>> Wojciech Lewandowski
>>>
>>>
>>> 2014-08-06 0:44 GMT+02:00 Trajce Nikolov NICK <
>>> [email protected]>:
>>>
>>>> Hi Community,
>>>>
>>>> My client have a setup with image distortion over a dome, multiple
>>>> channels, and along with the projectors there is an API coming that is well
>>>> integrated in OSG - it modifies the projection matrix somehow. And we are
>>>> facing issues with shadows, in the following snippet:
>>>>
>>>> void MinimalShadowMap::ViewData::clampProjection
>>>>                     ( osg::Matrixd & projection, float new_near, float
>>>> new_far )
>>>> {
>>>>     double r, l, t, b, n, f;
>>>>     bool perspective = projection.getFrustum( l, r, b, t, n, f );
>>>>     if( !perspective && !projection.getOrtho( l, r, b, t, n, f ) )
>>>>     {
>>>>         // What to do here ?
>>>>         OSG_WARN << "MinimalShadowMap::clampProjectionFarPlane failed -
>>>> non standard matrix" << std::endl;
>>>>
>>>>     } else .......
>>>>
>>>> You can see the comment // What to do here ?.
>>>>
>>>> Well, what is to be done there since the distorted matrix coming from
>>>> the API seam to be recognized by non standard matrix? Someone have a clue?
>>>>
>>>> Thanks as always !
>>>>
>>>> Nick
>>>>
>>>> --
>>>> trajce nikolov nick
>>>>
>>>> _______________________________________________
>>>> osg-users mailing list
>>>> [email protected]
>>>>
>>>> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
>>>>
>>>>
>>>
>>> _______________________________________________
>>> osg-users mailing list
>>> [email protected]
>>> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
>>>
>>>
>>
>>
>> --
>> trajce nikolov nick
>>
>
>
>
> --
> trajce nikolov nick
>



-- 
trajce nikolov nick
_______________________________________________
osg-users mailing list
[email protected]
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org

Reply via email to