¿Cómo encuentras la esfera más grande que puedes dibujar en perspectiva?
Visto desde arriba, sería esto:
Agregado: en el centro de la derecha, he marcado cuatro puntos, creo que sabemos algo. Podemos desproyectar las ocho esquinas del frusum y los centros de los extremos cercano y lejano. Entonces sabemos los puntos 1, 3 y 4. También sabemos que el punto 2 es la misma distancia de 3 que 4 es de 3. Entonces podemos calcular el punto más cercano en la línea 1 a 4 al punto 2 para obtener el ¿centrar? Pero las matemáticas y el código real se me escapan.
Quiero dibujar modelos (que son aproximadamente esféricos y para los que tengo una esfera delimitadora de miniball) lo más grandes posible.
Actualización: He intentado implementar el enfoque de incircle-on-two-planes como lo sugieren bobobobo y 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;
}
Admito que estoy volando; Estoy tratando de adaptar el código 2D extendiéndolo en 3 dimensiones. No calcula la insfera correctamente; El punto central de la esfera parece estar en la línea entre la cámara y la esquina superior izquierda cada vez, y es demasiado grande (o demasiado cerca). ¿Hay algún error obvio en mi código? ¿El enfoque, si es fijo, funciona?