বুলেট পদার্থবিজ্ঞান / ওগ্রে 3 ডি সহ কোনও আরপিজিতে আমি কীভাবে একটি চরিত্র স্থানান্তর করব?


9

ইদানীং আমার ওগ্রে 3 ডি গেমটিতে আমার চরিত্রটি সরিয়ে নিয়ে আমার সমস্যা হচ্ছে। মূলত আমি বুলেটটির RigidBody->translate()ফাংশন দিয়ে চরিত্রটি সরিয়ে নিয়ে যাচ্ছি , তবে যখন এটি করার সময় এবং কোনও প্রাচীরের সাথে ধাক্কা মারার সময় আমি এটির মধ্য দিয়ে কিছুটা এগিয়ে যাই এবং তারপরে ফিরে ফিরে আসি। আমি ভাবছি যে দেয়ালগুলি সহ একটি সাধারণ প্লেন-ধরণের বিশ্বে আমার চরিত্রটি (যার একটি গোলকের সংঘর্ষের আকৃতি রয়েছে) এর চারপাশে সরানোর আরও ভাল উপায় আছে?

আমি যে লাইব্রেরিগুলি ব্যবহার করছি সেগুলির তুলনায় এটি 'ওগ্রে 3 ডি' এবং 'বুলেট ফিজিক্স'।

উত্তর:


9

যদিও আমি বিশেষত বুলেট পদার্থবিজ্ঞানের ইঞ্জিনের সাথে কাজ করি নি, আমি অন্য পদার্থবিজ্ঞানের ইঞ্জিনে খুব অনুরূপ কিছু করেছি। আমি যেভাবে এটি সমাধান করেছি তা ছিল সরাসরি অনুবাদ করার পরিবর্তে অনমনীয় শরীরের রৈখিক বেগ সেট করা set পদক্ষেপ এবং সংঘর্ষগুলি তখন পদার্থবিজ্ঞানের ইঞ্জিন আপডেট পর্যায়ে স্বয়ংক্রিয়ভাবে পরিচালিত হয়।

ডকুমেন্টেশন থেকে মনে হয় এমন কোনও btRigidBody::setLinearVelocityপদ্ধতি রয়েছে যা আপনি ব্যবহার করতে পারেন। সুতরাং উদাহরণস্বরূপ, আপনি যদি কোনও ত্বরণ ঘটতে না চান তবে অক্ষরটি যখনই চলবে তখন কেবল একটি যথাযথ মানের জন্য রৈখিক বেগ সেট করুন এবং অক্ষরটি থামার কথা মনে হওয়ার পরে (0,0,0) এ সেট করুন যখন প্লেয়ার কীটি ছেড়ে দেয়)।

কোন মানগুলি ব্যবহার করতে হবে, সেই জন্য স্বাভাবিক পদ্ধতিটি আপনার চরিত্রের পছন্দসই গতি (ফ্লোট / স্কেলার হিসাবে) দিয়ে শুরু করা হবে এবং তারপরে এটিকে একটি সাধারণ ভেক্টর দিয়ে গুন করুন যা আপনি যে দিকে যেতে চান সেদিকে নির্দেশ করছে। আমি যা দেখতে পাচ্ছি তা থেকে btVector3ক্লাসের ইতিমধ্যে এই সমস্তগুলির জন্য পদ্ধতি রয়েছে।

বিকল্পভাবে, আপনি চরিত্রটিকে একটি সম্পূর্ণ পদার্থবিজ্ঞানের বস্তু হিসাবে বিবেচনা করতে এবং কোনও applyForceবা applyImpulseপদ্ধতি ব্যবহার করে চলন পরিচালনা করতে পারেন । এর ফলে দেহের ত্বরণ ঘটবে, সুতরাং আপনার চরিত্রগুলির গতি হবে এবং ফলাফলগুলি সম্ভবত এইভাবে আরও সুন্দর দেখাবে। তবে আপনাকে কিছু অতিরিক্ত ব্যবস্থা গ্রহণ করা দরকার, উদাহরণস্বরূপ, লিনিয়ার বেগ কখনই একটি নির্দিষ্ট সীমা অতিক্রম করে না তা নিশ্চিত করে, তা বাতা চাপিয়ে বা স্যাঁতসেঁতে / ঘর্ষণ দিয়ে ঘুরে বেড়ানোর মাধ্যমে। সুতরাং এটি প্রয়োগ করা এবং ফিনেটুন করা কিছুটা কঠিন হবে।

উভয় পদ্ধতির সাথে পরীক্ষা করুন এবং তারপরে এমন একটি চয়ন করুন যা আপনার প্রয়োজনের নিকটতম আচরণ করে।


