কীভাবে 2 ডি টাইলড গেমের দর্শনীয় অঞ্চলটি গণনা করবেন?


24

আমার টাইলসের একটি ম্যাট্রিক্স রয়েছে, সেই টাইলগুলির কিছুতে বস্তু রয়েছে। আমি কোন টাইলস খেলোয়াড়ের জন্য দৃশ্যমান এবং কোনটি নয় তা গণনা করতে চাই এবং আমার এটি বেশ দক্ষতার সাথে করা দরকার (সুতরাং আমার কাছে বড় ম্যাট্রিক (100x100) এবং প্রচুর অবজেক্ট থাকা সত্ত্বেও এটি যথেষ্ট পরিমাণে গণনা করবে)।

আমি ব্রেসেনহ্যামের লাইন অ্যালগরিদম দিয়ে এটি করার চেষ্টা করেছি , তবে এটি ধীর ছিল। এছাড়াও, এটি আমাকে কিছু ত্রুটি দিয়েছে:

----XXX-        ----X**-     ----XXX-
-@------        -@------     -@------
----XXX-        ----X**-     ----XXX-
(raw version)   (Besenham)   (correct, since tunnel walls are 
                              still visible at distance)

(@ is the player, X is obstacle, * is invisible, - is visible)

আমি নিশ্চিত যে এটি করা সম্ভব - সর্বোপরি, আমাদের নেটহ্যাক, জাংব্যান্ড রয়েছে এবং তারা সকলেই এই সমস্যাটি কোনওভাবেই মোকাবেলা করেছেন :)

আপনি কি জন্য অ্যালগরিদম সুপারিশ করতে পারেন?


আমার প্রয়োজনের জন্য, আমি এটির মতো দৃশ্যমানকে সংজ্ঞায়িত করব : টাইলটি দৃশ্যমান হয় যখন টাইলের কমপক্ষে একটি অংশ (উদাহরণস্বরূপ কোণে) প্লেয়ার টাইলের কেন্দ্রের সাথে একটি সরল রেখার সাথে সংযুক্ত করা যায় যা কোনও বাধা ছেদ করে না।


1
উফফফফ, আমার ভুল,
নেটহ্যাক

কিছু পুরানো ধারণাগুলি fadden.com/tech/fast-los.html এ পাওয়া যাবে , যদিও সেই দিনগুলিতে ফিরে আসে যখন সিপিইউগুলি বেশ ধীর এবং ভাসমান পয়েন্ট গণনা ভাল কিছু এড়ানো হত।
ad

উত্তর:


10

আপনার দৃশ্যমান সংজ্ঞাটি নিম্নলিখিত:

টাইল দৃশ্যমান হয় যখন টাইলের কমপক্ষে একটি অংশ (যেমন কোণার) একটি সরল রেখার সাথে প্লেয়ার টাইলের কেন্দ্রের সাথে সংযুক্ত হতে পারে যা কোনও বাধা ছেদ করে না which

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

  1. আপনি যে অ্যালগরিদম দিতে চান তা নির্ভুলতার স্তরটি উল্লেখ করুন। এটি আপনার শনাক্তকরণের রশ্মির সংখ্যা হবে।
  2. প্রতিটি রশ্মির মধ্যে কত ডিগ্রি ঘোরানো হবে তা জানতে নির্বাচিত নির্ভুলতার দ্বারা পূর্ণ 360 ডিগ্রি বৃত্ত ভাগ করুন।
  3. 0 ডিগ্রি থেকে শুরু করে এবং দ্বিতীয় ধাপে নির্ধারিত পরিমাণে বৃদ্ধি করা, প্লেয়ার টাইলের কেন্দ্রে উত্স সহ একটি রশ্মি তৈরি করুন এবং বর্তমান কোণ দ্বারা নির্ধারিত দিকটি তৈরি করুন।
  4. প্রতিটি রশ্মি জন্য, খেলোয়াড় টালি থেকে শুরু, পদব্রজে ভ্রমণ রশ্মি দিক বরাবর যতক্ষণ না আপনি একটি বাধা টালি আঘাত। দৃশ্যমান টাইল তালিকায় সেই টাইলটি যুক্ত করুন এবং পরবর্তী রশ্মির দিকে এগিয়ে যান। কোনও ধরণের সংঘর্ষ না পাওয়া গেলে আপনি "ছেড়ে দিতে" সর্বাধিক দূরত্ব যোগ করতেও পারেন want

এখানে একটি ছবি 3 উদাহরণস্বরূপ রশ্মি দেখায়। গা colored় বর্ণের টাইলগুলি প্রতিটি রশ্মির "ফলাফল", যেখানে সংঘর্ষ হয়েছিল। আপনার চেনাশোনা জুড়ে এটি পুনরাবৃত্তি করা দরকার যদিও:

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

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

সম্পাদন করা

