protected override Vector3d CalculateDesiredVelocity() { Vector3d nrml = environment.ClosestNormal(particle.Position3D); Vector3d drainVec = Vector3d.CrossProduct(nrml, Vector3d.ZAxis); drainVec.Unitize(); drainVec.Transform(Transform.Rotation(Math.PI * angle, nrml, particle.Position3D)); drainVec = drainVec * stepDistance; if (environment.GetType() == typeof(SurfaceEnvironmentType)) { Point3d pt2D = particle.Position3D; pt2D.Transform(Transform.Translation(drainVec)); pt2D = environment.MapTo2D(pt2D); drainVec = Util.Vector.Vector2Point(particle.Position, pt2D); } return(drainVec); }