Hi, Preet,

Robert is probably offline now, so I'll attempt to pick up where he left off...


On 02/14/2012 12:47 PM, Preet wrote:
I didn't understand what was meant by local origin here. Let's say I
have a model of the Sphinx I want to show on the surface of the Earth
(coincidentally I'm trying to display geospatial data).

Are you suggesting that I draw the model with coordinates relative to
the origin of of the scene first ('local'), then parent the
corresponding geode with a matrix transform that scales/moves/rotates
it out to the correct position on the Earth's surface ('world
coordinates')?

Exactly. This would allow the vertex coordinates (which are represented with 32 bit floats) to work with enough precision to prevent the instability you're seeing.


I found a few references online to a somewhat similar solution that
suggested transforming the entire scene so it's centered at the origin
before passing it to OpenGL. Is this a worse or better approach than
the suggested fix?

I'm not sure I follow this question.  Centered at what origin?


I understand that numerical precision decreases when rendering a scene
further from the origin, because there are a finite set of numbers you
can represent in floating point. Using doubles for the transform and
carrying doubles throughout the scene graph traversals increases
precision right up until the data is passed to OpenGL. I didn't quite
follow your explanation about the camera and geometry translations
cancelling out though... could you expand on this a bit?

Both the camera's View matrix and the transforms in the scene (which will be accumulated by OSG into a Model matrix) are represented with doubles by default. This gives them plenty of precision to represent large values.

Now, say you move the camera close to your sphinx model. This will cause the Camera's View matrix to have a translation value that is close to the inverse of the sphinx's accumulated Model matrix.

When the scene is traversed for rendering, the Model and View matrices are combined into the OpenGL ModelView matrix, which must now be represented as floats. However, the large (but opposite) translation values will combine to a ModelView translation that is relatively small before the matrix is sent to OpenGL. This means that the transformed vertex coordinates will also be relatively small, and they'll still have plenty of precision to work with when they're sent down the OpenGL pipeline for rasterization.

--"J"
_______________________________________________
osg-users mailing list
osg-users@lists.openscenegraph.org
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org

Reply via email to