A normal (or atleast I think this is what it is) is pretty much the same as a polygon or face of an object. Each polygon is made up of 3 verts, forming a triangle. Sparky's dll allows you to obtain the world xyz angle of every normal on the object, that's why sliding collision is so easy with this dll, when you detect an intersection with say your map model directly infront of your character model, you find the bounce angles (based on the angles of the normal and intersection check's angle, obtained from the bounce commands), and this angle is the angle the user needs to rotate to to slide off of the normal. Now, with v2 Sparky's put this into nifty sliding collision commands, so the work is reduced even more.
Basically, the x angle of an object in the 3D world is it's up/down angle. The same would go for a normal, getting the x angle of the normal intersected with would allow you to determine the steepness. If the normal's x angle is greater than say... 45 degrees, allow gravity to take place, other wise dont.
Another work-around (probably simpler) is to get the distance to the intersection (returned from intersectObject). Then, only reposition the user if this distance is greater than x amount of units. That way, if the intersection distance is in the decimals (as it would be when the vibrating effect occurs), stop using gravity. Otherwise, use gravity.
Pseudo Code for first example;
Store User XYZ positions
Move user
Store User New XYZ positions
Check intersection between old/new positions
If intersection occurs, get x angle of normal
If x angle > 45, gravity = 1
Else, gravity = 0
Gravity code
If gravity = 1 then do gravity else dont do gravity
Repeat
While Im at it (I know this isnt anything big), I threw together this function for one of Gil Gavanti's projects for sliding collision, pretty simple but might be useful to some;
FUNCTION SlidingCollision(Object,X1#,Y1#,Z1#,X2#,Y2#,Z2#,Radius#)
Collision = sc_SphereSlideGroup(Object,X1#,Y1#,Z1#,X2#,Y2#,Z2#,Radius#,0)
IF Collision > 0
cx# = sc_getCollisionSlideX()
cy# = sc_getCollisionSlideY()
cz# = sc_getCollisionSlideZ()
POSITION OBJECT Object, cx#, cy#, cz#
ENDIF
ENDFUNCTION
Hope that helps a bit (not much time to throw together a working example of the normal stuff right now).

Projects: Online CTF Game | Newcommer's Guide to FPS's