2012-02-24 17 views
7

मैं कुछ ऐसा कर रहा हूं जहां मेरे पास एक समन्वय sys ए में एक विमान है जो पहले से ही बिंदुओं के एक सेट के साथ है। मेरे पास स्पेस एन में एक सामान्य वेक्टर भी है। मैं समन्वय sys ए पर अंक कैसे घुमा सकता हूं ताकि अंतर्निहित विमान में एन के समान सामान्य दिशा हो?विमान के 3 डी रोटेशन

आश्चर्य है कि किसी को भी यह कैसे करना है इसके बारे में कोई अच्छा विचार है। धन्यवाद

उत्तर

16

यदि आपके पास वर्तमान में मौजूद विमानों के सामान्य वेक्टर हैं, या आसानी से गणना कर सकते हैं, तो मुझे लगता है कि ऐसा करने का सबसे आसान तरीका दो विमानों के लिए धुरी के चारों ओर घूमना होगा। यहाँ कैसे मैं इसके बारे में जाना करेंगे:

  1. Let वेक्टर अपने वर्तमान विमान को सामान्य हो M, और N वेक्टर विमान आप में घुमाना चाहते करने के लिए सामान्य हो। यदि M == N अब आप रोक सकते हैं और मूल बिंदु अपरिवर्तित छोड़ सकते हैं।
  2. रूप

    costheta = dot(M,N)/(norm(M)*norm(N)) 
    
  3. रोटेशन कोण की गणना

    axis = unitcross(M, N) 
    

    के रूप में रोटेशन धुरी की गणना जहां unitcross एक समारोह है कि उत्पाद पार करता है और एक इकाई वेक्टर के लिए यह सामान्य हो, अर्थात unitcross(a, b) = cross(a, b)/norm(cross(a, b)) है। user1318499 ने एक टिप्पणी में बताया, M == N अगर यह चरण (0,0,0) पर a == b लौटाता है, तो यह चरण त्रुटि उत्पन्न कर सकता है।

  4. कंप्यूट

    c = costheta 
    s = sqrt(1-c*c) 
    C = 1-c 
    rmat = matrix([ x*x*C+c x*y*C-z*s x*z*C+y*s ], 
           [ y*x*C+z*s y*y*C+c y*z*C-x*s ] 
           [ z*x*C-y*s z*y*C+x*s z*z*C+c ]) 
    

    जहां x, y, और zaxis के घटक हैं के रूप में अक्ष और कोण से रोटेशन मैट्रिक्स। इस सूत्र का वर्णन on Wikipedia है।

  5. प्रत्येक बिंदु के लिए,

    newpoint = dot(rmat, point) 
    

    जहां समारोह dot आव्यूह गुणन करता है के रूप में नए विमान पर उसके संगत बिंदु की गणना।

यह निश्चित रूप से अद्वितीय नहीं है; जैसा कि पीटरके के उत्तर में उल्लिखित है, वहां संभावित घूर्णन की असीमित संख्या है जो आप विमान को सामान्य रूप से M को सामान्य रूप से N पर बदल सकते हैं। यह इस तथ्य से मेल खाता है कि, ऊपर वर्णित चरणों को लेने के बाद, आप विमान को N के आसपास घुमा सकते हैं, और उसी बिंदु में रहने के दौरान आपके अंक अलग-अलग स्थानों पर होंगे। (दूसरे शब्दों में, प्रत्येक रोटेशन जो आप कर सकते हैं जो आपकी शर्तों को संतुष्ट करता है, ऊपर वर्णित प्रक्रिया को करने के बाद N के आस-पास एक और घूर्णन के अनुरूप होता है।) लेकिन यदि आपको परवाह नहीं है कि विमान में आपके अंक हवा में हैं, तो मुझे लगता है कि यह घूर्णन चारों ओर घूमता है आम अक्ष आप M नहीं है, तो सबसे आसान तरीका सिर्फ विमान आप उन्हें में चाहते में अंक प्राप्त करने के लिए है।


, लेकिन आप अपने शुरू कर विमान में अंक के निर्देशांक है रिश्तेदार उस विमान में की उत्पत्ति के लिए, आप प्रारंभिक सामान्य वेक्टर को दो बिंदुओं की स्थिति x1 और x2 से

012 पर गणना कर सकते हैं
M = cross(x1, x2) 

(आप यहां unitcross का भी उपयोग कर सकते हैं लेकिन इससे कोई फर्क नहीं पड़ता)। आप अंक है, तो 'निर्देशांकों के एक मूल है कि विमान में नहीं है के सापेक्ष, आप अभी भी यह कर सकते हैं, लेकिन आप तीन अंक की आवश्यकता होगी की स्थिति:

M = cross(x3-x1, x3-x2) 
+1

+1 अच्छा जवाब। एकमात्र पकड़ (जिस हद तक यह एक गड़बड़ी के स्तर तक बढ़ जाती है, जो संदिग्ध है) मैंने पाया है कि आपने 4 और 5 के संभावित विकल्प के रूप में क्वाटरनीयन रोटेशन का उल्लेख नहीं किया है। वे कुछ और अधिक कुशल हैं। – andand

+0

@andand: आमतौर पर मैं इस तरह की चीज विश्लेषणात्मक रूप से कर रहा हूं, इसलिए मैं quaternions से पूरी तरह से परिचित नहीं हूँ। लेकिन अगर मेरे पास समय है तो मैं इसे संपादित करूंगा। –

+1

एक अच्छा सारांश http://en.wikipedia.org/wiki/Quaternion_rotation – andand

0

मैं सोच रहा हूं कि एक इकाई वेक्टर [0,0,1] बनाना और अंतर के कोण को खोजने के लिए दो विमानों के साथ डॉट-उत्पाद का उपयोग करें, और उन सभी कोणों से अपने सभी बिंदुओं को स्थानांतरित करें। यह माना जाता है कि आप जेड-अक्ष को सामान्य वेक्टर के साथ संरेखित करना चाहते हैं, अन्यथा क्रमश: एक्स और वाई के लिए [1,0,0] या [0,1,0] का उपयोग करें।

+0

इस z- अक्ष केवल एक जैसी नहीं हैं ? या तो x या y – bendervader

1

एक एकल वेक्टर (आपका सामान्य - एन) पर्याप्त नहीं होगा। आपको अन्य दो आयामों के लिए एक और दो वैक्टर की आवश्यकता होगी। (कल्पना कीजिए कि आपकी 3 डी स्पेस अभी भी सामान्य वेक्टर के चारों ओर घुमाएगी/स्पिन कर सकती है, और आपको इसे कम करने के लिए एक और 2 वैक्टर की आवश्यकता है)। एक बार जब आपके पास विमान पर सामान्य और दूसरा हो, तो तीसरा व्यक्ति ढूंढना आसान हो सकता है (बाएं- या दाहिने हाथ आपके सिस्टम के आधार पर)।

सुनिश्चित करें कि सभी तीन सामान्यीकृत हैं (1 की लंबाई) और उन्हें एक मैट्रिक्स में रखें; अपने 3 डी स्पेस में किसी भी बिंदु को बदलने के लिए उस मैट्रिक्स का उपयोग करें (मैट्रिक्स गुणा का उपयोग करें)। यह आपको नए निर्देशांक देना चाहिए।

+0

में अधिक डोफ होगा समझ में आता है! मुझे अन्य वेक्टर प्राप्त करने का एक तरीका पता करने की आवश्यकता होगी: एस धन्यवाद! – bendervader

+2

-1: यह उत्तर अस्पष्ट और अपूर्ण है। – andand

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