2011-11-11 12 views
12

मेरे पास एक 3 डी दृश्य है और एक कैमरा gluPerspective का उपयोग करके परिभाषित किया गया है। मेरे पास एक निश्चित एफओवी है, और मुझे कैमरे के लिए किसी भी ज्यामिति की न्यूनतम दूरी पता है (यह एक प्रथम व्यक्ति दृश्य है, इसलिए दृश्य बिंदु से चरित्र की टक्कर मात्रा में न्यूनतम दूरी है)।परिप्रेक्ष्य प्रक्षेपण के लिए मैं विधिवत क्लिप प्लेन दूरी को विधिवत कैसे चुनूं?

मैं सब से अधिक दूर क्लिप विमान (सबसे अच्छा गहराई बफर समाधान के लिए) जो किसी भी कतरन कैसे खिलाड़ी चाल और दिखता का कारण नहीं होगा, कोई फर्क नहीं पड़ता के पास कैसे चुन सकते हैं?

ये दूरी केवल बराबर नहीं हैं क्योंकि निकटतम विमान के कोनों केंद्र की तुलना में मूल से आगे हैं।

उत्तर

12

सूत्र:

nearPlane = nearestApproachToPlayer/sqrt (1 + तन (FOV/2) · (aspectRatio + 1)))

जावास्क्रिप्ट कोड:

var nearPlane = nearestApproachToPlayer 
       /Math.sqrt(1 + Math.pow(Math.tan(fov/180*Math.PI/2), 2) 
            * (Math.pow(aspectRatio, 2) + 1)); 

व्युत्पत्ति:

ज्यामितीय, पिरामिड जिसका आधार के पास क्लिप विमान है और टिप मूल है पर विचार करें। पासप्लेन पिरामिड की ऊंचाई हो, और डब्ल्यू और एच पिरामिड के आधार की चौड़ाई और ऊंचाई हो।

ढलान = तन (FOV:

डब्ल्यू = aspectRatio · h

FOV पिरामिड की ऊंचाई अक्ष पक्षों की ढलान निर्धारित करता है/2)

ज/nearPlane = 2 तन (FOV/2)

/2 = nearPlane तन (FOV/2)

किसी भी कोने निकट क्लिप विमान का बिंदु क्लिप प्लेन के केंद्र से ऑफसेट है (डब्ल्यू/2, एच/2), तो दूरी है sqrt ((डब्ल्यू/2) + (/2))। इस कोने बिंदु के मूल से दूरी, सही त्रिकोण nearPlane और पूर्व दूरी द्वारा गठित की कर्ण है तो sqrt ((डब्ल्यू/2) है + (/2) + पासप्लेन)।

हम चाहते हैं कि कोने बिंदु से दूरी किसी भी ज्यामिति के निकटतम दृष्टिकोण के बराबर हो।

nearestApproachToPlayer = sqrt ((डब्ल्यू/2) + (/2) + nearPlane)

सीधा बीजगणित लागू करना ऊपर दिए गए सूत्र का उत्पादन करता है।

मैंने अपने बीजगणित की जांच नहीं की है, लेकिन मैंने अनुभव से परीक्षण किया है: यदि मैं 1.1 के पास निकटतम गुणा करता हूं, तो यह एक क्लिप प्लेन उत्पन्न करता है जो विभिन्न पहलू अनुपात के लिए थोड़ा सा दूर है। मैंने 60 डिग्री सेल्सियस से अलग एफओवी की कोशिश नहीं की है।

+0

मैंने इसे चेक किया है, समझ में आता है। –

+0

एक 3 डी प्रतिपादन कार्यक्रम में आपके द्वारा उठाए गए पैरामीटर में से एक दृश्य वेक्टर है, यानी कैमरे की दिशा निर्देश। मान लें कि आपके पास यह वेक्टर सामान्यीकृत है (यानी इकाई लंबाई), फिर ऑब्जेक्ट की स्थिति के साथ स्केलर (= डॉट) उत्पाद लेना आपको उत्पत्ति के लिए प्लानर दूरी प्रदान करता है। यह एक अधिक प्रत्यक्ष दृष्टिकोण है, क्योंकि यह आपको वर्गों, वर्ग रूट और विभाजन की आवश्यकता के बिना सीधे वांछित मूल्य देता है। यह केवल गुणात्मक है, यानी एमएडी निर्देश, जो सिमड निर्देश सेट द्वारा सीधे समर्थित हैं। – datenwolf

+0

@ डेटनवॉल्फ मैं नहीं देखता कि इस समस्या को हल करने के लिए इसका उपयोग कैसे करें। मेरे पास विशिष्ट वस्तुओं का संग्रह नहीं है; मेरे पास न्यूनतम दूरी है, और मैं गतिशील रूप से एक बार * प्रक्षेपण * की गणना करने की कोशिश कर रहा हूं। या आप कह सकते हैं कि मेरे पास न्यूनतम दूरी पर व्यूपोर्ट के ऊपरी-बाएं कोने के माध्यम से लाइन पर एक काल्पनिक वस्तु है। क्या आप उस ऑब्जेक्ट की स्थिति की गणना कर सकते हैं, ताकि आप जिस प्रक्रिया का वर्णन कर सकें, केवल गुणा/जोड़कर? –

