Как найти самую большую сферу, которую вы можете нарисовать в перспективе?
Если смотреть сверху, это будет так:
Добавлено: в области справа я выделил четыре точки, о которых, как мне кажется, мы кое-что знаем. Мы можем отменить проекцию всех восьми углов фруза, а также центров ближнего и дальнего концов. Итак, мы знаем точки 1, 3 и 4. Мы также знаем, что точка 2 - это то же расстояние от 3, что и 4 от 3. Итак, мы можем вычислить ближайшую точку на линии 1 - 4 до точки 2, чтобы получить центр? Но настоящая математика и код ускользает от меня.
Я хочу нарисовать модели (которые являются приблизительно сферическими и для которых у меня есть ограничивающая сфера для минибола) как можно большего размера.
Обновление: я попытался реализовать подход в виде круговой плоскости на двух плоскостях, как это предложили Бобобо и Натан Рид :
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 измерения. Это не правильно вычисляет сферу; кажется, что центральная точка сферы находится на линии между камерой и верхним левым краем каждый раз, и она слишком большая (или слишком близко). Есть ли явные ошибки в моем коде? Работает ли подход, если он исправлен?