সংঘর্ষের ইঞ্জিনটি কীভাবে কাজ করবে?


78

সংঘর্ষের ইঞ্জিনটি ঠিক কীভাবে কাজ করবে?

এটি একটি অত্যন্ত বিস্তৃত প্রশ্ন। কোন কোড জিনিসগুলির একে অপরের বিরুদ্ধে বাউন্স করে রাখে, কোন কোডটি প্লেয়ারটিকে প্রাচীরের মধ্যে দিয়ে হাঁটার পরিবর্তে প্রাচীরের মধ্যে চলে যায়? কোডটি কীভাবে ক্রমাগত গুরুতরতা এবং সংঘর্ষকে যেমন কাজ করা উচিত ততক্ষণ প্লেয়ারদের অবস্থান এবং অবজেক্টের অবস্থানকে রিফ্রেশ করে?

যদি আপনি না জানেন যে একটি সংঘর্ষের ইঞ্জিন কী, মূলত এটি প্ল্যাটফর্ম গেমগুলিতে সাধারণত খেলোয়াড়কে আকস্মিকভাবে দেয়াল এবং তার মতো হিট করতে ব্যবহৃত হয় । এখানে 2 ডি টাইপ এবং 3 ডি টাইপ রয়েছে তবে তারা সকলেই একই জিনিসটি অর্জন করে: সংঘর্ষ।

তাহলে, সংঘর্ষের ইঞ্জিনটি কী টিকিয়ে রাখে?


3
আপনি বাউন্ডিং বাক্স এবং গোলকগুলি দিয়ে প্রতারণা করতে পারেন, যার ছেদটি নির্ধারণ করা দ্রুত। তারপরে আপনি আরও নিবিড়ভাবে পরিদর্শন করতে পারেন। cs.unc.edu/~dm/collision.html en.wikipedia.org/wiki/Collision_detection আপনি সর্বদা একটি সরল আলগোরিদিম সঙ্গে ধীরে ধীরে এটা করতে পারেন। কমপ জ্যামিতিতে কিছু কৌশল রয়েছে যা সমস্যার জ্যামিতিক প্রকৃতির সুযোগ নেয় এবং অ্যালগোরিদমকে আরও দ্রুত করে তোলে। এখানে একটি খুব ভাল কাগজ দেওয়া হয়েছে: cs.hku.hk/research/techreps/docament/TR-2005-01.pdf

একটি কি সংঘর্ষের ইঞ্জিন ?

4
@ সংঘর্ষের ইঞ্জিনটি মূলত গেমগুলিতে (সাধারণত) ব্যবহৃত একটি ইঞ্জিন যাতে আপনার প্লেয়ার (তাকে বব বলে ডাকে), যখনই বব প্রাচীরের মধ্যে চলে যায়, বব থামে, বব প্রাচীরের মধ্যে দিয়ে যায় না। তারা সাধারণত কোনও গেম এবং এর মতো পরিবেশগত জিনিসগুলিতে মহাকর্ষ পরিচালনা করে।
জেএক্সফোনিক্স

উত্তর:


172

একটি সংঘর্ষ ইঞ্জিন এবং একটি পদার্থবিজ্ঞানের ইঞ্জিনের মধ্যে একটি বড় পার্থক্য রয়েছে। তারা একই কাজ করে না, যদিও পদার্থবিজ্ঞানের ইঞ্জিনটি সাধারণত একটি সংঘর্ষের ইঞ্জিনের উপর নির্ভর করে।

সংঘর্ষ ইঞ্জিনটি তারপরে দুটি ভাগে বিভক্ত: সংঘর্ষ সনাক্তকরণ এবং সংঘর্ষের প্রতিক্রিয়া। দ্বিতীয়টি সাধারণত পদার্থবিজ্ঞানের ইঞ্জিনের একটি অংশ। এ কারণেই সংঘর্ষের ইঞ্জিন এবং পদার্থবিজ্ঞানের ইঞ্জিনগুলি একই লাইব্রেরিতে রোল করা হয়।

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

সংঘর্ষ সনাক্তকরণ

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

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

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

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

ম্যানিফোল্ড জেনারেশনের সাথে যোগাযোগ করুন

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

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

শারীরিক প্রতিক্রিয়া

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

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

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

যোগাযোগ ক্যাচিং

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

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

ঘুমন্ত

