คุณจะพบทรงกลมที่ใหญ่ที่สุดที่คุณสามารถวาดในมุมมองได้อย่างไร
ดูจากด้านบนมันเป็นเช่นนี้:
ที่เพิ่มเข้ามา: บน frustum ด้านขวาฉันได้ทำเครื่องหมายสี่จุดที่ฉันคิดว่าเรารู้อะไรเกี่ยวกับ เราสามารถปลดโปรเจ็กต์ทั้งแปดมุมของ frusum และศูนย์กลางของใกล้และไกลสุด เรารู้จุดที่ 1, 3 และ 4 เราก็รู้ว่าจุดที่ 2 คือระยะห่างเดียวกันจาก 3 เท่ากับ 4 จาก 3 ดังนั้นเราสามารถคำนวณจุดที่ใกล้ที่สุดในบรรทัดที่ 1 ถึง 4 ถึงจุดที่ 2 เพื่อให้ได้ ศูนย์? แต่คณิตศาสตร์และรหัสที่แท้จริงช่วยฉันได้
ฉันต้องการวาดแบบจำลอง (ซึ่งเป็นทรงกลมโดยประมาณและที่ฉันมีทรงกลมมินิบัสที่ล้อมรอบ) มีขนาดใหญ่ที่สุดเท่าที่จะเป็นไปได้
อัปเดต: ฉันได้พยายามใช้แนวทาง incircle-on-two- planeตามที่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 มิติ มันไม่ได้คำนวณ insphere อย่างถูกต้อง ดูเหมือนว่าจุดศูนย์กลางของทรงกลมจะอยู่ในแนวระหว่างกล้องกับมุมบนซ้ายในแต่ละครั้งและมีขนาดใหญ่เกินไป (หรือใกล้เกินไป) มีรหัสข้อผิดพลาดที่ชัดเจนหรือไม่? วิธีการทำงานถ้าแก้ไขแล้วทำงานได้หรือไม่