Тут все довольно просто. Идеальное отражение рассчитывается так:
template<int n,class T>
inline VECTOR<n,T> reflect(const VECTOR<n,T>& dir, const VECTOR<n,T>& normal)
{
VECTOR<n,T> temp = normal * dot(dir,normal) * (-2);
VECTOR<n,T> rVec = temp + dir;
rVec.Normalize();
return rVec;
}
Математика тут http://users.skynet.be/bdegreve/writings/reflection_transmission.pdf.
Примерно так это должно выглядеть:

|