Як ви знаєте найбільшу сферу, яку ви можете намалювати в перспективі?
Якщо зверху подивитися, це було б так:
Додано: на фрустумі справа, я позначив чотири точки, я думаю, що ми щось знаємо. Ми можемо спроектувати всі вісім куточків плоду, а центри ближнього та далекого кінців. Отже, ми знаємо точки 1, 3 і 4. Ми також знаємо, що точка 2 - це та ж відстань від 3, як 4 - від 3. Тож ми можемо обчислити найближчу точку на прямій 1 до 4 до точки 2, щоб отримати центр? Але власне математика та код уникають мене.
Я хочу намалювати моделі (приблизно сферичні і для яких у мене сфера обмеження для міні-футболу) якомога більше.
Оновлення: Я намагався реалізувати підхід " кругообіг на двох площинах", як запропонували bobobobo та 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;
}
Я визнаю, що я крила; Я намагаюся адаптувати 2D-код , розширивши його на 3 виміри. Він не обчислює сферу правильно; центральна точка сфери, здається, щоразу знаходиться на лінії між камерою та лівою верхньою частиною, і її занадто велика (або занадто близька). Чи є явні помилки в моєму коді? Чи працює підхід, якщо він фіксований, працює?