2010-03-23 15 views
6

में एक विमान पर एक प्लानर बहुभुज प्रोजेक्ट करें, मैं 3 डी स्पेस में एक वेक्टर के साथ अपने पॉलीगॉन को एक वेक्टर के साथ प्रोजेक्ट करना चाहता हूं। ऐसा करने के लिए मैं अधिमानतः एक एकल रूपांतरण मैट्रिक्स का उपयोग करूंगा, लेकिन मुझे नहीं पता कि इस तरह के मैट्रिक्स को कैसे बनाया जाए।कैसे 3 डी स्पेस

को देखते हुए

  • विमान के मानकों (द्वारा + cz + d कुल्हाड़ी +),
  • दुनिया मेरी बहुभुज का समन्वय करता है। जैसा कि शीर्षक में बताया गया है, मेरे बहुभुज के सभी शिखर दूसरे विमान में स्थित हैं।
  • जिसके साथ मेरी बहुभुज (वर्तमान में बहुभुज के विमान की सामान्य वेक्टर)

लक्ष्य -एक 4x4 परिवर्तन मैट्रिक्स जो आवश्यक प्रक्षेपण करता है, परियोजना के लिए दिशा वेक्टर

या

  • खुद को बनाने के बारे में कुछ अंतर्दृष्टि

अद्यतन

उत्तर के लिए धन्यवाद, के रूप में इरादा यह काम करता है।

लोगों को यह सावधानी बरतने वाले लोगों का एक शब्द: यदि प्रक्षेपण सामान्य का विमान प्रक्षेपण वेक्टर के समानांतर है, तो डेनोमिनेटर डी (लगभग) 0 बन जाएगा, इसलिए अजीब चीज़ों से होने से बचने के लिए, कुछ प्रकार की हैंडलिंग इस विशेष मामले की आवश्यकता है। मैंने यह जांचकर हल किया कि क्या डी < 1e-5, और यदि ऐसा है, तो बस मेरे बहुभुज एचटी एक्सट्रूज़न वेक्टर के साथ अनुवाद करें।

उत्तर

12

मान लीजिए कि बहुभुज के शीर्ष में से एक (x0, y0, z0) है, और दिशा वेक्टर (dx,dy,dz) है।

प्रक्षेपण की रेखा पर एक बिंदु है: (x,y,z) = (x0 + t*dx, y0 + t*dy, z0 + t*dz)

आप हवाई जहाज के साथ इस लाइन के चौराहे मिल जाए, तो विमान समीकरण ax+by+cz+d = 0 में प्लग और टी के लिए हल करने के लिए करना चाहते हैं:

t = (-a*x0 - b*y0 - c*z0 - d)/(a*dx + b*dy + c*dz) 

और फिर आप अपने लक्ष्य शिखर है: x = x0+dx*t, आदि

चूंकि यह एक एफ़िन रूपांतरण है, इसे 4x4 मैट्रिक्स द्वारा किया जा सकता है। आप एक्स, वाई, जेड के लिए x0, y0, z0 के फ़ंक्शन के रूप में और गुणांक लेने के लिए तीन समीकरणों को लिखकर मैट्रिक्स तत्वों को निर्धारित करने में सक्षम होना चाहिए।

उदाहरण के लिए, एक्स के लिए:

x = x0 - (a*dx*x0 + b*dx*y0 + c*dx*z0 + d*dx)/D 
x = (1 - a*dx/D)*x0 - (b*dx/D)*y0 - (c*dx/D)*z0 - d*dx/D 

कहाँ D = a*dx + b*dy + c*dz ऊपर से भाजक है। वाई और जेड इसी तरह काम करते हैं।

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

1-a*dx/D -b*dx/D -c*dx/D -d*dx/D 
-a*dy/D 1-b*dy/D -c*dy/D -d*dy/D 
-a*dz/D -b*dz/D 1-c*dz/D -d*dz/D 
    0   0   0   1 

(नोट: Direct3D पर इस मैट्रिक्स, स्थानांतरित किया जाना चाहिए, क्योंकि यह पंक्ति वैक्टर का उपयोग करता स्तंभ वैक्टर के बजाय)।

+0

पूर्ण समाधान के लिए धन्यवाद। मैं इसे तुरंत कोशिश करूंगा – sum1stolemyname

+0

मैंने आपका समाधान लागू किया है। हालांकि, मैंने परेशानी में भाग लिया है क्योंकि मेरी दिशा वेक्टर (1 | 0 | 0) है और विमान 45 डिग्री कोण पर है: साइड व्यू: '| ---->/'कहां | पॉलीगॉन है और/जिस पर प्रक्षेपण करने वाला विमान है। इस मामले में, एक * डीएक्स/डी = 1, जहां पहले कॉलम में अन्य दो प्रविष्टियां 0 हैं (dy = dzt = 0)। इससे पूरे कूपन 0 होते हैं, जो मेरे पॉलीगॉन को 0 से प्रभावी रूप से स्केल करते हैं। मेरा एप्लिकेशन इसे पसंद नहीं करता है। क्या आप इसके लिए कामकाज के बारे में जानते हैं? – sum1stolemyname

+1

@ sum1: पहला कॉलम शून्य होने का अर्थ है कि मूल शिखर के एक्स समन्वय को अनदेखा कर दिया जाएगा। यह अपेक्षा की जाती है क्योंकि आपकी प्रक्षेपण दिशा एक्स अक्ष के समानांतर है। यह आपके बहुभुज को 0 – interjay