আর একটি খুব কার্যকর কৌশল হ'ল বস্তুগুলিকে "ঘুমন্ত" হিসাবে চিহ্নিত করা যদি তাদের সাথে যোগাযোগ করা হয় না। ঘুমন্ত বস্তুগুলি পদার্থবিজ্ঞানের আপডেটগুলি পায় না, অন্যান্য ঘুমন্ত বস্তুর সাথে সংঘর্ষ না করে এবং মূলত ঠিক সেখানে হিমায়িত বসে থাকে যতক্ষণ না অন্য ঘুমন্ত বস্তু তাদের সাথে সংঘর্ষ হয়।

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

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

সীমাবদ্ধতাসমূহ

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

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


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

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

1
চমত্কার উত্তর, +1। এটি পড়ার ফলে আমাকে এই অ্যালগোরিদমগুলি বাস্তবায়িত করতে চায়।
মাইলস রাউট

3

সাধারণ সমস্যা: অবজেক্টের সমস্ত সম্ভাব্য সংমিশ্রণের মধ্যে কোনটি ননজারো ছেদ করার পরিমাণ রয়েছে তা নির্ধারণ করুন।

নিষ্পাপ, সাধারণ পদ্ধতিটি সহজ: প্রতিটি সম্ভাব্য বস্তুর জোড়ার জন্য ছেদ করার পরিমাণটি গণনা করুন। এটি সাধারণত ব্যবহারিক নয়, কারণ এটি অপেক্ষাকৃত ব্যয়বহুল ছেদকৃত অপারেশনগুলির জন্য O (n ^ 2) প্রয়োজন।

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


2

আমি যে "সংঘর্ষের ইঞ্জিন" ব্যবহার করেছি তা উপলব্ধি করা অত্যন্ত সহজ বলে মনে হয়েছিল ।

মূলত, এপিআই পদ্ধতিযুক্ত এক ধরণের অবজেক্ট সরবরাহ collidesWithকরে

  1. এর প্যারামিটারগুলি বিভিন্ন ধরণের অবজেক্ট ছিল যা সংঘর্ষের জন্য "যোগ্য" ছিল
  2. এটি সংঘর্ষ হয়েছে কি না তার উপর নির্ভর করে সত্য বা মিথ্যা প্রত্যাবর্তন করেছে
  3. বস্তুগুলির ট্রিগার সংঘর্ষের ইভেন্টের জন্য সমস্ত সীমাবদ্ধ আয়তক্ষেত্র বা কেবল এই আয়তক্ষেত্রগুলির মধ্যে কেবল অস্বচ্ছ পিক্সেল (পিক্সেল-স্তর সনাক্তকরণ) বাছাই করার অনুমতি দেওয়ার বিকল্প ছিল

আমার অ্যাপ্লিকেশনটিতে, আমি ঠিক সময়ে সময়ে collidesWithসংঘর্ষ হয়েছে কিনা তা অনুসন্ধান করার জন্য অনুরোধ করেছি।

খুব সহজ তাই না?


যখন কেবলমাত্র আবদ্ধ আয়তক্ষেত্রগুলি সংঘর্ষক বস্তুর জ্যামিতি অনুকরণের জন্য পর্যাপ্ত ছিল না তখন কেবলমাত্র কল্পনাটির ক্ষুদ্র প্রান্তের প্রয়োজন ছিল। এক্ষেত্রে একজনকে একের পরিবর্তে বেশ কয়েকটি সংঘর্ষযোগ্য বস্তু ব্যবহার করতে হবে।

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

  • শেষ ব্যবহারকারীরা কেবল পর্দার পিছনে কতটি অবজেক্ট রয়েছে তা যত্ন করে না। তারা যতক্ষণ শেষ ফলাফলটি প্রত্যাশা মতো অনুভব করে ততক্ষণ তারা খুশি, যেমন বাড়ির উঠোনের বেড়ার চারপাশে:

    http://i.stack.imgur.com/4Wn5B.jpg


2

আমি মনে করি আপনি যে বিষয়ে কথা বলছেন সে সম্পর্কে আপনি কিছুটা বিভ্রান্ত হয়ে পড়েছেন এবং কয়েকটি ভিন্ন বিষয় নিয়ে কথা বলছেন।

এই আইটেমটি X এর অবস্থান Y থেকে স্থান Y এ স্থানান্তরিত হয়েছে তা বলার ক্ষমতাটি পদার্থবিজ্ঞানের উপর ভিত্তি করে (এটি কীভাবে তারা চলাচল করে এবং কেন তারা সরানো হয় তাও আক্রমণ করে)

