यदि आपके पास वर्तमान में मौजूद विमानों के सामान्य वेक्टर हैं, या आसानी से गणना कर सकते हैं, तो मुझे लगता है कि ऐसा करने का सबसे आसान तरीका दो विमानों के लिए धुरी के चारों ओर घूमना होगा। यहाँ कैसे मैं इसके बारे में जाना करेंगे:
- Let वेक्टर अपने वर्तमान विमान को सामान्य हो
M
, और N
वेक्टर विमान आप में घुमाना चाहते करने के लिए सामान्य हो। यदि M == N
अब आप रोक सकते हैं और मूल बिंदु अपरिवर्तित छोड़ सकते हैं।
रूप
costheta = dot(M,N)/(norm(M)*norm(N))
रोटेशन कोण की गणना
axis = unitcross(M, N)
के रूप में रोटेशन धुरी की गणना जहां unitcross
एक समारोह है कि उत्पाद पार करता है और एक इकाई वेक्टर के लिए यह सामान्य हो, अर्थात unitcross(a, b) = cross(a, b)/norm(cross(a, b))
है। user1318499 ने एक टिप्पणी में बताया, M == N
अगर यह चरण (0,0,0)
पर a == b
लौटाता है, तो यह चरण त्रुटि उत्पन्न कर सकता है।
कंप्यूट
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
, और z
axis
के घटक हैं के रूप में अक्ष और कोण से रोटेशन मैट्रिक्स। इस सूत्र का वर्णन on Wikipedia है।
प्रत्येक बिंदु के लिए,
newpoint = dot(rmat, point)
जहां समारोह dot
आव्यूह गुणन करता है के रूप में नए विमान पर उसके संगत बिंदु की गणना।
यह निश्चित रूप से अद्वितीय नहीं है; जैसा कि पीटरके के उत्तर में उल्लिखित है, वहां संभावित घूर्णन की असीमित संख्या है जो आप विमान को सामान्य रूप से M
को सामान्य रूप से N
पर बदल सकते हैं। यह इस तथ्य से मेल खाता है कि, ऊपर वर्णित चरणों को लेने के बाद, आप विमान को N
के आसपास घुमा सकते हैं, और उसी बिंदु में रहने के दौरान आपके अंक अलग-अलग स्थानों पर होंगे। (दूसरे शब्दों में, प्रत्येक रोटेशन जो आप कर सकते हैं जो आपकी शर्तों को संतुष्ट करता है, ऊपर वर्णित प्रक्रिया को करने के बाद N
के आस-पास एक और घूर्णन के अनुरूप होता है।) लेकिन यदि आपको परवाह नहीं है कि विमान में आपके अंक हवा में हैं, तो मुझे लगता है कि यह घूर्णन चारों ओर घूमता है आम अक्ष आप M
नहीं है, तो सबसे आसान तरीका सिर्फ विमान आप उन्हें में चाहते में अंक प्राप्त करने के लिए है।
, लेकिन आप अपने शुरू कर विमान में अंक के निर्देशांक है रिश्तेदार उस विमान में की उत्पत्ति के लिए, आप प्रारंभिक सामान्य वेक्टर को दो बिंदुओं की स्थिति x1
और x2
से
012 पर गणना कर सकते हैं
M = cross(x1, x2)
(आप यहां unitcross
का भी उपयोग कर सकते हैं लेकिन इससे कोई फर्क नहीं पड़ता)। आप अंक है, तो 'निर्देशांकों के एक मूल है कि विमान में नहीं है के सापेक्ष, आप अभी भी यह कर सकते हैं, लेकिन आप तीन अंक की आवश्यकता होगी की स्थिति:
M = cross(x3-x1, x3-x2)
स्रोत
2012-02-24 00:56:54
+1 अच्छा जवाब। एकमात्र पकड़ (जिस हद तक यह एक गड़बड़ी के स्तर तक बढ़ जाती है, जो संदिग्ध है) मैंने पाया है कि आपने 4 और 5 के संभावित विकल्प के रूप में क्वाटरनीयन रोटेशन का उल्लेख नहीं किया है। वे कुछ और अधिक कुशल हैं। – andand
@andand: आमतौर पर मैं इस तरह की चीज विश्लेषणात्मक रूप से कर रहा हूं, इसलिए मैं quaternions से पूरी तरह से परिचित नहीं हूँ। लेकिन अगर मेरे पास समय है तो मैं इसे संपादित करूंगा। –
एक अच्छा सारांश http://en.wikipedia.org/wiki/Quaternion_rotation – andand