2010-07-08 15 views
9

का उपयोग करते हुए एक बिंदु की ओर एक QUAD घुमाएं जब मेरे पास एक निश्चित स्थिति पर एक क्वाड हो, तो मैं इसे इस तरह से कैसे घुमा सकता हूं कि किसी दिए गए बिंदु की ओर सामान्य बिंदु? कल्पना करें कि रंगीन ब्लॉक सिर्फ आयताकार quads हैं, तो यह छवि थोड़ा सा मतलब दिखाता है। क्वाड सभी इस तरह से उन्मुख होते हैं कि वे क्षेत्र के केंद्र की तरफ इशारा करते हैं। मैं ओपन/C++ (और Eigen lib) का उपयोग कर रहा alt text http://img689.imageshack.us/img689/3130/screenshot20100708at555.pngसी ++/ओपनजीएल: क्वाटरनियंस

:

alt text http://emrahgunduz.com/wp-content/uploads/2009/01/material_id_gui-600x364.jpg

हो सकता है कि यह दूसरी छवि में थोड़ा और अधिक मैं क्या करने की कोशिश कर रहा हूँ पता चलता है।

#include "ofMain.h" 
#include "Quad.h" 
Quad::Quad(Vector3f oPosition):position(oPosition) { 
} 

void Quad::update() { 
} 

void Quad::draw() { 
    float size = 1.3; 
    glColor3f(1.0f, 0.0f, 0.6f); 
    glPushMatrix(); 
     glTranslatef(position.x(), position.y(), position.z()); 
     glScalef(size, size,size); 
     glBegin(GL_QUADS); 
      glVertex3f(0,0,0); 
      glVertex3f(1,0,0); 
      glVertex3f(1,1,0); 
      glVertex3f(0,1,0); 
     glEnd(); 
    glPopMatrix(); 
} 

अपडेट 17-07 प्रिय पाठक,

बस quads घूर्णन के साथ एक छोटा सा आगे हो गया: और मैं इस कोड को एक सरल ट्रैक्टर आकर्षित करने के लिए किया है। मैं quads के एक जोड़े स्थिति रहा हूँ बेतरतीब ढंग से और फिर मैं इस कोड के नीचे उत्तर से वर्णन का उपयोग का उपयोग कर vector3f एक look_at की ओर उन्हें बारी बारी से:

void Quad::draw() { 
    float size = 0.5; 
    glColor3f(1.0f, 0.0f, 0.6f); 
    glPushMatrix(); 
     Vector3f center = look_at - position; 
     Vector3f center_norm = center.normalized(); 
     float r_angle = acos(center_norm.dot(normal)); 
     Vector3f axis = normal.normalized().cross(center_norm); 

     glPointSize(8); 
     glLineWidth(4.0f); 

     // draw the center point 
     glColor3f(1.0f, 0.0f, 0.0f); 
     glBegin(GL_POINTS); 
      glVertex3fv(look_at.data()); 
     glEnd(); 

     // draw the quad 
     glColor4f(0.0f, 0.0f, 0.0f, 0.85f); 
     glTranslatef(position.x(), position.y(), position.z()); 
     glRotatef(r_angle * RAD_TO_DEG, axis.x(), axis.y(), axis.z()); 
     glScalef(size, size,size); 
     glBegin(GL_QUADS); 
      glVertex3f(-0.5,-0.5,0); 
      glVertex3f(0.5,-0.5,0); 
      glVertex3f(0.5,0.5,0); 
      glVertex3f(-0.5,0.5,0); 
     glEnd(); 

    glPopMatrix(); 
} 

परिणाम इस प्रकार है: alt text http://img688.imageshack.us/img688/711/3drotatedquads.png

आप के रूप में देख सकते हैं कि मैं लगभग वहां हूं, हालांकि quads का घूर्णन अभी भी थोड़ा "अजीब" है। मैं नीचे दिए गए चित्र को रंगीन क्वाड के साथ देखता हूं जो आप घूर्णन में अंतर को स्पष्ट रूप से देखते हैं। मैं क्वाड को इस तरह से कैसे घुमा सकता हूं कि मुझे नीचे दिए गए रंग के समान परिणाम मिलते हैं?

+0

+1: क्योंकि मैं 3 डी चित्रों :) – ereOn

+0

प्यार ये छवि लिंक सभी टूट रहे हैं। –

उत्तर

1

रोटेशन अक्ष = सामान्य (crossproduct (currentNormal, desiredNormal))

घुमाव कोण = acos (dotproduct (सामान्य (currentNormal), सामान्य (desiredNormal))।

आप या तो रोटेशन मैट्रिक्स या चार का समुदाय का निर्माण कर सकते अक्ष और कोण से। सटीक सूत्र quaternions के बारे में किसी भी संसाधन में पाया जा सकता।

आप कोण या कि क्या आप अपने 'आधार या उसके आस-पास' के आसपास टिप सामान्य बारी बारी के आधार पर अक्ष फ्लिप करने पड़ सकता है।

भी THIS संसाधन में सामान्य रूप से quaternions, rotations, और 3 डी स्पेस के बारे में पर्याप्त जानकारी है।

+0

हाय सिगटर्म, लेकिन जब मैं अपने वर्तमान सामान्य नहीं जानता तो मैं इसे कैसे हल करूं? मुझे केवल कोड मिला है जिसे मैंने चिपकाया था ('क्वाड' क्लास)। – pollux

+1

एक ट्रैक्टर सामान्य ABCD के लिए पार उत्पाद = सामान्य (क्रॉस (ग-ए, डी-ख)) का उपयोग कर या सामान्य का उपयोग कर पाया जा सकता है (Crossproduct (ख-एक, सी-एक))। क्वाड से किसी भी दो गैर समांतर वैक्टर का उपयोग लंबवत बनाने के लिए किया जा सकता है। आपके उदाहरण में सामान्य (0, 0, 1) या (0, 0, -1) है। (इस बात पर निर्भर करता है कि क्या क्वाड एक ही घुमावदार आदेश, एक तरफा या डबल पक्षीय आदि का उपयोग करते हैं)। – SigTerm

+0

सिगटर्म, इसका मतलब 'बेस' या 'टिप' के चारों ओर घुमाने के साथ क्या मतलब है? इस परिणाम मैं अब मिल गया है कारण बन सकता है (ऊपर काला quads देखें) – pollux

0

हैं "एक निश्चित स्थान पर" का अर्थ है कि आप अपने वर्तमान सामान्य पता है, की तुलना में यहाँ बात यह है कि:

  1. डॉट एक पुराने और नए सामान्य का उत्पाद है उन दोनों के बीच एक कोण की कोज्या।
  2. उनका क्रॉस उत्पाद एक धुरी है जिसके आसपास आपको वांछित रोटेशन करना चाहिए
  3. दिए गए अक्ष और कोण से रोटेशन क्वाटरनियन का निर्माण अच्छी तरह से प्रलेखित और मूलभूत सुविधा है।
  4. क्वाड घूर्णन करना मुश्किल है और यह इस बात पर निर्भर करता है कि आप इसे वास्तव में कैसे घुमाएंगे।