বাহিনীর সাথে সংঘর্ষের সমাধান করা


14

আমার 2 ডি পদার্থবিজ্ঞানের ইঞ্জিনে, আমি এএবিবি বনাম এএবিবি সংঘর্ষগুলি সনাক্ত করতে পারি এবং সংক্ষিপ্ততম অনুপ্রবেশ ভেক্টর সন্ধান করে এবং এএবিবির অবস্থানটিতে যুক্ত করে এগুলি সমাধান করতে পারি।

এটি করে দ্বিতীয় এএবিবির বাইরে প্রথম এএবিবিকে "ধাক্কা" দেয় তবে বেগ / ত্বরণের পরিবর্তনগুলি একেবারেই মোকাবেলা করে না।

যদি আমি আমার সিমুলেশনে মাধ্যাকর্ষণ ত্বরণ যোগ করি তবে প্রথম গতিশীল এএবিবি-র বেগটি দ্বিতীয় স্ট্যাটিক এএবিবি-র শীর্ষে স্থির থাকা অবস্থায়ও বাড়তে থাকে। অবশেষে, বেগটি খুব বড় হয়ে উঠবে এবং সংঘর্ষটি সনাক্ত করা যাবেনা (গতিশীল এএবিবি স্থির একের মধ্যে দিয়ে যাবে)।

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

আমি অনলাইনে পড়েছি যে পজিশনে বা গতিবেগে ম্যানুয়ালি কাজ করে সংঘর্ষগুলির সমাধান করা সঠিক নয়। আমি বাহিনী বাস্তবায়নের চেষ্টা করেছি (ভর আপাতত "হার্ডকডযুক্ত 1"):

void Body::applyForce(sf::Vector2f mForce) { acceleration += mForce; }

void Body::integrate(float mFrameTime)
{
    velocity += acceleration * mFrameTime;
    position += velocity * mFrameTime;

    acceleration = {0, 0};
}

সংঘর্ষের রেজোলিউশনের সময় যদি আমি স্বল্পতম অনুপ্রবেশ ভেক্টরটিকে বল হিসাবে প্রয়োগ করি তবে গতিশীল এএবিবি স্থিতিশীল থেকে একটি "ধাক্কা মেরে" পেয়ে যাবে তবে এর গতিবেগ মহাকর্ষ ব্যতীত কোনও অনুকরণে হ্রাস পাবে না এবং এটি চিরতরে চলতে থাকবে moving

"অস্থায়ী" বল প্রয়োগ করার কোনও উপায় আছে কি? একটি বাহিনী যা প্রথম এএবিবিটিকে দ্বিতীয় এএবিবি থেকে বের করে দেওয়ার বিষয়ে আলোচনা করে, তখন যখন এএবিবি আর সংঘর্ষ না করে তখন থামবে?

এখানে সম্পূর্ণ উত্স কোড উপলভ্য: https://github.com/SuperV1234/SSVSCollision


1
আমি এতে আগ্রহী আপনি কি এখনও একটি সমাধান নিয়ে এসেছেন?
ট্র্যাভিসজি

@ ট্রাভিসজি: দুর্ভাগ্যক্রমে এখনও হয়নি। আমি কোনও উত্তর না পেলে আগামীকাল একটি অনুগ্রহ যুক্ত করব।
ভিটোরিও রোমিও

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

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

@ ফ্রেতা তার অনুমান ঠিক আছে। তিনি উল্লেখ করেছিলেন যে সমস্ত বস্তুর জন্য তার ভর কেবল আপাতত "1", যা তার কোড বিভাগগুলিকে বৈধ করে তোলে। যাইহোক, যদিও বক্স 2 ডি সরাসরি বেগের সাথে ডিল করতে পারে, তবে এটি অবশ্যই কোনওরকম একই সমস্যাটি মোকাবেলা করতে হবে। যদি বল প্রয়োগের পরিবর্তে, বক্স 2 ডি একটি আবেগ প্রয়োগ করে, তবে কোনওভাবে এখনও এই সত্যটি মোকাবেলা করতে হবে যে বস্তুগুলি পৃথক হয়ে যাওয়ার পরে আবেগটি কেবল চলে যায় না। যদিও, এটি সম্ভব যে এটি বাস্তবে এটির সাথে
কোনওভাবেই কাজ

উত্তর:


13

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


