2010-07-15 14 views
6

से हमेशा कम है इसलिए मैं अपनी सभी कस्टम 3 डी रूपांतरण पाइपलाइन लिख रहा हूं ताकि यह सब कुछ कैसे काम करता है, इसकी बेहतर समझ प्राप्त हो सके। मैं स्क्रीन पर सब कुछ ठीक से प्रस्तुत कर सकता हूं और अब मैं वापस जाने और क्लिपिंग को देखने के बारे में हूं।परिप्रेक्ष्य विभाजन के बाद जेड वैल्यू -1

मेरी समझ से, मुझे एक चरम बिंदु को क्लिप करना चाहिए यदि परिप्रेक्ष्य विभाजन के बाद x या y मान [-1, 1] की सीमा से बाहर है और मेरे मामले में यदि z मान सीमाओं के बाहर है [ 0, 1]।

जब मैं इसे लागू करता हूं, तो मेरा z मान हमेशा -1.xxxxxxxxxxx है जहां xxxxxxx बहुत छोटी संख्या है।

यह थोड़ा लंबा है, और मैं क्षमा चाहता हूं, लेकिन मैं यह सुनिश्चित करना चाहता था कि मैंने जो सारी जानकारी दी थी, मैंने उसे दिया।

पहले सम्मेलनों:

मैं एक बाएं हाथ के प्रणाली जहां एक मैट्रिक्स इस तरह दिखता उपयोग कर रहा हूँ:

[m00, m01, m02, m03] 
[m10, m11, m12, m13] 
[m20, m21, m22, m23] 
[m30, m31, m32, m33] 

और मेरे वैक्टर कॉलम इस तरह देख रहे हैं:

[x] 
[y] 
[z] 
[w] 

मेरा कैमरा इसके साथ स्थापित है:

पीआई/4 के रेडियंस में एक लंबवत एफओवी।

का एक पहलू राशन 1. (वर्ग दृश्य पोर्ट)

की 1.

एक के पास क्लिप मूल्य 1000.

0.

की प्रारंभिक दुनिया एक्स स्थिति का एक दूर क्लिप मूल्य

0 की शुरुआती दुनिया वाई स्थिति 0.

-500 की प्रारंभिक दुनिया z स्थिति।

चरण 1:: गुणा कैमरा मैट्रिक्स द्वारा शीर्ष

कैमरे की स्थिति Z अक्ष नीचे लग रही है (0, 0, 1)

एक शीर्ष, इस तरह काम करता है पाइपलाइन को देखते हुए ।

चरण 2: प्रक्षेपण मैट्रिक्स द्वारा वर्टेक्स को गुणा करें।

प्रोजेक्शन मैट्रिक्स है:

[2.41421, 0,  0,   0] 
[0  2.41421, 0,   0] 
[0,  0,  1.001001, 1] 
[0,  0,  -1.001001, 0] 

चरण 3: गुणा एक्स, 1/डब्ल्यू द्वारा y और z घटकों।

चरण 4: [यह वह जगह है जहां समस्या है] बाहरी सीमाओं के बाहर कशेरुक को क्लिप करें।

चरण 5: स्क्रीन निर्देशांक में कनवर्ट करें।

एक उदाहरण शिखर मेरे पास है

(-100, -100, 0, 1) 

है कैमरा मैट्रिक्स से गुणा करने के बाद मैं मिलता है:

(-100, -100, 500, 1) 

कौन समझ में आता है क्योंकि कैमरा के सापेक्ष, कि शीर्ष करने के लिए 100 यूनिट है बाएं और नीचे और 500 इकाइयां आगे। यह 1 के पास क्लिप और 1000 डब्ल्यू के दूर क्लिप के बीच भी है अभी भी 1.

है प्रक्षेपण मैट्रिक्स से गुणा करने के बाद मैं मिलता है:

(-241.42135, -241.42135, 601.600600, -600.600600) 

यह मैं अगर यह बनाता है यकीन नहीं है समझ। x और y सही होने लगते हैं, लेकिन मैं जेड के बारे में और w के बाद से परिप्रेक्ष्य विभाजन का अगला कदम अजीब है iffy हूँ।

परिप्रेक्ष्य विभाजन के बाद मुझे मिलती है:

(0.401966, 0.401966, -1.001665, 1) 