সংঘর্ষ সনাক্তকরণের জন্য ব্যবহৃত পদ্ধতিটি আপনার গেমের কাঠামোর ভিত্তিতে নির্ধারিত হয়। যদি আপনার গেমটি একটি বৃহত উন্মুক্ত জগত হয় তবে আপনার স্পেস বিভাজন (কোয়াড-ট্রি [3 ডি এর জন্য অক্ট ট্রি], বিএসপি, একটি traditionalতিহ্যবাহী গ্রিড, বা পুরানো ফ্যাশন টেস্টের সবকিছুই বিবেচনা করা উচিত)

একটি সংঘর্ষ সনাক্তকরণ সিস্টেমটি কার্যকর করার সর্বোত্তম উপায় হ'ল পদক্ষেপে।

  1. সমস্ত বস্তুকে জেনেরিক বাউন্ডিং ভলিউম / আকারে রাখুন এবং তারপরে সেগুলি পরীক্ষা করুন

  2. যদি 1 পাস হয়ে যায় তবে পরম জ্যামিতি পরীক্ষা করার জন্য প্রস্তুত না হওয়া পর্যন্ত আরও জটিল ভলিউম / আকৃতির পুনরাবৃত্তি দিয়ে পুনরাবৃত্তি করুন

  3. পরম জ্যামিতির পরীক্ষা আপনি কত বার ধাপ 2 পুনরাবৃত্তি করবেন তা আপনার আকারগুলির জটিলতা এবং এই আকারগুলি কতটা সঠিক তা নির্ধারণ করা হবে।

এই প্রতিটি পদক্ষেপের প্রতিটি আপনার আগেই আউট হওয়া এবং আপনি যাওয়ার সাথে সংঘর্ষগুলি দূর করার উদ্দেশ্যে বিবেচনা করা উচিত এবং যদি তারা সত্যিই স্পর্শ করে তবে কেবল স্টিপি 3 এ সত্য প্রত্যাবর্তন করা উচিত।

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

প্রথাগত লুপটি দেখতে দেখতে:

receive input
update physics
collision detection
collision resolution
render
repeat

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

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

@ সানমিডলিচ যে আমার উদ্দেশ্য সম্পর্কে আরও ছিল যে প্রায় একটি পরীক্ষার প্রায়শই পরীক্ষা করা হবে সাধারণত অবতল বহুভুজ / পলিহেড্রন পরীক্ষা করা এড়ানোর চেষ্টা করে trying
gardian06

@ কেটিডিসকো এটি চিত্রের অবিচ্ছিন্নতার উপর নির্ভর করে এবং এটি কতটা সঠিক হওয়া দরকার এবং তারপরে পদার্থবিজ্ঞানের ইঞ্জিনের উপর নির্ভর করে পরিবর্তিত হতে পারে এবং সংঘর্ষের সমাধানের জন্য পদার্থবিজ্ঞানের জন্য কী ফিরিয়ে নেওয়া দরকার, এবং এর সঠিক নির্ভুলতার উপর নির্ভর করে প্রতিক্রিয়া
gardian06

@ গার্ডিয়ান06 সিনমিলডিলিচের ব্যাখ্যা অনেক বেশি সম্ভাব্য, যদিও হাজার হাজার বহুভুজ নিয়ে গঠিত অক্ষরের মধ্যে নিখুঁত ছেদগুলির জন্য পরীক্ষা করা এখনও ভাল ধারণা নয়।
কেভিনটোডিসকো

1

গ্রাফিক্স-কার্ড স্তরে (যেখানে আপনি সাধারণত ত্রিভুজগুলি ব্যবহার করছেন) সাধারণ ধারণাটি কোনওভাবেই আপনার দৃশ্যের বিভাজন করা হয় যাতে আপনাকে সমস্ত এন ত্রিভুজ পরীক্ষা করতে হবে না (এটি প্রাক-প্রক্রিয়াজাতকরণ পদক্ষেপ হিসাবে করা যেতে পারে) ), এবং তারপরে আপনি কোন দৃশ্যে রয়েছেন তা নির্ধারণ করুন এবং সেই বিভাগে কেবল সেই 10-50 ত্রিভুজগুলি পরীক্ষা করুন।

আরও তথ্যের জন্য বিএসপি এবং কেডি গাছগুলি দেখুন। বিভাজনের অন্যান্য পদ্ধতিও রয়েছে।


0

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

দ্বিতীয়ত, তবে এটিও গুরুত্বপূর্ণ, অবশিষ্ট পদার্থগুলির বিরুদ্ধে আরও বিশদ (নির্ভুল) ফ্যাশন পরীক্ষা করুন যা প্রথম পদক্ষেপে জড়িত ছিল না।

তৃতীয়ত, চেকগুলি সম্পাদনের জন্য সবচেয়ে দক্ষ / উপযুক্ত পদ্ধতি ব্যবহার করুন।

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