A এবং B দুটি অবজেক্টের আরও সঠিক সংঘর্ষের মডেল মডেল করার দ্রুত উপায়ের জন্য:

  1. সংঘর্ষের ঠিক আগে অবস্থানগুলি সন্ধান করুন। আপনি ইতিমধ্যে এটির কাছাকাছি যাচ্ছেন: "স্বল্পতম অনুপ্রবেশ ভেক্টরটি সন্ধান করে এটিএএবির অবস্থানের সাথে যুক্ত করুন।"
  2. নিউটোনীয় পদার্থবিজ্ঞান ব্যবহার করে সংঘর্ষের ঠিক পরে বেগটি আবিষ্কার করুন :
    • যেহেতু ভর 1 হিসাবে হার্ড-কোডেড রয়েছে, কেবল বেগগুলি অদলবদল করুন (এটি স্ট্যাটিক অবজেক্টগুলির ক্ষেত্রে প্রযোজ্য না যার অবশ্যই অসীম ভর থাকতে হবে):
      • আভ = বু
      • বিভি = আউ
    • যদি A এবং B অবজেক্টের বিভিন্ন ভর থাকে:
      • এভ = (আউ * (এএম - বিএম) + (২ * বিএম * বু)) / (এমএম + বিএম)
      • বিভি = (বু * (বিএম - এমএম) + (২ * এএম * অউ)) / (এমএম + বিএম)
    • কোথায়:
      • v: সংঘর্ষের পরে বেগ
      • u: সংঘর্ষের আগে বেগ
      • মি: ভর (একটি স্থির, স্থির বস্তুর ভর জন্য সর্বাধিক সংখ্যা ব্যবহার করুন)
  3. ত্বরণ 0 তে সেট করুন: সংঘর্ষ থেকে ত্বরণটি ধাপ 2 নম্বরে বেগ গণনা দ্বারা উপরের জন্য গণ্য করা হয়েছিল।

দয়া করে আমার নমুনা গ্রহাণু প্রোগ্রামটি দেখুন যা এই ধারণাগুলি প্রদর্শন করে।


এরপরে, সজ্জিত বস্তুর জন্য অ্যাকাউন্ট:

যেমনটি আপনি উল্লেখ করেছেন, সজ্জিত / বিশ্রামপ্রাপ্ত বস্তুগুলির অনুকরণের জন্য বেগটি ব্যবহার করা ভাল কাজ করে না: বেগ কোনও গতিবেগ যে কোনও বস্তুটি চলমান, তাই যদি এটি কোনও স্থির বস্তুর উপর স্থির থাকে, বেগটি 0 এর কাছাকাছি হওয়া উচিত বলে মনে হয় না increase কোনও বস্তুর গতিবেগ এটি বিশ্রামে প্রদর্শিত হয়:

যদি আমি আমার সিমুলেশনে মাধ্যাকর্ষণ ত্বরণ যোগ করি তবে প্রথম গতিশীল এএবিবি-র বেগটি দ্বিতীয় স্ট্যাটিক এএবিবি-র শীর্ষে স্থির থাকা অবস্থায়ও বাড়তে থাকে। অবশেষে, বেগটি খুব বড় হয়ে উঠবে এবং সংঘর্ষটি সনাক্ত করা যাবেনা (গতিশীল এএবিবি স্থির একের মধ্যে দিয়ে যাবে)।

যা ঘটবে তা হ'ল একটি ত্বরণ শক্তি যা বিপরীত দিকে চলেছে কারণ মাধ্যাকর্ষণ মহাকর্ষটিকে বাতিল করে দেওয়া উচিত। (একে সাধারণ যোগাযোগ বাহিনী বলা হয়)। একটি শর্টকাট হ'ল বাতাসে নেই এমন দেহগুলিতে মহাকর্ষ প্রয়োগ না করা:

  • এটি করার একটি পদ্ধতি হ'ল "ভিত্তিযুক্ত" রাষ্ট্র রাখা:
    • গ্রাউন্ডেড অবস্থায় বস্তুগুলিতে মাধ্যাকর্ষণ প্রয়োগ করবেন না।
    • যদি কোনও বস্তু নীচ থেকে কোনও বস্তুর সাথে সংঘর্ষ হয় এবং এর গতিবেগ খুব সামান্য হয় তবে এটি স্থল অবস্থায় প্রবেশ করে।
    • যখন একটি উল্লম্ব বেগ একটি নির্দিষ্ট ধনাত্মক মানকে ছাড়িয়ে যায় তখন কোনও বস্তু গ্রাউন্ডড স্টেট থেকে প্রস্থান করে।

