Perspektifte çizebileceğiniz en büyük küreyi nasıl buluyorsunuz?
Üstten bakıldığında, bu şöyle olurdu:
Eklendi: sağdaki frustumda, hakkında bir şeyler bildiğimizi düşünüyorum dört nokta işaretledim. Frizumun sekiz köşesinin tamamını ve yakın ve uzak uçların merkezlerini çıkarabiliriz. Bu yüzden nokta 1, 3 ve 4'ü biliyoruz. Ayrıca nokta 2'nin 4'ten 3'e 3 ile aynı mesafe olduğunu biliyoruz. Böylece, 1'den 4'e kadar olan en yakın noktayı, merkez? Ama asıl matematik ve kod benden kaçıyor.
Mümkün olduğunca büyük modeller (yaklaşık olarak küresel ve miniball sınırlayıcı bir küreye sahip olduğum) çizmek istiyorum.
Güncelleme: Bobobobo ve Nathan Reed tarafından önerilen iki düzlemli incircle-on yaklaşımını uygulamaya çalıştım :
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;
}
Kanatlıyorum itiraf ediyorum; 2D kodu 3 boyuta genişleterek uyarlamaya çalışıyorum . İçkileri doğru hesaplamaz; kürenin merkez noktası her seferinde kamera ile sol üst arasındaki çizgi üzerinde ve çok büyük (veya çok yakın) gibi görünüyor. Kodumda bariz hatalar var mı? Yaklaşım düzeltilmişse işe yarar mı?