ঠিক আছে, দ্রুত উত্তরের জন্য ধন্যবাদ, আমি এখনই এটি চেষ্টা করে যাচ্ছি।
মোলমাসেপিক

লিনিয়ারভেলসিটির কৌশলটি কমনীয়ের মতো প্রত্যাশার মতো কাজ করেছিল! কিছু সংযোগ ছিল যা আমাকে ঠিক করতে হয়েছিল তবে এটির কাজ 100% উত্তরের জন্য অনেক ধন্যবাদ!
মোলমাসেপিক

9

রেকর্ডের জন্য, পদার্থবিজ্ঞানের সাথে আমার অভিজ্ঞতা চিম্পঙ্ককে 2 ডি গেম ইঞ্জিনে ব্যবহার করছে, তবে আমি নিশ্চিত যে এই ধারণাটি 3 ডি তে রূপান্তরিত করেছে।

আমি ধরে নিচ্ছি যে আপনার চরিত্রটি ওজন সহ এমন একটি পদার্থবিজ্ঞানের শরীর। এটি করার সর্বোত্তম উপায় হ'ল হাঁটার খুব সরলীকৃত সিমুলেশন। এটি এরকমভাবে ভাবুন: আপনি যদি দাঁড়িয়ে থাকেন তবে আপনার পায়ে প্রচুর ঘর্ষণ আছে, তাই আপনি কেবল চারপাশে স্লাইড করবেন না। যখন আপনার চলমান হয়, এটি প্রায় সেই ঘর্ষণটি সরিয়ে ফেলার (যেহেতু আপনি আপনার পা দিয়ে চলাচল প্রতিরোধ করছেন না) এবং দিক নির্দেশিকা প্রয়োগ করার সমতুল্য। আমি বলছি না যে পৃথকভাবে প্রতিটি পা মাটিতে ঠেলাঠেলি করা উচিত - একটি অনমনীয় শরীর যা আপনি চান তা।

  • যখন আপনার চরিত্রটি সক্রিয়ভাবে সরানোর চেষ্টা করছে না, তখন তাদের গতিবেগকে স্যাঁতসেঁতে উচ্চ করে তুলুন যাতে তারা স্থির থাকে।
  • যখন আপনার চরিত্রটি চলমান থাকে, তাদের বেগটি স্যাঁতসেঁতে কমিয়ে নিন এবং চলাফেরার পথে একটি শক্তি প্রয়োগ করুন। আপনার স্যাঁতসেঁতে এবং বল সেট করুন যাতে অক্ষরটি যুক্তিসঙ্গত গতিতে চলে আসে।
  • চরিত্রটি যদি বাতাসে থাকে তবে স্যাঁতস্যাঁতে খুব, খুব কম সেট করুন। আপনি যদি বাস্তববাদী হতে চান তবে বায়ুতে থাকাকালীন তাদের দিক পরিবর্তন করতে কোনও শক্তি প্রয়োগ করার অনুমতি দিবেন না। আপনি এখানে এয়ারপায় থাকাকালীন তাদের ট্র্যাজেক্টোরি সামঞ্জস্য করার কিছুটা সীমাবদ্ধ ক্ষমতা দিয়ে তাদেরকে আরও ছোট বল প্রয়োগ করার অনুমতি দিয়ে এখানে একটি সুখী মাধ্যমকে আঘাত করতে পারেন।

এখানে কিছুটা জটিল হয়ে ওঠার জন্য এখানে:

  • যদি চরিত্রটি ইতিমধ্যে চলমান হয় এবং তারা দিক পরিবর্তন করে তবে আপনি যে দিকটিতে বল প্রয়োগ করেছেন সেটিকে সামঞ্জস্য করে আপনার গতির প্রতিদান দিতে হবে। উদাহরণস্বরূপ, যদি আপনার চরিত্রটি উত্তর দিকে চলতে থাকে এবং পূর্বদিকে ঘুরতে থাকে তবে আপনাকে অক্ষরটির বর্তমান ভ্রমণের দিকনির্দেশ এবং তাদের ভ্রমণের অভিযুক্ত দিকের বিপরীতমুখী দিকের অর্ধেক পথ দিয়ে আপনার বল প্রয়োগ করতে হবে। ভ্রমণের দিকটি পরিবর্তনের সাথে সাথে, বলটি সামঞ্জস্য করুন যাতে এটি সর্বদা দুজনের মধ্যে অর্ধেক পথ হয়ে যায় এবং আপনার চরিত্রটি দ্রুত এবং স্বাচ্ছন্দ্যে দিকনির্দেশ পরিবর্তন করে।

