2012-12-23 9 views
5

में बुलेट के btIDebugDraw इंटरफ़ेस को कैसे कार्यान्वित करें बुलेट के पुराने ओपनजीएल में btIDebugDraw इंटरफ़ेस का कार्यान्वयन है जिसका उपयोग भौतिकी दुनिया को डिबगिंग के लिए आकर्षित करने के लिए किया जाता है। इंटरफ़ेस इस तरह है:ओपनजीएल 4.0

class GLDebugDrawer : public btIDebugDraw 
{ 
int m_debugMode; 

public: 

GLDebugDrawer(); 
virtual ~GLDebugDrawer(); 

virtual void drawLine(const btVector3& from,const btVector3& to,const btVector3& fromColor, const btVector3& toColor); 

virtual void drawLine(const btVector3& from,const btVector3& to,const btVector3& color); 

virtual void drawSphere (const btVector3& p, btScalar radius, const btVector3& color); 

virtual void drawTriangle(const btVector3& a,const btVector3& b,const btVector3& c,const btVector3& color,btScalar alpha); 

virtual void drawContactPoint(const btVector3& PointOnB,const btVector3& normalOnB,btScalar distance,int lifeTime,const btVector3& color); 

virtual void reportErrorWarning(const char* warningString); 

virtual void draw3dText(const btVector3& location,const char* textString); 

virtual void setDebugMode(int debugMode); 

virtual int  getDebugMode() const { return m_debugMode;} 

}; 

ओपन 1.1 कार्यान्वयन तत्काल मोड में काम करता हर कार्य कॉल पर GPU के लिए नीचे कोने भेज दिया। जैसे। यहाँ drawLine है()

void GLDebugDrawer::drawLine(const btVector3& from,const btVector3& to,const btVector3& fromColor, const btVector3& toColor) 
{ 

    glBegin(GL_LINES); 
     glColor3f(fromColor.getX(), fromColor.getY(), fromColor.getZ()); 
     glVertex3d(from.getX(), from.getY(), from.getZ()); 
     glColor3f(toColor.getX(), toColor.getY(), toColor.getZ()); 
     glVertex3d(to.getX(), to.getY(), to.getZ()); 
    glEnd(); 
} 

ओपन 4.0 में परिवर्तित करने के लिए, मैं एक शीर्ष सरणी वस्तु इस वर्ग के एक सदस्य के रूप में परिभाषित, का उपयोग कर की सोच रहा हूँ mVAO कहना और VBOs भी सदस्य होंगे। मैं सेटअप GLDebugDrawer की ctor में VAO और उसके बाद पैदा करते हैं और drawLine()

drawLine() 
{ 
    // Update buffers 
    // Bind and render the buffer 
} 

भीतर VBO के कोने भेजने के साथ-साथ यह प्रस्तुत करना लेकिन चूंकि मैं कोने भेजने हो जाएगा हर drawLine() कहा जाता हो जाता है, यह होगा ऐसा लगता है कि मैं वीएओ की शक्ति का उपयोग नहीं कर रहा हूं बल्कि बदले में तत्काल मोड को अनुकरण कर रहा हूं!

इस इंटरफ़ेस में लाइन ड्रॉइंग फ़ंक्शन को कार्यान्वित करने का एक बेहतर तरीका क्या होगा जिसका शीर्ष प्रत्येक कॉल में बदल सकता है?

मैं अपने भौतिकी की जांच के लिए बाद में अपने एंड्रॉइड ऐप में इस कोड का उपयोग करना चाहता हूं, इसलिए मैं ओपनजीएल 4.0 में इंटरफ़ेस को फिर से लिख रहा हूं जो मुझे लगता है कि openGLES 2.0 में कनवर्ट करना आसान होगा।

मैं प्रत्येक ड्रॉलाइन() कॉल पर वेक्टर में शिखर रिकॉर्ड करने और फिर बीबीआईडीईबग ड्राव कार्यों में बुलेट की सभी कॉल के बाद VBO को अपडेट करने के बारे में सोच रहा था। तब मुझे GPU को अंतराल के जोड़े को जोड़े जाने की आवश्यकता नहीं होगी क्योंकि बुलेट btIDebugDraw फ़ंक्शंस को कॉल करता है।

मैं यहाँ अब तक शिखर डेटा के प्रबंधन के बारे में कुछ जानकारी मिल गया है: http://developer.apple.com/library/ios/#documentation/3DDrawing/Conceptual/OpenGLES_ProgrammingGuide/TechniquesforWorkingwithVertexData/TechniquesforWorkingwithVertexData.html

+0

ऐसा करने का वास्तव में कोई अच्छा तरीका नहीं है जहां वे आपको एक समय में एक कोष्ठक देते हैं, और वे प्रत्येक फ्रेम को बदलते हैं। यह वैसे भी एक डीबग फ़ंक्शन है, इसलिए मैं बस जैसे ही कर रहा हूं, तत्काल मोड को अनुकरण करना जारी रखूंगा, और डिबग मोड को बंद कर दूंगा, सिवाय इसके कि जब आपको डीबग के लिए इसकी आवश्यकता हो। – Tim

+0

धन्यवाद, फिर मैं डेटा संरचना में अंक एकत्र करके और केवल 1 वीबीओ अपडेट कॉल करके इसे अनुकूलित करने के लिए अपना सर्वश्रेष्ठ प्रयास करूंगा। –

+0

@safe_malloc मैं इसे ओपनजीएल 4.4 में लागू करने की कोशिश भी कर रहा हूं। मेरे "ड्रॉलाइन" फ़ंक्शन में मैं सभी ** ** ** से ** ** ** stcs :: वेक्टर में शीर्ष पर एकत्र करता हूं। फिर उस वेक्टर को वीबीओ में पास करें और मेरे प्रतिपादन समारोह में मैं GL_LINES का उपयोग करके आकर्षित करता हूं। अगले चरण से पहले सिमुलेशन() मैं अपने वेक्टर संरचना और वीबीओ को साफ़ करता हूं। लेकिन मेरा कोड ऐसा लगता है जैसे यह चित्रण नहीं कर रहा है। क्या आपने गिटहब इत्यादि जैसे कहीं अपना कोड सार्वजनिक किया है। यह सहायक होगा। –

उत्तर

5

तुरंत drawLine() पर आकर्षित करते हैं। :)
बजाय होस्ट/रैम में वर्टिसेस/रंगों को एक बफर में दबाएं।

dynamicsWorld->debugDrawWorld() करने के लिए कॉल के बाद, आप जानते हैं कि आपके DebugDrawer, फ्रेम के लिए सभी लाइनों मिल गया तो आप कर सकते हैं:

  1. अद्यतन VBOs एक बार
  2. glDraw ...
  3. स्पष्ट होस्ट बफर
+0

धन्यवाद, हाँ, वही है जो मैं अभी करता हूं। तो वीबीओ को प्रत्येक कॉल पर डीबग ड्राववर्ल्ड() या प्रति फ्रेम अनुमानित करने के लिए अपडेट किया जाता है। मैं बदले गए वर्टिसेस को खोजने और केवल उनको भेजने के लिए वर्टेक्स तुलना करके वीबीओ को भेजे गए डेटा की मात्रा को भी कम कर सकता हूं। –