Sphere-Plane collision test
I'm not sure what kind of error your getting but here is a very simple collision test:

#include &lt;cmath&gt;
#include &lt;iostream&gt;

class float3 {
        public:
                float x,y,z;
};

class float4 {
        public:
                float a,b,c,d;
                float norm() const{
                        return sqrt(a*a+b*b+c*c);
                }
};

typedef float4 plane;

class sphere {
        public:
                float3 position;
                float radius;
};

float project( const float3 &amp; spherePos, const plane &amp; p){
        return std::abs( spherePos.x*p.a + spherePos.y*p.b + spherePos.z*p.c + p.d );
}

bool const collision( const sphere &amp; s, const plane &amp; p){
        return project(s.position,p)/p.norm() &lt; s.radius;
}

int main( int argc, char * argv[]){

        plane p = {0.0,-1.0,0.0, 2.0 };
        sphere s = { {0.0,1.5,0.0}, 1.0 };

        if ( collision(s,p) )
                std::cout &lt;&lt; "Collision detected" &lt;&lt; std::endl;

}


The advantage here is that you don't need a normalized plane. The line that bothers me is this:

return abs&lt;float&gt;(dot(p.normal, s_origin) - p_distance) &lt; s.radius;


Just write your solution such that it can handle un-normalized planes. If you're working with normalized planes (which may be what is contained in "p.normal"?) I believe you need :

return abs&lt;float&gt;(dot(p.normal, s_origin) + p_distance) &lt; s.radius;


See the wolfram page on this topic - it is straight forward. It is not clear how you have implemented BoundingPlane - but if you are getting errors, that would be the first place to look.