Wie finden Sie die größte Kugel, die Sie perspektivisch zeichnen können?
Von oben gesehen wäre das:
Hinzugefügt: Auf dem Kegelstumpf rechts habe ich vier Punkte markiert, von denen ich glaube, dass wir etwas wissen. Wir können alle acht Ecken des Frusums und die Zentren des nahen und des fernen Endes entfernen. Wir kennen also Punkt 1, 3 und 4. Wir wissen auch, dass Punkt 2 dieselbe Entfernung von 3 wie 4 von 3 hat. Dann können wir den nächsten Punkt auf der Linie 1 bis 4 zu Punkt 2 berechnen, um die zu erhalten Center? Aber die eigentliche Mathematik und der eigentliche Code entgehen mir.
Ich möchte möglichst große Modelle zeichnen (die ungefähr kugelförmig sind und für die ich eine Miniball-Begrenzungskugel habe).
Update: Ich habe versucht, den von Bobobobo und Nathan Reed vorgeschlagenen Incircle -on-Two-Planes-Ansatz zu implementieren :
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;
}
Ich gebe zu, dass ich es fliege; Ich versuche, 2D-Code anzupassen , indem ich ihn auf drei Dimensionen ausdehne. Die insphere wird nicht korrekt berechnet. Der Mittelpunkt der Kugel scheint jedes Mal auf der Linie zwischen der Kamera und der linken oberen Ecke zu liegen und zu groß (oder zu nah) zu sein. Gibt es offensichtliche Fehler in meinem Code? Funktioniert der Ansatz, wenn er fixiert ist?