आपको सबसे बड़ा क्षेत्र कैसा लगता है जिसे आप परिप्रेक्ष्य में बना सकते हैं?
ऊपर से देखा, यह यह होगा:
जोड़ा गया: दाईं ओर के फ्रॉस्ट पर, मैंने चार बिंदुओं को चिह्नित किया है जो मुझे लगता है कि हम कुछ के बारे में जानते हैं। हम फ्रुसम के सभी आठ कोनों को अप्रमाणित कर सकते हैं, और निकट और दूर के केंद्रों को समाप्त कर सकते हैं। इसलिए हम बिंदु 1, 3 और 4 को जानते हैं। हम यह भी जानते हैं कि बिंदु 2 3 से 4 के समान दूरी है। 4 से है। तो फिर हम लाइन 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;
}
मैं मानता हूँ मैं इसे पंख लगा रहा हूँ; मैं 3 आयामों में विस्तार करके 2D कोड को अनुकूलित करने का प्रयास कर रहा हूं । यह इंफ़ेयर की सही गणना नहीं करता है; गोले का केंद्र-बिंदु हर बार कैमरे और ऊपर-बाएँ के बीच की रेखा पर लगता है, और इसका बहुत बड़ा (या बहुत करीब)। क्या मेरे कोड में कोई स्पष्ट गलतियाँ हैं? क्या दृष्टिकोण, यदि तय हो, काम करता है?