बुलेट भौतिकी इंजन में Y- अक्ष आंदोलन को अक्षम कैसे करें


11

मैं केवल X और Z अक्षों के साथ ले जाने वाली वस्तु बनाना चाहता हूं, जबकि Y- अक्ष को निष्क्रिय रखते हुए (यह 2D में गति की तरह है, और वस्तु नीचे नहीं गिरेगी)।

मैं वर्तमान में Y- अक्ष में गति को प्रतिबंधित करने के लिए 6 डॉफ़ बाधा का उपयोग कर रहा हूं, लेकिन यह काम नहीं कर रहा है:

btRigidBody* zeroBody = new btRigidBody(0, NULL, NULL); // Create the body that we attach things to
btRigidBody* robot = mCarChassis->getBulletRigidBody();

btGeneric6DofConstraint* constrict = new btGeneric6DofConstraint(*robot, *zeroBody, btTransform::getIdentity(), btTransform::getIdentity(), false);

constrict->setLinearLowerLimit( btVector3( 1, 1, 1));
constrict->setLinearUpperLimit( btVector3(-1, 1,-1));

constrict->setAngularLowerLimit( btVector3( 1,  1,  1) );
constrict->setAngularUpperLimit( btVector3(-1, -1, -1) );

mBulletWorld->getBulletDynamicsWorld()->addConstraint(constrict);

धन्यवाद!


शायद यह मदद करेगा: बुलेटफिज़िक्स.org / Bletlet / phpBB3 / , शायद 1 के बजाय Y- अक्ष के लिए लोअर / अपर लिमिट्स भी सेट करें।
deceleratedcaviar

जवाबों:


20

बुलेट में इसे प्राप्त करने का पसंदीदा तरीका रैखिक कारक और संभवतः शरीर में प्रश्न के लिए कोणीय कारक निर्धारित करना है । इस पद्धति को बुलेट विकी पृष्ठ पर एक कोड स्निपेट के रूप में प्रस्तुत किया गया है ।

केवल Y- अक्ष के साथ आंदोलन की अनुमति देने के लिए, आप कुछ इस तरह का उपयोग करेंगे:

body->setLinearFactor(btVector3(0,1,0));

यदि आप अतिरिक्त रूप से किसी विशेष अक्ष के चारों ओर रोटेशन को अक्षम करना चाहते हैं, तो आप उसी प्रक्रिया का उपयोग करते हैं, लेकिन setAngularFactorइसके बजाय फ़ंक्शन का उपयोग कर रहे हैं ।

में इस सरल उदाहरण वीडियो मैं वाई अक्ष के साथ अक्षम आंदोलन के क्रम में निम्न दो कॉल का इस्तेमाल किया है और चारों ओर केवल Y- अक्ष रोटेशन अनुमति देने के लिए। यह प्रभावी रूप से शरीर को एक्सजेड-प्लेन में बने रहने के लिए मजबूर करता है जिसमें इसे शुरू में बनाया गया था।

body->setLinearFactor(btVector3(1,0,1));
body->setAngularFactor(btVector3(0,1,0));

2

ऐसा करने का एक तरीका भौतिकी टिक टिक बनाने के लिए है। इसे हर बार बुलेट टिक्स को आंतरिक रूप से कहा जाएगा। इस कॉल बैक में आप वाई वेग को 0 पर सेट कर सकते हैं, प्रभावी रूप से वाई मूवमेंट को अक्षम कर सकते हैं। यह कुछ इस तरह दिखेगा:

void myTickCallback(const btDynamicsWorld *world, btScalar timeStep) {
    //robotBody is the btRigidBody you want to constrain the movement of
    btVector3 velocity = robotBody->getLinearVelocity();
    robotBody->setLinearVelocity(velocity.x, 0, velocity.z);
} 

आप यहां सिमुलेशन टिक कॉलबैक के बारे में अधिक पढ़ सकते हैं ।


धन्यवाद! यह एक महान उत्तर है, क्योंकि यह JBullet के जावा पोर्ट पर भी लागू होता है (अन्य उत्तर के विपरीत)।
joehot200
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.