फिर x और y मतलब, वे की सीमा के भीतर दोनों हैं [-1, 1]। लेकिन ज़ेड वैल्यू सीमाओं के बाहर स्पष्ट रूप से स्पष्ट है, भले ही मुझे विश्वास है कि यह अभी भी निराशा के भीतर होना चाहिए। डब्ल्यू 1 पर वापस आ गया है जो फिर से समझ में आता है।

फिर उपन्यास के लिए क्षमा करें, लेकिन मैं आशा करती हूं किसी की मदद कर सकते हैं मुझे यह पता लगाने की मैं गलत तरीके से क्या कर रही हूं।

धन्यवाद!

उत्तर

3

ठीक है की जेड निर्देशांक, ऐसा लगता है कि मैं पता लगा कि समस्या क्या यह किया गया था।

मेरे प्रक्षेपण मैट्रिक्स था:

[2.41421, 0,  0,   0] 
[0  2.41421, 0,   0] 
[0,  0,  1.001001, 1] 
[0,  0,  -1.001001, 0] 

लेकिन यह वास्तव में स्थानांतरित कर और हो जाना चाहिए:

[2.41421, 0,  0,   0] 
[0  2.41421, 0,   0] 
[0,  0,  1.001001, -1.001001] 
[0,  0,  1,   0] 

इस मैट्रिक्स का उपयोग कर, मेरी x और y मान एक ही रहने की उम्मीद के रूप में और अब मेरी जेड मानों को [0, 1] के भीतर बाध्य किया जाता है और केवल उस सीमा से अधिक है यदि वे दूर क्लिप प्लेन के नजदीक हैं।

अब एकमात्र मुद्दा यह है कि मैं काफी उलझन में हूं कि मैं सही या बाएं हाथ प्रणाली का उपयोग कर रहा हूं या नहीं।

सभी मुझे पता है कि अब यह काम करता है ...

+0

अच्छा सामान। मुझे यह सुनकर खुशी हो रही है कि आपको यह पता चला है कि ':)' –

+0

आपकी मदद के लिए धन्यवाद, मैं निश्चित रूप से इसकी सराहना करता हूं। – Jon

2

मैं यहाँ मेरी लीग से बाहर हो सकता है, लेकिन मैंने सोचा कि प्रक्षेपण मैट्रिक्स और परिप्रेक्ष्य विभाजन के उद्देश्य के लिए स्क्रीन पर कि बिंदु के 2 डी स्थिति को खोजने के लिए थे। उस मामले में, बाएं से अधिक z मूल्य जरूरी किसी भी अर्थ किसी भी अधिक है, क्योंकि गणित सब उन दो x और y मान खोजने की दिशा में सक्षम है नहीं होगा।

अद्यतन: मुझे लगता है कि मैंने यह पता लगाया है। आपका गणित बिल्कुल सही है। कैमरा और frustum आपके द्वारा बताई गई जेड = 1 पर एक के पास कतरन विमान है, इसलिए में अपने उदाहरण बिंदु (-100, 100, 0) वास्तव में, बाहर कतरन विमान के है तो बस नीचे की कि z-बफर मूल्य -1 सही समझ में आता है।

एक के साथ एक नमूना बिंदु का प्रयास करें अपने छिन्नक अंदर z निर्देशांक, एक के साथ कह 2.

+0

Hmmn, ठीक है मुझे लगता है कि समझ में आता है के बाद से प्रतिपादन अभी भी सही है लगता। लेकिन क्या मुझे अपने गहराई बफर में स्टोर करने के लिए जेड वैल्यू की आवश्यकता नहीं है? और यदि मैं इसे संग्रहीत कर रहा हूं, तो क्या इसे [0, 1] या कम से कम [-1, 1] की सीमाओं के बीच होने की आवश्यकता नहीं है? – Jon

+0

http://www.gamedev.net/community/forums/topic.asp?topic_id=483363 पर एक नज़र डालें। मुझे लगता है कि आपको डब्ल्यू द्वारा विभाजित करने से पहले क्लिपिंग * करना पड़ सकता है। उस स्थिति में, आप क्लिपिंग एल्गोरिदम में जेड बफर मान की गणना कर सकते हैं, जहां यह केवल z/1500 (आपके उदाहरण में) होगा। –

+0

यहाँ एक और एक: http://www.codermind.com/articles/Depth-buffer-tutorial.html –