2014-08-08 7 views
6

में दो वैक्टरों के बीच रोटेशन मैट्रिक्स को कैसे ढूंढें I THREE.js में दो परिभाषित वैक्टरों के बीच रोटेशन मैट्रिक्स खोजने का तरीका ढूंढ रहा हूं।THREE.js

उदाहरण

v1 = new THREE.Vector3(1, 1, 1) v2 = new THREE.Vector3(1, 1, -1)

के लिए मैं अगले चरण में पूरी वस्तु बारी बारी से करने के लिए इस रोटेशन मैट्रिक्स की जरूरत है।

+1

यह एक गैर है तो सवाल यह है, btw यहाँ http://gamedev.stackexchange.com/questions/20097/how- देखो टू-गणना-ए -3x3-रोटेशन-मैट्रिक्स-से-2-दिशा-वेक्टर –

+0

और यह वेक्टर 3 दस्तावेज है http://threejs.org/docs/#Reference/Math/Vector3 –

+0

यह प्रश्न ऑफ- विषय क्योंकि यह http://math.stackexchange.com/ –

उत्तर

14

तुम इतनी तरह दो यूनिट-लंबाई वैक्टर v1 और v2 से एक रोटेशन परिभाषित कर सकते हैं:

var quaternion = new THREE.Quaternion(); // create one and reuse it 

quaternion.setFromUnitVectors(v1, v2); 

आपके मामले में, आप पहली बार अपने वैक्टर को सामान्य बनाने की जरूरत है।

object.applyQuaternion(quaternion); 

:

var matrix = new THREE.Matrix4(); // create one and reuse it 

matrix.makeRotationFromQuaternion(quaternion); 

object.applyMatrix(matrix); 

वैकल्पिक रूप से, अगर आप मैट्रिक्स की आवश्यकता नहीं है, तो आप सिर्फ सीधे चौका आवेदन कर सकते हैं:

इसके बाद आप निम्न पद्धति का उपयोग कर एक वस्तु है कि रोटेशन लागू कर सकते हैं three.js r.86

+0

हाय के बारे में है। धन्यवाद, यह काम करता प्रतीत होता है। Quaternion निर्भरता के बिना इस समाधान के लिए अच्छा होगा, हालांकि। – kriskodzi

+3

तीन.जेएस quaternion- आधारित है। लेकिन अगर आप जोर देते हैं, तो पहले वैक्टर को सामान्य करें और 'axis.cross (v1, v2) सेट करें; कोण = v1.angleTo (v2); matrix.makeRotationAxis (धुरी, कोण); object.applyMatrix (मैट्रिक्स); ' – WestLangley

+0

हां, यह वही है जो मैं ढूंढ रहा हूं। मुझे लगता है कि आप इसे अपने उत्तर में जोड़ सकते हैं, फिर मैं इसे स्वीकार किए जाने के रूप में चिह्नित करूंगा। – kriskodzi

1

मैं quaternions का उपयोग करता हूं इसके बजाय मैं ऐसा करता हूं (THREE.js का उपयोग न करें):

,210

निर्माण 4x4 प्रथम वेक्टर V1 के लिए मैट्रिक्स को बदलने (V1, V2 अपनी XY विमान पर देता है और V1 एक्स अक्ष है)

double V1[3],V2[3]; // input 
double X[3],Y[3],Z[3],P[3]; // output 
double m[16]; // OpenGL like transform matrix 
X = V1; 
Z = V1 x V2; 
Y = X x Z; 
X/=|X|; 
Y/=|Y|; 
Z/=|Z|; 
P = (0,0,0); 
m[ 0]=X[0]; 
m[ 1]=X[1]; 
m[ 2]=X[2]; 
m[ 3]=0; 
m[ 4]=Y[0]; 
m[ 5]=Y[1]; 
m[ 6]=Y[2]; 
m[ 7]=0; 
m[ 8]=Z[0]; 
m[ 9]=Z[1]; 
m[10]=Z[2]; 
m[11]=0; 
m[12]=P[0]; 
m[13]=P[1]; 
m[14]=P[2]; 
m[15]=1; 

अब लागू रोटेशन पर यह

double angle = acos((V1.v2)/(|V1|.|V2|)) 
    जेड धुरी के चारों ओर मैट्रिक्स को बदलने
  • +/- कोण
  • कोण संकेत Y ​​अक्ष पर निर्भर करता है के द्वारा जेड धुरी के चारों ओर बारी बारी से पार उत्पाद ऑपरेंड अभी
  • नहीं
  • यकीन है कि आदेश से सिर लेकिन आप
  • देखेंगे आप इसे गलत V2 विपरीत दिशा में हो जाएगा निर्धारित करते हैं
+0

हाय, आपकी टिप के लिए धन्यवाद, मैं मैं बस इसका परीक्षण कर रहा हूँ। आप वास्तव में Z अक्ष पर Z अक्ष के आसपास _apply रोटेशन ट्रांसफॉर्म मैट्रिक्स द्वारा क्या मतलब है।आप चाहते हैं कि मैं ऑब्जेक्ट के लिए मैट्रिक्स लागू करूँ और फिर इसे ज़ेड के चारों ओर घुमाएं, इसलिए हमें 2 रोटेशन लागू करना होगा? – kriskodzi

+1

@RecRoot m [] में V1 की समन्वय प्रणाली का प्रतिनिधित्व करने वाले परिवर्तन मैट्रिक्स शामिल हैं। आपको रोटेशन मैट्रिक्स (कोण के द्वारा जेड के आसपास) द्वारा मैट्रिक्स एम को गुणा करना है जो वी 1 से वी 2 तक समन्वय प्रणाली को घुमाता है। इससे कोई फर्क नहीं पड़ता कि आप ऑब्जेक्ट * एम * रोटज़ या एम = एम * रोटज़ लागू करते हैं और फिर ओबीजे * एम केवल एक ही अंतर होता है जब आप एम बनाते हैं तो आपके पास कम ऑपरेशन होते हैं (केवल एक बार ऑब्जेक्ट के प्रत्येक चरम के लिए मैट्रिक्स द्वारा मैट्रिक्स गुणा करें। ..) आप Google के आसपास घूर्णन के लिए रूपांतरण मैट्रिक्स कैसे देख सकते हैं (यह मूल है और मुझे लगता है कि यह आपके फ्रेमवर्क में कुछ फ़ंक्शन में मूल रूप से है) – Spektre

+0

@RecRoot btw यहां देखें: http://stackoverflow.com/a/25216549/ मैट्रिक्स संरचना बदलने के बारे में अधिक जानकारी के लिए 2521214। – Spektre

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