2009-12-09 10 views
6

मैं आर्कबॉल/ट्रैकबॉल रोटेशन को लागू करने की कोशिश कर रहा हूं लेकिन मुझे रोटेशन के केंद्र में समस्या है। मैं चाहता हूं कि केंद्र मेरी स्क्रीन का केंद्र हो, चाहे कोई फर्क नहीं पड़ता।ओपनएल में quaternions का उपयोग कर स्क्रीन के केंद्र के बारे में कैसे घूमना है?

मुझे बताएं कि मैंने अब तक क्या किया है।

मैं एक quaterion (रोटेशन धुरी: vector_start एक्स vector_end, कोण: vector_start * vector_end) बना लिया है

कि चार का समुदाय मैं आदेश glMultMatrixf (मैट्रिक्स) के साथ इसका इस्तेमाल करने में एक रोटेशन मैट्रिक्स बना लिया है से और वांछित रोटेशन प्राप्त करें।

समस्या यह है कि मेरा मॉडल आर्कबॉल घूमता हुआ लगता है क्योंकि यह हमेशा अपने स्थानीय मूल के आसपास घूमता है। मैं इसे अपनी स्क्रीन के केंद्र के चारों ओर घुमा सकता हूं इससे कोई फर्क नहीं पड़ता कि इसकी स्थानीय उत्पत्ति कहां स्थित है?

मुझे लगता है कि उस समस्या का समाधान स्क्रीन के केंद्र में पूरे रोटेशन अक्ष का अनुवाद करना और फिर घूर्णन लागू करना है, लेकिन क्या यह संभव है? क्या मुझे यहां कुछ याद आती है?

उत्तर

1

आपको सही क्रम में रोटेशन और अनुवाद मैट्रिस लागू करके इसे हल करने में सक्षम होना चाहिए। अपने कोड में आप मूल टी (-pos_x, -pos_y, -pos_z) पर वापस अनुवाद कर सकते हैं, अपना रोटेशन लागू करें, और फिर ऑब्जेक्ट सेंटर में अनुवाद करें T (pos_x, pos_y, pos_z)। यह सामान्य रूप से काम करना चाहिए, आपके रोटेशन मैट्रिक्स का निर्माण कैसे किया जाता है।

+0

हाँ, लेकिन जब मैं glmultMatrixf() लागू करता हूं तो opengl मॉडल को स्थानीय मूल के आस-पास घूमता नहीं है? तो यदि मैं मूल घुमाने के लिए अनुवाद करता हूं (glRotatef() लेकिन glMultMatrix() का उपयोग करके नहीं) और फिर फिर से अनुवाद करें तो मेरा मॉडल फिर से इसकी उत्पत्ति के चारों ओर घुमाएगा और ऐसा नहीं होगा कि इसकी उत्पत्ति उदाहरण के लिए स्क्रीन का केंद्र था। –

+0

glTranslatef() के साथ अनुवाद करें, फिर अपने रोटेशन मैट्रिक्स glMultMatrix() के साथ गुणा करें, और glTranslatef() का उपयोग करके फिर से अनुवाद करें। यह glmultMatrix() को कॉल करने के विरोध में है। यह काम नहीं करता है? – catchmeifyoutry

+0

नहीं, यह काम नहीं करता है। यह क्या करता है कि यह glMultMatrixf द्वारा लागू रोटेशन मैट्रिक्स से बताए गए मॉडल के रूप में मॉडल को घुमाता है लेकिन इसकी स्थानीय उत्पत्ति के आसपास होता है। मैंने रोटेशन क्वाटरनियन को यूलर कोणों में बदलने की कोशिश की है और फिर glRotatef (Yaw, 0., 0., 1।) लागू करें; glRotatef (Pich, 0., 1., 0।); glRotatef (रोल, 1., 0., 0।); glmultMatrixf() को सीधे लागू करने के बजाय, लेकिन फिर जब रोटेशन स्क्रीन के केंद्र के बारे में था, तो उसके पास आर्केबॉल रोटेशन के साथ कुछ लेना देना नहीं है! –

0

यहां कुछ कोड है जिसे मैंने कुछ समय पहले 3-स्टेज रॉकेट लॉन्च व्यूअर के लिए लिखा था। मैं http://www.euclideanspace.com/maths/geometry/rotations से

नोट जानकारी का सबसे मिल गया: विचलन, पिच और रोल आप कैसे की स्थापना अपने समन्वय प्रणाली

 // Assuming the angles are in radians. 
      double p = curPitch * Math.PI/180.0/2.0; 
      double y = curYaw * Math.PI/180.0/2.0; 
      double r = curRoll * Math.PI/180.0/2.0; 

      double sinp = Math.sin(p); 
      double siny = Math.sin(y); 
      double sinr = Math.sin(r); 
      double cosp = Math.cos(p); 
      double cosy = Math.cos(y); 
      double cosr = Math.cos(r); 

      Vector3 axis = new Vector3(); 

      //here's the important part: how you get your quaternion vector! 
      axis.x = sinr * cosp * cosy - cosr * sinp * siny; 
      axis.y = cosr * sinp * cosy + sinr * cosp * siny; 
      axis.z = cosr * cosp * siny - sinr * sinp * cosy; 

      //now normalize the vector in case we want to use it again later 
      axis = Vector3.normalizeVector(axis); 

      orientation[1] = axis.x; 
      orientation[2] = axis.y; 
      orientation[3] = axis.z; 

      //w is omega: the angle to rotate about the quaternion 
      double w = cosr * cosp * cosy + sinr * sinp * siny; 

      w = Math.acos(w) * 2.0; 

      orientation[0] = w; 

      gl.glPushMatrix(); 

       //translate object first, then rotate it. 
       gl.glTranslated(curDisplacement[0] + saveDisplacement[0], -curDisplacement[1] + saveDisplacement[2], curDisplacement[2] + saveDisplacement[1]); 

       //this order might be messed up because I screwed up my coordinate system, but the idea is still there 
       gl.glRotated(orientation[0]*180/Math.PI, orientation[2]*180/Math.PI, orientation[3]*180/Math.PI, orientation[1]*180/Math.PI); 

      //place your objects 
      gl.glPopMatrix(); 

आशा इस में मदद करता है के आधार पर आप के लिए बदल सकते हैं!

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