শহরের রাস্তার নেটওয়ার্ক কীভাবে তৈরি করা যায়?


16

আমি একটি গেমের জন্য একটি সিটি জেনারেটর তৈরি করতে চাই, তবে আমি প্রজন্মের একেবারে শুরুতে: রাস্তা ব্যবস্থা facing

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

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

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


2
আপনি অন্তর্নিবেশ সফ্টওয়্যার দ্বারা প্রক্রিয়াজাত নগর জেনারেটরটি দেখতে চান যা তারা সাবভার্সনের জন্য তৈরি করেছিল made গেমটি নিজেই বাতিল হয়ে যাওয়ার পরে, তাদের জেনারেটরের কাছ থেকে প্রচুর ফুটেজ রয়েছে।
ফিলিপ

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

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

উত্তর:


21

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

  • "প্রস্তাবিত" রাস্তার একটি তালিকা বজায় রাখুন
  • কিছু ক্রমে তাদের মূল্যায়ন
  • যদি সেগুলি গ্রহণযোগ্য হয় (কিছু ছোট ছোট সংশোধনীর সাথে বা ছাড়া)
  • এটি থেকে মুষ্টিমেয় আরও শাখাগুলি "প্রস্তাব" করার সময় প্রতিটি স্বীকৃত রাস্তা সংরক্ষণ করুন

এই পদ্ধতির মাধ্যমে প্যারিশ এবং মুলারের এল-সিস্টেমের বেশিরভাগ প্রতীক পুনর্লিখন গৃহপালিত উত্তরাধিকার সরিয়ে দেয়। আপনি এখানে এই পদ্ধতির একটি ডেমো দেখতে পারেন ।

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

অংশ হিসাবে, আপনি 90 ডিগ্রি কোণ ইত্যাদি এড়িয়ে সড়ক শাখার নিয়মগুলি পরিবর্তন করে এটিকে সামঞ্জস্য করতে পারেন If

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

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

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


6

আপনি যদি গুগলে মধ্যযুগীয় / পুরাতন নগর পরিকল্পনাগুলি সন্ধান করেন তবে বেশিরভাগ নগর উত্সের উপর ভিত্তি করে (উদাহরণস্বরূপ এলোমেলো বন্দোবস্ত বনাম সংগঠিত সামরিক অবস্থান) অনেকগুলি ভিন্নতা পাবেন many

আমি ধরে নিয়েছি আপনি আরও প্রাকৃতিকভাবে বর্ধিত / বিশৃঙ্খলা নিষ্পত্তি খুঁজছেন।

এগুলির জন্য আমি এই জাতীয় একটি পদ্ধতির চেষ্টা করব:

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

3

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

এটি বুঝতে সহজ হিসাবে জেএসে সিউডো-কোড দেবে।

1º একটি এন্ট্রি পয়েন্টটি সংজ্ঞায়িত করুন, আপনি যেমন একটি মধ্যযুগীয় শহর বানাতে চান যা আমরা একটি বর্গ দিয়ে শুরু করব, সুতরাং বলি যে আপনার শহরে 300 বর্গাকার ইউনিট থাকবে এবং বর্গটি এর মাঝখানে থাকবে (একটি এক্স দিয়ে উপস্থাপিত)।

       300
________________
|               |
|               |
|               | 300
|       X       |
|               |
|               |
|_______________|

const square = [ 150, 150 ];

2º এখন আমরা উপায়গুলি করব, এগুলির একটি এলোমেলো সংখ্যা থাকবে, সেগুলি সোজা হবে এবং মধ্য বর্গ থেকে শুরু হবে বা অন্যান্য পথ থেকে শুরু হবে

let avenues = [] // will contain start and end [[sx,sy],[ex,ey]]
const n_avenues = RANDOM(4, 8); // number of avenues
const n_av_from_square = RANDOM(0, avenues); // starting in the square

for av in av_from_square
  avenues.push(square, [RANDOM(0, 200) + 100, RANDOM(0, 200) + 100])
  // we want avenues to have, at least 100 units length, thats why we randomize just te last 200 units of the whole town size

এটি আপনাকে একটি বর্গাকার এবং কয়েকটি প্রধান রাস্তা দেওয়া উচিত

       300
________________
|   \\          |
|    \\         |
|     \\        | 300
|       X=====  |
|               |
|               |
|_______________|

এখন আমাদের অ্যাভিনিউগুলি সেট করতে হবে যা মূল স্কোয়ারে শুরু হয় না, তারা অন্যান্য সুযোগগুলিকে ছেদ করবে

for av in (n_avenues - av_from_square){
  const av_to_intersect = avenues[RANDOM(0,avenues.length)];

  //check av_to... and get a perpendicular vector (explained bellow)
  av[0] = [ av_to_intersect[0][1], - av_to_intersect[0][0] ];
  av[1] = [ av_to_intersect[1][1], - av_to_intersect[1][0] ];

}

লম্ব লম্বা ভেক্টর পেতে আপনাকে এক্স, ওয়াই কর্ড অদলবদল করতে হবে এবং নতুন y টি উপেক্ষা করতে হবে:

swiped == x: noswiped.y, y: -1 * (noswiped.x)

এই মুহুর্তে আপনার কি এরকম কিছু হওয়া উচিত, এটি কি শহরের মতো দেখাচ্ছে না? : P: P

       300
________________
|   \\  //      |
|    \\//  ||   |
|     \\   ||   | 300
|    //\X=====  |
|   //     ||   |
|          ||   |
|_______________|

3º এখন আপনাকে কেবল ছোট ছোট রাস্তাগুলির সাথে সংযোগ স্থাপন করতে হবে, এছাড়াও আপনি শহর জুড়ে সমস্ত এলোমেলো স্কোয়ারগুলি স্প্যান করতে পারেন এবং সেগুলির জন্য উপরের মতই তৈরি করতে পারেন, বা কিছু সেকেন্ডারি স্কোয়ার থেকে কেবল ছোট ছোট রাস্তাগুলি স্প্যান করতে পারেন, এটি আপনার বিষয়।

মনে রাখবেন, আপনার রাস্তাগুলি সবচেয়ে কম, বিশৃঙ্খল শহরটি দেখতে।

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