您如何找到可以透视的最大球体?
从顶部看,是这样的:
补充:在右边的视锥台上,我已经指出了四点,我认为我们对此有所了解。我们可以投影出截头圆锥体的所有八个角以及近端和远端的中心。因此我们知道点1、3和4。我们也知道点2与3之间的距离与4与点3之间的距离相同。因此,我们可以计算线1到4到点2的最近点,以获得中央?但是实际的数学和代码使我无所适从。
我想绘制尽可能大的模型(大约是球形的,我有一个微型球的边界球)。
更新:我已经尝试按照 bobobobo和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]<vert[3]? horiz: vert;
}
我承认我在飞翔。我正在尝试通过将二维代码扩展到3维来适应它。它无法正确计算非球面度;球的中心点似乎每次都在相机和左上角之间的线上,并且太大(或太靠近)。我的代码中是否有任何明显的错误?该方法(如果固定)是否有效?