Hi everyone,
I'm currently adapting a planar quadtree terrain system to handle spherical terrain (i.e. I want to render planets as opposed to just an endless terrain stretching in the X-Z plane).
A the moment, I use this algorithm to calculate the normal for a given point on the terrain from the height information (the heights are generated using simplex noise):
public Vector3 GetNormalFromFiniteOffset(float x, float z, float sampleOffset)
{
float hL = GetHeight(x - sampleOffset, z);
float hR = GetHeight(x + sampleOffset, z);
float hD = GetHeight(x, z - sampleOffset);
float hU = GetHeight(x, z + sampleOffset);
Vector3 normal = new Vector3(hL - hR, 2, hD - hU);
normal.Normalize();
return normal;
}
The above works fine for my planar quadtree, but of course it won't work for spherical terrain because it assumes the Y direction is always up. I guess I need to move the calculation into the plane which lies at a tangent on the sphere for the point I'm evaluating. I was wondering if anyone knows of a good or proven way to transform this calculation for any point on a sphere, or if there's a better way to calculate the normal for a point on a sphere which has been radially displaced using a noise-based height field?
I'm using XNA by the way. Thanks very much for looking!
↧