원근법으로 그릴 수있는 가장 큰 구를 어떻게 찾습니까?
위에서 본다면 다음과 같습니다.
추가 : 오른쪽의 절두체에, 나는 우리가 뭔가를 알고 있다고 생각하는 4 가지 점을 표시했습니다. frusum의 8 개 구석과 니어 엔드와 파 엔드의 중앙을 모두 투사 할 수 있습니다. 우리는 또한 점 1, 3 및 4를 알고 있습니다. 또한 점 2는 3과 4와 3의 거리가 동일하다는 것을 알고 있습니다. 센터? 그러나 실제 수학과 코드는 나를 피합니다.
가능한 한 큰 모델 (대략 구형이며 미니 볼 경계 영역이있는 미니 볼 경계 영역이 있음)을 그려보고 싶습니다.
업데이트 : bobobobo와 Nathan Reed가 제안한대로 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 차원으로 확장 하여 적응하려고 합니다. Insphere를 올바르게 계산하지 않습니다. 구의 중심점은 매번 카메라와 왼쪽 상단 사이의 선에 있고 너무 크거나 너무 가까운 것 같습니다. 내 코드에 명백한 실수가 있습니까? 수정 된 경우 접근 방식이 작동합니까?