Làm thế nào để bạn tìm thấy quả cầu lớn nhất mà bạn có thể vẽ trong phối cảnh?
Nhìn từ trên xuống, nó sẽ là thế này:
Đã thêm: ở phía bên phải, tôi đã đánh dấu bốn điểm Tôi nghĩ chúng ta biết điều gì đó. Chúng ta có thể hủy bỏ tất cả tám góc của Frusum và các trung tâm của gần và xa kết thúc. Vì vậy, chúng ta biết điểm 1, 3 và 4. Chúng ta cũng biết rằng điểm 2 có cùng khoảng cách từ 3 với 4 là từ 3. Vì vậy, chúng ta có thể tính điểm gần nhất trên dòng 1 đến 4 đến điểm 2 để có được trung tâm? Nhưng toán học và mã thực tế thoát khỏi tôi.
Tôi muốn vẽ các mô hình (có dạng hình cầu và tôi có một hình cầu giới hạn nhỏ) cho càng lớn càng tốt.
Cập nhật: Tôi đã cố gắng thực hiện phương pháp tiếp cận hai mặt phẳng theo đề xuất của bobobobo và 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;
}
Tôi thừa nhận tôi đang bay nó; Tôi đang cố gắng điều chỉnh mã 2D bằng cách mở rộng nó thành 3 chiều. Nó không tính toán chính xác; điểm trung tâm của hình cầu dường như nằm trên đường thẳng giữa máy ảnh và góc trên bên trái mỗi lần và nó quá lớn (hoặc quá gần). Có bất kỳ sai lầm rõ ràng trong mã của tôi? Liệu cách tiếp cận, nếu cố định, làm việc?