2 ডি কোণার সংঘর্ষগুলি কীভাবে মোকাবেলা করতে হবে?


22

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

যখনই আমার প্লেয়ার স্প্রাইট চরিত্রটি এমন একটি অবস্থানে চলে যাওয়ার চেষ্টা করে যেখানে এর সীমানা প্রাচীরের প্রান্তের সাথে ছেদ করে, আমি একটি বাউন্স কোণ খুঁজে পাই (ঘটনার কোণ = প্রতিবিম্বের কোণ) এবং আমি প্লেয়ারটিকে প্রাচীর থেকে বাউন্স করে সংঘর্ষ এড়াতে সক্ষম করি make ।

আমার স্প্রাইটের সাথে দুটি প্রাচীর প্রান্তকে একই সাথে ছেদ করার পরিস্থিতিটি কীভাবে মোকাবেলা করতে হবে তা বুঝতে আমার সমস্যা হচ্ছে যদিও এটি কোনও কোণে আঘাত করে।

কোণার সংঘর্ষ

আমার কোডটি বর্তমানে আমাকে বলেছে যে দুটি প্রাচীরের প্রান্তটি ছেদ করা হয়েছে তবে কোন প্রান্তটি এটি প্রথমে আঘাত করবে এবং তাই কোন প্রান্তটি ছুঁড়েছিল।

কোন প্রান্তটি বাউন্স অফ করতে বাছাই করার জন্য গাণিতিক পরীক্ষা কী? এটি দেখার সময় এটি দেখতে সহজ তবে আমি এটির জন্য গণিত পরীক্ষাটি বের করার জন্য সংগ্রাম করছি।



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

উত্তর:


9

যদি আপনি গণনা করেন যে Wallপ্রভুর দিকে কতদূর Player Spriteচলে গিয়েছে, আপনি সম্ভবত একে একে ছেদকারী কোণগুলির x এবং y স্থানাঙ্কের ব-দ্বীপে ভিত্তি স্থাপন করতে পারেন। আমি আশা করি যে এটি বোধগম্য, আমি এটি শব্দটির আরও ভাল উপায় সম্পর্কে ভাবতে পারি না।

সুতরাং, উদাহরণস্বরূপ, যদি আপনি আপনার চিত্রটি দেখুন। (সরানোর পরে) xউপরের বাম কোণার মানটি ধরুন Player Spriteএবং xএর নীচের ডান কোণটির মান বিয়োগ করুন Wallyমানগুলির জন্য একই জিনিস করুন এবং তারপরে দেখুন কোনটি বড়। মূলটি হ'ল যদি একটি অন্যটির চেয়ে বড় হয় তবে Player Spriteসম্ভবত সেই দিকটি ছেদ করা হয়।

এখানে একটি চিত্রের উদাহরণ দেওয়া হয়েছে (এটি আমার নিজস্ব লাইন যুক্ত আপনার ইমেজের একটি সাবকশন):

ছেদ উদাহরণ

এখন, আপনি এখানে দেখুন যে নীল রেখাটি সবুজ রেখার চেয়ে বড়। এক্ষেত্রে নীল রেখাটিও সেই দিকে রয়েছে যেটি Player Spriteপ্রত্যাশিত হবে।

দুটি মান সমান হলে তারা ডানদিকে কোণায় আঘাত করে hit

এখন, এইভাবে এটি করার ক্ষেত্রে কিছুটা সমস্যা আছে। যদি Player Spriteখুব দ্রুত ভ্রমণ হয় বা সংঘর্ষটি কোণার খুব কাছাকাছি থাকে, তবে এটি Player Spriteসম্ভবত Wallভুল দিকের দিকে আরও যেতে পারে । সেক্ষেত্রে আপনাকে সম্ভবত চলমান বস্তুর বেগ পরীক্ষা করতে হবে। ( নাথান রিডের উত্তর দেখুন ))

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


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

