private void GetFireParameters(out Vec3 pos, out Quat rot, out float speed) { Camera camera = RendererWorld.Instance.DefaultCamera; pos = catapult.Position + new Vec3(0, 0, .7f); Radian verticalAngle = new Degree(30).InRadians(); rot = Quat.Identity; speed = 0; if (catapultFiring) { Ray startRay = camera.GetCameraToViewportRay(catapultFiringMouseStartPosition); Ray ray = camera.GetCameraToViewportRay(MousePosition); Plane plane = Plane.FromPointAndNormal(pos, Vec3.ZAxis); Vec3 startRayPos; if (!plane.RayIntersection(startRay, out startRayPos)) { //must never happen } Vec3 rayPos; if (!plane.RayIntersection(ray, out rayPos)) { //must never happen } Vec2 diff = rayPos.ToVec2() - startRayPos.ToVec2(); Radian horizonalAngle = MathFunctions.ATan(diff.Y, diff.X) + MathFunctions.PI; SphereDir dir = new SphereDir(horizonalAngle, verticalAngle); rot = Quat.FromDirectionZAxisUp(dir.GetVector()); float distance = diff.Length(); //3 meters clamp MathFunctions.Clamp(ref distance, .001f, 3); speed = distance * 10; } }
//MapObject GetObjectOverCursor() //{ // Camera camera = RendererWorld.Instance.DefaultCamera; // Ray ray = camera.GetCameraToViewportRay( MousePosition ); // MapObject mapObject = null; // Map.Instance.GetObjects( ray, delegate( MapObject obj, float scale ) // { // //skip StaticMesh'es // if( obj is StaticMesh ) // return true; // mapObject = obj; // return false; // } ); // return mapObject; //} private bool IsCursorOverCatapult() { if (catapult != null) { Camera camera = RendererWorld.Instance.DefaultCamera; Ray ray = camera.GetCameraToViewportRay(MousePosition); if (catapult.MapBounds.RayIntersection(ray)) { return(true); } } return(false); }