public Vec3 WorldFromTrack2D(Vec3 p) { Scene scene = SharedWorld.MainScene; Camera cam = scene.Camera; Box3 vvol = cam.ViewVol; float camdist = cam.Translation.Length; float zdist = camdist - ZOffset; Vec3 w = new Vec3(); Vec3 v = new Vec3(); Matrix mtx = new Matrix(); float tmp = 0.5f * vvol.Height / vvol.min.z; v.x = p.x * tmp * zdist; v.y = p.y * tmp * zdist; v.z = -zdist; cam.TotalTransform(mtx); mtx.Transform(v, w); SharedWorld.Trace(System.String.Format(Name + " Track({0}, {1}, {2}) -> World({3}, {4}, {5})\n", p.x, p.y, p.z, w.x, w.y, w.z)); return(w); }
public Vec3 WorldFromScreen(Vec3 pos) { Scene scene = SharedWorld.MainScene; Camera cam = scene.Camera; Box3 vv = cam.ViewVol; Vec3 p = Normalize(pos); Matrix mtx = cam.GetViewTrans(); Vec3 w = new Vec3(vv.min.x + p.x * vv.Width, vv.max.y - p.y * vv.Height, vv.min.z - p.z * vv.Depth + ZOffset); float tmp = -0.5f * w.z / cam.Hither; tmp = -w.z / cam.Hither; w.x *= tmp; w.y *= tmp; cam.TotalTransform(mtx); mtx.Transform(w, w); SharedWorld.Trace(System.String.Format(Name + " Screen({0}, {1}, {2}) -> World({3}, {4}, {5})\n", pos.x, pos.y, pos.z, w.x, w.y, w.z)); return(w); }