বুলেট পদার্থবিজ্ঞানের ইঞ্জিনে কীভাবে ওয়াই-অক্ষটি চলাচল অক্ষম করবেন


11

ওয়াই-অক্ষ অক্ষম রাখার সময় আমি এক্স এবং জেড অক্ষের সাথে কেবল চলার চেয়ে একটি অবজেক্ট তৈরি করতে চাই (এটি 2D তে চলার মতো এবং অবজেক্টটি নিচে পড়ে যাবে না)।

আমি বর্তমানে ওয়াই-অক্ষগুলিতে চলাচলকে সীমাবদ্ধ করতে একটি 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);

ধন্যবাদ!


হয়তো এই সহায়তা করবে: bulletphysics.org/Bullet/phpBB3/... , সম্ভবত এছাড়াও, 0 Y- অক্ষ জন্য নিম্ন / উচ্চ সীমা সেট 1. পরিবর্তে
deceleratedcaviar

উত্তর:


20

বুলেটে এটি অর্জনের পছন্দের উপায় হ'ল লিনিয়ার ফ্যাক্টর এবং সম্ভবত শরীরের প্রশ্নে কৌণিক গুণক নির্ধারণ করা। এই পদ্ধতিটি বুলেট উইকি পৃষ্ঠায় কোড স্নিপেট হিসাবে উপস্থাপিত হয় ।

কেবল Y- অক্ষের সাথে চলাচলের অনুমতি দেওয়ার জন্য আপনি এই জাতীয় কিছু ব্যবহার করবেন:

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

যদি আপনি অতিরিক্তভাবে কোনও নির্দিষ্ট অক্ষের চারপাশে ঘূর্ণন অক্ষম করতে চান তবে আপনি একই পদ্ধতিটি ব্যবহার করেন, তবে setAngularFactorপরিবর্তে ফাংশনটি ব্যবহার করেন।

ইন এই সহজ উদাহরণ ভিডিও আমি Y- অক্ষ বরাবর নিষ্ক্রিয় আন্দোলন করার জন্য নিম্নলিখিত দুটি কল ব্যবহার করেছেন এবং প্রায় শুধুমাত্র Y- অক্ষ ঘূর্ণন অনুমতি দেয়। এটি কার্যকরভাবে শরীরকে XZ- বিমানের মধ্যে থাকতে বাধ্য করে যেখানে এটি প্রাথমিকভাবে তৈরি করা হয়েছিল।

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

2

এটি করার একটি উপায় হ'ল ফিজিক্সের টিক কলব্যাক তৈরি করা। এটিকে অভ্যন্তরীণভাবে প্রতিবার বুলেট টিক দেওয়া হবে। এই কল ব্যাকটিতে আপনি Y এর গতিবেগকে 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);
} 

আপনি এখানে সিমুলেশন টিক কলব্যাক সম্পর্কে আরও পড়তে পারেন ।


ধন্যবাদ! এটি দুর্দান্ত উত্তর, যেহেতু এটি জবি বুলেট এর জাভা বন্দরেও প্রযোজ্য (অন্য উত্তরগুলির মতো নয়)।
joehot200
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.