Comment trouvez-vous la plus grande sphère que vous pouvez dessiner en perspective?
Vu du haut, ce serait ceci:
Ajouté: sur le tronc de droite, j'ai marqué quatre points dont je pense que nous savons quelque chose. Nous pouvons dé-projeter les huit coins du frusum et les centres des extrémités proches et lointaines. Nous connaissons donc les points 1, 3 et 4. Nous savons également que le point 2 est à la même distance de 3 que 4 de 3. Ainsi, nous pouvons calculer le point le plus proche sur la ligne 1 à 4 jusqu'au point 2 afin d'obtenir la centre? Mais les mathématiques et le code réels m'échappent.
Je veux dessiner des modèles (qui sont approximativement sphériques et pour lesquels j'ai une sphère englobante de mini-boule) aussi grands que possible.
Mise à jour: j'ai essayé de mettre en œuvre l'approche incircle sur deux plans comme suggéré par bobobobo et 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;
}
J'avoue que je l'aile; J'essaie d'adapter le code 2D en l'étendant en 3 dimensions. Il ne calcule pas l'inspiration correctement; le point central de la sphère semble être à chaque fois sur la ligne entre la caméra et le coin supérieur gauche, et c'est trop grand (ou trop proche). Y a-t-il des erreurs évidentes dans mon code? L'approche, si elle est fixe, fonctionne-t-elle?