5

मैं सब से अधिक दूर के पास क्लिप विमान (सबसे अच्छा गहराई बफर समाधान के लिए) जो किसी भी कतरन कैसे खिलाड़ी चाल और दिखता का कारण नहीं होगा, कोई फर्क नहीं पड़ता कैसे चुन सकते हैं?

सरल: turn off near clipping. मुझे विश्वास नहीं है कि लोगों ने अभी तक इसके बारे में नहीं सुना है। आप गहराई से क्लैंपिंग सक्षम करते हैं, जो निकट (और दूर) मानों का कारण बनता है जो क्लैंप किए जाने के बजाय निकट (या दूर से अधिक) से कम होते हैं।

यह उन वस्तुओं को नहीं रोकेगा जो वास्तव में कैमरे के पीछे क्लिप होने से पीछे जाते हैं। और चूंकि गहराई को दबाया जाता है, इसलिए आप उन क्षेत्रों के लिए गहराई बफर की उपयोगिता खो देते हैं जहां क्लैंपिंग होती है। उचित रूप से इसका उपयोग करना अभी भी एक अच्छा विचार है, यदि आप एक करीबी क्लिप नहीं चुन सकते हैं जो अन्यथा बहुत दूर है।

क्लैंपिंग को सक्षम करने के लिए आम तौर पर बेहतर होता है और क्लिप के पास पूर्ण न्यूनतम क्लिप चुनने के बजाय निकट क्लिप को धक्का देना बेहतर होता है।

+0

मुझे लगता है कि आप गलत समझते हैं। मैं एक चरित्र मॉडल प्रस्तुत नहीं कर रहा हूँ। चरित्र की टकराव की मात्रा केवल एक ऐसा क्षेत्र है जिसमें कुछ भी प्रवेश नहीं कर सकता है, इसलिए वहां पर जाने के लिए कुछ भी नहीं माना जाता है। मुझे गहराई से क्लैंपिंग चाल के बारे में पता नहीं था (हालांकि मैं इसे सीधे लागू करूँगा क्योंकि मैं जीएल ईएस का उपयोग कर रहा हूं); उसके लिए धन्यवाद। मैं अतिरिक्त सीमा प्राप्त करने के लिए इसका उपयोग नहीं कर सकता क्योंकि यह काफी संभव है कि कैमरे के पास ऑब्जेक्ट्स ज्यामिति को छेड़छाड़ कर रहे हैं, लेकिन वास्तव में पूछे गए प्रश्न में यह एक अच्छा योगदान है। –

+1

@ केविन रेड: दरअसल, जब तक इसके लिए ओईएस एक्सटेंशन नहीं है, तो आप वास्तव में गहराई से क्लैंपिंग का उपयोग नहीं कर सकते हैं।मैन्युअल रूप से इसे लागू करने का कोई तरीका नहीं है। ओह, बीटीडब्ल्यू, अगर आप ओपनजीएल ईएस का उपयोग कर रहे हैं, तो आमतौर पर टैग में रखना अच्छा विचार है। ओपनजीएल और जीएल ईएस सभी के बाद समान नहीं हैं। –

+0

... सही। मैं सोच रहा था कि मैं इसे टुकड़े टुकड़े में कर सकता हूं, जो कि मैं बहुत देर से नहीं कर सकता, और कशेरुक शेडर में इसे करने से दृश्य विरूपण पैदा होगा। –

7

निकट और दूर क्लिप दूरी चुनने का सबसे अच्छा अभ्यास उन्हें दृश्य में लिफाफा करना है, यानी निकटतम क्लिप प्लेन जितना संभव हो सके और दूर क्लिप विमान जितना संभव हो सके।

एक परिप्रेक्ष्य परिवर्तन के लिए 3 डी अनुप्रयोगों के बहुमत द्वारा नियोजित मानक फ्रस्टम प्रक्षेपण एक समांतर विमान प्रक्षेपण है। इसका मतलब है कि दृष्टिकोण के बिंदु से प्लानर दूरी का निर्धारण करना। यह वास्तव में आसान है:

एक 3 डी प्रतिपादन कार्यक्रम में आप जो पैरामीटर लेते हैं उनमें से एक दृश्य वेक्टर है, यानी कैमरे की दिशा निर्देश। मान लें कि आपके पास यह वेक्टर सामान्यीकृत है (यानी इकाई लंबाई), फिर ऑब्जेक्ट की स्थिति के साथ स्केलर (= डॉट) उत्पाद लेना आपको उत्पत्ति के लिए प्लानर दूरी प्रदान करता है। यह एक अधिक प्रत्यक्ष दृष्टिकोण है, क्योंकि यह आपको वर्गों, वर्ग रूट और विभाजन की आवश्यकता के बिना सीधे वांछित मूल्य देता है। यह केवल गुणात्मक है, यानी एमएडी निर्देश, जो सिमड निर्देश सेट द्वारा सीधे समर्थित हैं।

संबंधित मुद्दे