হালনাগাদ:

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

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

@ ভিউ: ভাল প্রশ্ন! তিনটি + দেহ এবং স্থিতিশীল সংস্থা দুটি পৃথক বিষয়। আমি উভয়কে একটি আপডেটে সম্বোধন করেছি। সংক্ষিপ্তসার: হ্যান্ডেল সংঘর্ষে দুটি জিনিস একবারে; স্থিতিশীল সংস্থাগুলিতে খুব বড়, অসীম ভর থাকে।
লেফটিয়াম

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

16

এই সমস্যাটি সমাধান করার জন্য অবস্থানের সামঞ্জস্য এবং সম্ভবত বেগ প্রয়োজন requires কঠোর বডি পদার্থবিজ্ঞানের ইঞ্জিনগুলির মধ্যে একটি দ্রাবক থাকে যা নিউটনের গতিবিধি ব্যবহার করে সময়মতো এগিয়ে যায় এবং অ অনুপ্রবেশ বাধা এবং ঘর্ষণকেও সমাধান করে। এই ইঞ্জিনগুলি প্লাজেবল ট্র্যাজেক্টরিগুলি তৈরি করতে লিনিয়ার এবং কৌণিক গতির সঠিক সংমিশ্রণ গণনা করতে পারে।

আপনি যদি কেবল ওভারল্যাপটি সমাধান করতে চান তবে আপনি সিউডো বেগগুলি ব্যবহার করতে পারেন যা গতিবেগ না যুক্ত করে পৃথক ট্র্যাজেক্টরিগুলি উত্পন্ন করে। এটি বক্স 2 ডি এর পজিশন সলভারে করা হয়।

আমি 2006 ও 2007-এর জন্য আমার জিডিসির উপস্থাপনাগুলি গ্রহণ করার পরামর্শ দিচ্ছি:

http://code.google.com/p/box2d/downloads/list

এছাড়াও, আপনি সরলীকৃত বাস্তবায়নের জন্য বক্স 2 ডি লাইট দেখতে পারেন।


অবস্থানটিও সামঞ্জস্য করতে প্রয়োজনীয় হওয়ার মন্তব্য করার জন্য +1। খুব কম লোকই এতে লিপ্ত হয় তবে সিমুলেশন স্থায়িত্ব যোগ করতে বেশিরভাগ ইঞ্জিন সরাসরি অবস্থানগুলি সামঞ্জস্য করে প্রতারণা করে। সব মিলিয়ে, যদি এটি কল্পনাযোগ্য হয় তবে এটি গেমসের জন্য কাজ করে।
teodron

উত্তরের জন্য ধন্যবাদ. আমি এমন কিছু জানতে চেয়েছিলাম যা আমি সম্ভবত উপস্থাপনায় মিস করেছি: স্থির দেহগুলি কি বক্স 2 ডি-তে একটি বিশেষ উপায়ে পরিচালনা করা হয়? আমি বলতে চাইছি - যখন একটি গতিশীল দেহ স্থির শরীরে আঘাত করে তখন কী হয়?
ভিটোরিও রোমিও

2

এখানে চিত্র বর্ণনা লিখুন

বাস্তব বিশ্বে, এমন কোনও শক্তি নেই যা অন্য দেহের বাইরে একটি দেহকে "ধাক্কা দেয়" কারণ বস্তুগুলি কখনই একে অপরকে প্রবেশ করে না। নিকটতম জিনিসটি হ'ল স্বাভাবিক শক্তি : বাস্তব-বিশ্বের সংঘর্ষে যোগাযোগের মুহুর্তে তৈরি, এটি প্রথম স্থানে প্রবেশ রোধ করে।

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

যখন স্পষ্টভাবে সাধারণ বলটিকে মডেল করা সম্ভব তবে এটির প্রভাবগুলি মডেল করা সহজ:

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

আমি আমার অন্যান্য উত্তরে এটি কিছুটা আলাদাভাবে বর্ণনা করেছি যা সাধারণভাবে সংঘর্ষের বিষয়ে বেশি

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