আপনাকে অ্যালগরিদমের ছেদ বিট বাস্তবায়নে সহায়তা করতে বিশেষ ধাপ 3 এবং চতুর্থ ধাপে রাইকাস্টিং সম্পর্কিত নিম্নলিখিত টিউটোরিয়ালটি দেখুন Check

http://www.permadi.com/tutorial/raycast/rayc7.html


আমি কি প্রতিটি রশ্মিকে একটি নির্দিষ্ট দূরত দিয়ে কেবল "হাঁটাচলা" করতে পারি (বলুন, ০. 0.3 পয়েন্ট) বা আমার প্রতিটি রশ্মিতে বেসেনহামের অ্যালগরিদমের মতো কিছু চালানোর দরকার আছে?
রোগাচ

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

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

@ হোলিব্ল্যাকগ্যাট - যদি আপনি সমস্ত দিক থেকে এমনকি কোণে রশ্মি প্রেরণ করেন তবেই এটি ঘটবে। তবে আপনি এই রশ্মির বেশিরভাগ প্রেরণ এড়াতে পারেন এবং কেবল আপনার দৃশ্যের শেষ প্রান্তে ফেলে দিতে পারেন। এখানে একটি ভাল ব্যাখ্যা: redblobgames.com/articles/visibility
রোগাচ

8

আমি বরং চোখের রে এর পরিবর্তে ছায়ার রশ্মি নিক্ষেপ করব।

আসুন বলি এটি আপনার দেখার অঞ্চল (সম্ভাব্য দৃশ্যমান অঞ্চল)

######################
#####.............####
###................###
##..................##
#....................#
#....................#
#..........@.........#
#....................#
#....................#
##..................##
###................###
#####.............####
######################

# টি ব্লকটি দৃশ্যমান নয় যখন। দৃশ্যমান হয়

এক্স কিছু বাধা রাখা যাক:

######################
#####.............####
###................###
##.....X.....XXX....##
#......X.......X.....#
#...X.XX.............#
#...X......@.........#
#...X..........X.....#
#...XXXXXX...........#
##..................##
###....X...........###
#####.............####
######################

আপনার কাছে এক্সের একটি তালিকা রয়েছে যা দেখার ক্ষেত্রের মধ্যে রয়েছে তারপরে আপনি এই প্রতিবন্ধকের প্রতিটিটির পিছনে থাকা প্রতিটি টাইলকে লুকিয়ে রেখে চিহ্নিত করেছেন: যখন কোনও বাধা লুকানো হিসাবে চিহ্নিত করা হয়, আপনি তালিকা থেকে সরিয়ে ফেলুন।

######################
#####.............####
###................###
##.....X.....XXX....##
#......X.......X.....#
#...X.XX.............#
#...X......@.........#
#...X..........X.....#
#...XXXXX*...........#
##......##..........##
###....*#..........###
#####.###.........####
######################

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

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

আপনি একবারে এক্স এর ব্লক চেক করতে "নেভাল ব্যাটেলস" অ্যালগরিদম ব্যবহার করতে পারেন (মূলত একটি অ্যাডিয়াসেন্ট এক্স এর সন্ধান যা একটি ছায়া শঙ্কুকে আরও প্রশস্ত করতে পারে)

[Edit]

সঠিকভাবে একটি ছায়া castালাই করার জন্য দুটি রশ্মির প্রয়োজন হয় এবং যেহেতু একটি টালি আয়তক্ষেত্রাকার হয় তাই উপলব্ধ প্রতিসাম্য ব্যবহার করে প্রচুর অনুমান করা যায় done

বাধা টাইলের চারপাশে একটি সাধারণ স্পেস পার্টিশন ব্যবহার করে রশ্মি স্থানাঙ্কগুলি গণনা করা যেতে পারে:

স্থান বিভাজন উদাহরণ

প্রতিটি আয়তক্ষেত্রাকৃতির অঞ্চলটি টাইলের কোণার কোনটি ছায়া শঙ্কু প্রান্ত হিসাবে নেওয়া উচিত সে সম্পর্কে একটি পছন্দ গঠন করে।

একাধিক সংলগ্ন টাইলস সংযোগ করতে এই যুক্তিটিকে আরও এগিয়ে দেওয়া যেতে পারে এবং অনুসরণ হিসাবে তাদের একটি একক প্রশস্ত শঙ্কু castালতে দিন।

প্রথম পদক্ষেপটি পর্যবেক্ষকের দিকের দিকে কোনও প্রতিবন্ধকতা না রয়েছে তা নিশ্চিত করা, সেক্ষেত্রে নিকটতম বাধা পরিবর্তে বিবেচিত:

নিকটতম বাধা চয়ন করুন

যদি হলুদ টাইল বাধা হয় তবে টাইলটি নতুন লাল টাইল হয়।

এখন উপরের শঙ্কু প্রান্তটি বিবেচনা করুন:

প্রার্থী টাইলস

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

সবুজ টালি কেবলমাত্র প্রার্থী যদি পর্যবেক্ষক কমলা লাইনের উপরে থাকে তবে:

বর্ধিত চেক

একইটি অন্য কিরণের জন্য এবং লাল বাধা সম্পর্কে পর্যবেক্ষকের অন্যান্য অবস্থানগুলির জন্য দাঁড়িয়েছে।

অন্তর্নিহিত ধারণাটি প্রতিটি শঙ্কু ingালাইয়ের পক্ষে যতটা সম্ভব অঞ্চল কভার করা এবং চেক করতে বাধাগুলির তালিকা যত দ্রুত সম্ভব সংক্ষিপ্ত করা।


আকর্ষণীয় পদ্ধতির এবং এটির বিয়োগাত্মক প্রকৃতির কারণে সম্ভবত আরও ভাল ধারণা। এটি পড়ার পরে আমি সম্ভবত এটিও এইভাবে প্রয়োগ করতাম।
ডেভিড গওভিয়া

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

এই সমস্যাটি "লুকানো" সংজ্ঞা থেকে আসে: যখন কোনও রশ্মি টাইলকে ছেদ করে তখন এটি প্রায় (প্রায়) কখনই পুরোপুরি আবরণ করে না। লাইন বিভাগগুলি রেন্ডার করার সময় একই সমস্যাটি আলিয়াসিংয়ের সাথে সমাধান করা হয়। ব্যক্তিগতভাবে আমি মনে করি যে একটি টাইল গোপন করা হয়েছে যখন এর প্রধান অংশটি coveredাকা থাকে, এটি এটি গোপনের সংজ্ঞা দিতে পারে এটি সম্পূর্ণরূপে আচ্ছাদিত, আপনি এটির কোনও দিকটি উন্মোচন করেন যদি এটি সম্ভবত ছায়া শঙ্কুকে আরও প্রশস্ত করতে পারে ... যাইহোক, আপনি হতে পারেন সম্পূর্ণরূপে কভার করা কেবলমাত্র ব্লকগুলি তালিকাভুক্ত করুন।
FxIII

@ ডেভিডগুভিয়া - এর চেয়ে বড় সমস্যা কি?
রোগাচ

@ ডেভিডগুভিয়া - আমি ইতিমধ্যে ছায়া "শঙ্কু" ব্যবহারের চেষ্টা করেছি, এবং এটি খুব অকার্যকর ছিল। দৃশ্যমান রশ্মির যথার্থতার জন্য - 5500 রশ্মি প্রাচীরটি প্রতিটি দিকে 20 টি টাইলগুলি দেখতে সরাসরি দেখা যায় যদি আপনি সরাসরি তার নিকটে দাঁড়িয়ে থাকেন, এবং যেখানে কেবল একটি একক টাইল দৃশ্যমান হয় তার দূরত্বটি আরও অনেক বেশি। এবং বড় দূরত্বে কিছু টাইলস মিস করার জন্য - ভাল, প্রত্যেকেরই চোখের দৃষ্টিশক্তি নেই, তাই না?
রোগাচ

8

আপনি যে সমস্যার সমাধান করার চেষ্টা করছেন তা কখনও কখনও ফিল্ড অফ ভিউ, সংক্ষেপে এফওভি নামে পরিচিত। আপনি উদাহরণ হিসাবে উদাহরণস্বরূপ রগুইলাইক হিসাবে উল্লেখ করেছেন, রোগুবাসিন উইকির এই বিষয় সম্পর্কে কী কী মন্তব্য করা উচিত তা একবার দেখে নেওয়া উচিত (এর বাস্তবায়নের লিংকও রয়েছে): http://www.roguebasin.com/index.php?title=Field_of_Vision

বিভিন্ন আগপাছ সঙ্গে বেশ কয়েক বিভিন্ন আলগোরিদিম আছে - একটি খুব সুবিধাজনক তুলনা RogueBasin এ পাওয়া যায়: http://www.roguebasin.com/index.php?title=Comparative_study_of_field_of_view_algorithms_for_2D_grid_based_worlds


সত্যিই ভাল এবং সম্পূর্ণ সারাংশ!
রোগাচ

এই ওয়েবসাইটটি একটি দুর্দান্ত সংস্থান, সেই লিঙ্কটি ভাগ করে নেওয়ার জন্য ধন্যবাদ। এছাড়া কিভাবে * pathfinding কাজ :-) একটি amazingly বোধগম্য বিবরণ রয়েছে
uliwitness

উত্তরের লিঙ্কটি এখন সাইটের হোম পৃষ্ঠায় চলে গেছে - roguebasin.com/index.php?title=Category:FOV একটি যুক্তিসঙ্গত মিল বলে মনে হচ্ছে।
21-15


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