How can I find the largest sphere that fits inside a frustum? How do you find the largest sphere that you can draw in perspective? Viewed from the top, it'd be this Added on the frustum on the right, I've marked four points I think we know something about. We can unproject all eight corners of the frusum, and the centres of the near and far ends. So we know point 1, 3 and 4. We also know that point 2 is the same distance from 3 as 4 is from 3. So then we can compute the nearest point on the line 1 to 4 to point 2 in order to get the centre? But the actual math and code escapes me. I want to draw models (which are approximately spherical and which I have a miniball bounding sphere for) as large as possible. Update I've tried to implement the incircle on two planes approach as suggested by bobobobo and Nathan Reed function getFrustumsInsphere(viewport,invMvpMatrix) var midX viewport 0 viewport 2 2, midY viewport 1 viewport 3 2, centre unproject(midX,midY,null,null,viewport,invMvpMatrix), incircle function(a,b) var c ray ray closest point 3(a,b) a a 1 far clip plane b b 1 far clip plane c c 1 camera var A vec3 length(vec3 sub(b,c)), B vec3 length(vec3 sub(a,c)), C vec3 length(vec3 sub(a,b)), P 1 (A B C), x ((A a 0 ) (B a 1 ) (C a 2 )) P, y ((A b 0 ) (B b 1 ) (C b 2 )) P, z ((A c 0 ) (B c 1 ) (C c 2 )) P c x,y,z now the centre of the incircle c.push(vec3 length(vec3 sub(centre 1 ,c))) add its radius return c , left unproject(viewport 0 ,midY,null,null,viewport,invMvpMatrix), right unproject(viewport 2 ,midY,null,null,viewport,invMvpMatrix), horiz incircle(left,right), top unproject(midX,viewport 1 ,null,null,viewport,invMvpMatrix), bottom unproject(midX,viewport 3 ,null,null,viewport,invMvpMatrix), vert incircle(top,bottom) return horiz 3 lt vert 3 ? horiz vert I admit I'm winging it I'm trying to adapt 2D code by extending it into 3 dimensions. It doesn't compute the insphere correctly the centre point of the sphere seems to be on the line between the camera and the top left each time, and its too big (or too close). Is there any obvious mistakes in my code? Does the approach, if fixed, work?