Bagaimana Anda menemukan bola terbesar yang bisa Anda gambar dalam perspektif?
Dilihat dari atas, akan seperti ini:
Ditambahkan: pada frustum di sebelah kanan, saya telah menandai empat poin saya pikir kita tahu sesuatu tentang. Kita dapat memproyeksikan kedelapan sudut frusum, dan pusat-pusat ujung dekat dan jauh. Jadi kita tahu titik 1, 3 dan 4. Kita juga tahu bahwa titik 2 adalah jarak yang sama dari 3 seperti 4 dari 3. Jadi kita dapat menghitung titik terdekat pada baris 1 ke 4 ke titik 2 untuk mendapatkan pusat? Tetapi matematika dan kode yang sebenarnya luput dari saya.
Saya ingin menggambar model (yang kira-kira berbentuk bola dan yang saya miliki untuk bola miniball yang mengikat) sebesar mungkin.
Pembaruan: Saya sudah mencoba menerapkan pendekatan incircle-on-two-pesawat seperti yang disarankan oleh bobobobo dan 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;
}
Aku akui aku menikmatinya; Saya mencoba mengadaptasi kode 2D dengan memperluasnya menjadi 3 dimensi. Itu tidak menghitung insphere dengan benar; titik tengah bola tampaknya berada di garis antara kamera dan kiri atas setiap kali, dan terlalu besar (atau terlalu dekat). Apakah ada kesalahan nyata dalam kode saya? Apakah pendekatannya, jika diperbaiki, berhasil?