I remember we set up our own get ground height functions based on our own array of data. It's not 100% accurate, but if you're going to do your landscape/ground this way, it's hard for you to get it 100% accurate without serious speed loss.
The method we used was this. Say your object is about 1000x1000 in size (x,z). You move systematically along the object, firing an object down onto the object using polygon collision, and when it colides, you store the object height.
eg:
'object 1 is terrain object
for x=0 to 100
for z=0 to 100
height = 1000
repeat
position object 2,x*10,height,z*10
dec height,1
until object collision(2,1) = 1
heightmap(x,z) = height
next z
next y
Basically, this moves 10x10 across your object, firing an object onto its surface, recording the height and saving this information to an array. Using this array height map you can make a function to return the height of the object at any x,z value.
A fairly decent method would be to take the four array height points around the x,z of where you want to check the height. And simply work out the ratio of displacement in the y from the points and derive a value for x,z.
The closer the measurements in your initial array, the more accurage your bump map is. If for a 1000x1000 object you stored a floating point height for every 1 unit of space, you're probably looking at a 4MB heightmap array which isn't too huge by todays memory standards and would be damn accuate. Seeing as the initial height checking is done when the program is first run (or stored in a file), the only speed limitations you're looking at is your formula to check ground height and 4MB array access times. Still a hundred times faster than polygon collision.
You final problem is that polygon collision doesnt work properly, as agreed to by Lee, so you'd have to test it very carefully.
Machine: P4 2200, 512MB, GeForce4 64MB, Audigy Platinum
There's a junglist inside every coder. http://www.kontact-kru.com for my own personal breakbeat terrorism.