@ টেরিবি - আবর্তন এতে কিছুটা জটিলতা যুক্ত করে। আপনি অক্ষ-সংযুক্ত বাউন্ডিং বাক্সগুলিতে (এএবিবি) পড়তে চাইতে পারেন। মূলত, আপনি এখনও উপরের মতো একই নীতিটি ব্যবহার করেন যা ঘোরানো বস্তুটি উপযুক্ত হবে সেই ক্ষুদ্রতম বাক্সটি পরীক্ষা করে, তবে যার অক্ষটি কার্তেসিয়ান অক্ষের সাথে সংযুক্ত থাকে। কল্পনা করুন যদি আপনার কোনও বর্গক্ষেত্র থাকে এবং আপনি এটি হীরা তৈরি করতে 45 ​​ডিগ্রি ঘোরান। এতে সংঘর্ষের গণনা করা কঠিন এবং ব্যয়বহুল হবে, তাই প্রথমে এটিএবিবি ব্যবহার করে বস্তুটি এমনকি তার কাছাকাছি রয়েছে কিনা তা পরীক্ষা করে দেখুন যা হীরাটির প্রতিটি বিন্দু মাঝখানে প্রতিটি পাশকে স্পর্শ করে a
রিচার্ড মার্স্কেল -

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

1
-১ যেহেতু ন্যূনতম স্থানচ্যুতি সর্বদা "কোন প্রান্তটি প্রথমে সংঘর্ষ হয়েছিল" এর সঠিক উত্তর দেয় না; আমার উত্তর দেখুন।
নাথান রেড

@ নাথানরিড - এ কারণেই আমি আমার "এখন, এইভাবে এটি করার সাথে কিছুটা সমস্যা আছে" অনুচ্ছেদে গতিবেগ পরীক্ষা করার বিষয়টি উল্লেখ করেছি।
রিচার্ড মার্স্কেল - ড্র্যাকির

15

সর্বনিম্ন স্থানচ্যুতি সর্বদা সঠিক উত্তর দেয় না যার জন্য প্রথমে কোন প্রান্তটি আঘাত করা হয়েছিল। এই ক্ষেত্রে বিবেচনা করুন:

সংক্ষিপ্ত-স্থানচ্যুতি অ্যালগরিদম বিরতি কেস

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

timeXCollision = (player.left - wall.right) / -player.velocity.x
timeYCollision = (wall.bottom - player.top) / player.velocity.y

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


1
আপনার দুটি ভেরিয়েবল কীভাবে কার্যকর করা যেতে পারে তার একটি উদাহরণ দিতে পারেন?
বজারকেকে

1

আপনার স্যাট সংযোগ সনাক্তকরণ প্রয়োজন

মূলত আপনাকে ন্যূনতম স্থানচ্যূত ভেক্টরের সন্ধান করতে হবে যা অবজেক্টগুলির মধ্যে একটির পরিবর্তিত হয় এবং তাদের কোনও ছেদ না দেয়।

আপনার ছবিতে সর্বনিম্ন স্থানচ্যুতি কমলা অংশ।

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


4
-১ যেহেতু ন্যূনতম স্থানচ্যুতি সর্বদা "কোন প্রান্তটি প্রথমে সংঘর্ষ হয়েছিল" এর সঠিক উত্তর দেয় না; আমার উত্তর দেখুন।
নাথান রিড

কে জিজ্ঞাসা করছে?
ব্লু

প্রশ্ন এটি জিজ্ঞাসা করা হয়। "আমার কোডটি বর্তমানে আমাকে বলেছে যে দুটি প্রাচীরের প্রান্ত ছেদ করা হয়েছে তবে এটি কোন প্রান্তটি প্রথমে আঘাত করতে পারে এবং তাই কোন প্রান্তটি ছুঁড়ে ফেলা উচিত।"
নাথান রিড

প্রথম? সমস্যাটি প্রথমটি নয়, এটি একই সাথে দুটি প্রান্তের সাথে সংঘর্ষ হয়, ... ব্যাপারটি কোন প্রান্তটি ছুঁড়ে মারতে হবে, আপনি একটি পদ্ধতি বেছে নিয়েছেন যা আপনার পক্ষে ভাল, আমি একটি পদ্ধতি বেছে নিয়েছি যা আমার পক্ষে ভাল, উভয়ই বৈধ
ব্লু

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

0

একটি অনুরূপ প্রশ্নের উত্তর এখানে

আপনি পূর্ববর্তী অবস্থানগুলি পরীক্ষা করে বিবেচনা করতে পারেন -

উদাহরণস্বরূপ: যদি আপনার বাম দিকটি আগে তাদের ডান পাশের ডানদিকে ছিল এবং আপনি সংঘর্ষ করছেন তবে ডান হাতের সংঘর্ষ ঘটেছে।

আপনি যদি এটি করেন, কেবল y অক্ষের সংঘর্ষগুলি সমাধান করুন, আপনি কোনও কিছুর সাথে সংঘর্ষ করছেন কিনা তা পরীক্ষা করুন, তারপরে এক্স অক্ষের সংঘর্ষগুলি সমাধান করুন।

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