আপনি যদি আপনার বাহিনীটির সুর ও সঠিকভাবে স্যাঁতস্যাঁতে থাকেন তবে একটি বল প্রয়োগ করা সর্বদা আপনাকে সবচেয়ে বাস্তব ফলাফল দেয়, বিশেষত যদি চরিত্রটি চারপাশে কোনও জিনিসকে ঠেলে দিচ্ছে। অনুবাদ করা এটি করার সবচেয়ে খারাপ উপায় হতে চলেছে, যেহেতু পদার্থবিজ্ঞানের ইঞ্জিন সত্যই এটিকে চলাচল হিসাবে বিবেচনা করে না। সরাসরি বেগ নির্ধারণ করা কিছুটা ভাল তবে আমার অভিজ্ঞতায় বল প্রয়োগ এবং স্যাঁতসেঁতে ব্যবহার করে সর্বোত্তম ফলাফল পাওয়া যায়।

আশা করি আমি এটি যথেষ্ট ভাল ব্যাখ্যা করেছি। আপনার স্পষ্টতা দরকার কিনা তা নির্দ্বিধায় জিজ্ঞাসা করুন। :)


0

বুলেট ২.8787-এর জন্য এটি সঠিক পদ্ধতিতে একটি টিক কলব্যাক থাকা উচিত যা অভ্যন্তরীণ সিমুলেশন আপডেট হারে (সম্ভবত বেশিরভাগ হার্জ হার্টের 100) আপডেট হয় এবং কাইনমেটিক সংস্থাগুলিতে সেট ওয়ার্ল্ড ট্রান্সফর্ম () সহজেই অবস্থান আপডেট করে:

এই অংশটি ম্যানুয়ালটিতে রয়েছে:

// set the rigid body as kinematic
rigid_body->setCollisionFlags(
    rigid_body->getCollisionFlags() | btCollisionObject::CF_KINEMATIC_OBJECT);
rigid_body->setActivationState(DISABLE_DEACTIVATION);
...

এই অংশটি বের করা আরও জটিল ছিল:

void externalTickCallback(btDynamicsWorld *world, btScalar timeStep)
{
  // get object passed into user data point
  Foo* foo = static_cast<Foo*>(world->getWorldUserInfo());
  ... loop through all the rigid bodies, maybe foo has them
  {
    if (rigid_body->getCollisionFlags() & btCollisionObject::CF_KINEMATIC_OBJECT)
    {
      btVector3 kinematic_linear_vel = ... // get velocity from somewhere
      btTransform trans;
      rigid_body->getMotionState()->getWorldTransform(trans);
      trans.setOrigin(trans.getOrigin() + kinematic_linear_vel * time_step);
      // TODO support angular velocity
      rigid_body_->getMotionState()->setWorldTransform(trans);
    }
  }
}
...
my_dynamics_world->setInternalTickCallback(tickCallback, static_cast<void*>(this), true);

এটি ছিল বিটিআরজিডবডি এইচ https://github.com / বুলেটফিজিক্স / বুলেট 3/blob/master/src/BulletDynamics/ ডায়নামিকস / বিটিগ্রিগডবডি এইচ : র সহায়ক ডকুমেন্টেশন

/// - সি) গতিময় বস্তু, যা ভর ব্যতীত বস্তু, তবে ব্যবহারকারী সেগুলি সরাতে পারে। ওয়ান-ওয়ে ইন্টারঅ্যাকশন রয়েছে এবং বুলেট টাইমস্টেপ এবং পূর্ববর্তী এবং বর্তমান বিশ্বের রূপান্তরের উপর ভিত্তি করে একটি বেগ গণনা করে।

setLinearVelocity () গতিযুক্ত বস্তুর জন্য কাজ করে না (সম্ভবত এটি পূর্ববর্তী সংস্করণগুলিতে ব্যবহৃত হত?) তবে ডায়নামিক্স ওয়ার্ল্ড সেট ওয়ার্ল্ড ট্রান্সফর্ম () বোঝে এবং গতিময় বস্তুতে লাইনারওয়েলোসিটি () -র কাছে কলগুলি কল কলব্যাকের সেট সেটটি ফিরিয়ে দেবে (যদি সম্ভবত সেই গতিবেগগুলি অভ্যন্তরীণ টিক থেকে টিকের দিকে পরিবর্তিত হয়) তবে এটি সম্ভবত গড়ে ফিরে আসবে।

https://github.com/bulletphysics/bullet3/issues/1204 - ইস্যু পোস্টারের সঠিক ধারণা আছে তবে প্রতিক্রিয়া সহায়ক নয়।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.