Hi,

I found a bug in the method makePerspective of Matrix_implementation. I am 
using the version 3.0.1 of OSG.
I am working on a confidential network and computer, and so I could not test 
the same method in a newer version
of OSG. I searched for any fix of that bug on the forum, but it seems that this 
bug has not been fixed yet.

The bug is that, the computed parameters "right" and "left" computed to define 
the frustum are incorrect.

It is easy to verify with the following numerical example.
Suppose that we want to create a perspective with a fovx of 90° and a fovy of 
30°. Suppose that znear is equal to 10,
and zfar is equal to 500. We would ask for a perspective with an aspect ratio 
equal to 3.

The corresponding frustum is so that the half FOV along x axis is equal to 45°. 
According to the definition of the 
viewing frustum, the triangle defined with edges of length zNearand right is 
isosceles, rectangle at the 
vertex common between those 2 edges. And so, right is equal to 10 as zNear.

In Matrix_implementation::makePerspective, the frustum parameters (and so 
right) are computed as :

Code:

void Matrix_implementation::makePerspective (double fovy, double aspectRatio, 
        double zNear, double zFar)
{
        double tan_fovy = tan (DegreesToRadians (fovy * 0.5));
        double right = tan_fovy * aspectRatio * zNear;
        double left = -right;
        double top = tan_fovy * zNear;
        double bottom = -top;
        makeFrustum (left, right, bottom, top, zNear, zFar);
}




The parameters top and bottom are good, but not left and right.
Indeed, the value of aspectRatio would have been applied on the fovy and not on 
its tangent.
With this code and the given numerical example, we found that right is equal to 
8.04 and not 10.

I suggest the following code :

Code:

void Matrix_implementation::makePerspective (double fovy, double aspectRatio, 
        double zNear, double zFar)
{
        double tan_fovyDiv2 = tan (DegreesToRadians (fovy * 0.5));
        double top = tan_fovyDiv2 * zNear;
        double bottom = -top;
        double tan_fovxDiv2 = tan (DegreesToRadians (fovy * 0.5 * aspectRatio));
        double right = tan_fovxDiv2 * zNear;
        double left = -right;
        makeFrustum (left, right, bottom, top, zNear, zFar);
}




With this code, and the given numerical example we found that right is equal to 
10.

The method Matrix_implementation::makePerspective is used in the Matrixd class 
and so in the Camera class.



Thank you!

Cheers,
Mike

------------------
Read this topic online here:
http://forum.openscenegraph.org/viewtopic.php?p=56059#56059





_______________________________________________
osg-submissions mailing list
[email protected]
http://lists.openscenegraph.org/listinfo.cgi/osg-submissions-openscenegraph.org

Reply via email to