আমি কীভাবে মানচিত্র তৈরির জন্য টাইলিবল কঠিন শব্দ তৈরি করব?


16

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

আমার এখন পর্যন্ত সংশোধিত কোড (জাভা)

জিম্পের শক্ত শব্দ মডিউল যা আমি আমার কোডটি (সি) বন্ধ করে দিচ্ছি

এখানে আমি অর্জন করার চেষ্টা করছি তবে এটি আমি পাচ্ছি

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


বিলিনিয়ারের পরিবর্তে বিকিউবিক ইন্টারপোলেশন ব্যবহার করার চেষ্টা করবেন ? এটি যদি আপনার সমস্যা হয় তবে আমার কোনও ধারণা নেই তবে এটি দেখতে এটির মতো লাগে।
স্টিফেন ফুরলানি

উত্তর:


4

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

নীচের ব্যাখ্যাটি সুপার অপ্টিমাইজড সংস্করণ নয়, এটি একটি যা ধারণাগতভাবে পরিষ্কার (আমি আশা করি) clear আপনি এটি চালিয়ে যাওয়ার পরে, আপনি এটিকে অপ্টিমাইজ করতে পারেন (বেশ মারাত্মকভাবে, আসলে)।

  1. অভিন্ন র্যান্ডম শব্দের n স্তরগুলি তৈরি করুন (কেবলমাত্র এলোমেলো গ্রেস্কেল পিক্সেল)।
  2. এখন প্রতিটি, 1, 2, 4, 8, ... 2 ^ (এন -1) পিক্সেল, এবং মধ্যবর্তী পিক্সেলগুলি ইন্টারপোল্ট করে নমুনা করুন। প্রতিটি স্তর পূর্ববর্তী তুলনায় মসৃণ।
  3. এখন 1, 2, 4, 8, ইত্যাদির গুণক সহ এর স্কেল করুন প্রতিটি স্তর পূর্ববর্তীটির চেয়ে গা dark়।
  4. এই সমস্ত একসাথে যোগ করুন।
  5. প্রতিটি পিক্সেলকে (1 + 2 + 4 + 8 + ... 2 ^ (এন -1)) দিয়ে ভাগ করে সাধারণ করুন।

কঠিন পদক্ষেপটি স্যাম্পলিং এবং ইন্টারপোলেশন পদক্ষেপ। মনে করুন আমরা প্রতিটি এম-পিক্সেল পিক্সেলের নমুনা এড়িয়ে চলেছি layer এখানে এম> 1 এর প্রাথমিক ধারণাটি রয়েছে (যদি এম 1 হয় তবে আমরা চিত্রটি যেমন ব্যবহার করি):

for each pixel x and y
   left_sample_coord = m *(x / m) //(integer division, automatically truncated)
   right_sample_coord = (left_sample_point + m) % image_width
   top_sample_point = m*(y / m) 
   bottom_sample_coord = (top_sample_point + m) % image_height

   horizontal_weight = (x - left_sample_point) / (m - 1)
   vertical_weight = (y - top_sample_point) / (m - 1)

   sample_top_left = image(left_sample_coord, top_sample_point)
   //and the same for the other four corners

   //now combine the top two points
   top_interpolate = sample_top_left * horizontal_weight + sample_top_right * (1-horizontal_weight)

  //now combine the bottom two points
  bottom_interpolate = sample_bottom_left * horizontal_weight + sample_bottom_right * (1-horizontal_weight)

  //and combine these two last obtained values

  smooth_noise(x, y) = top_interpolate * vertical_weight  + bottom_interpolate * (1 - vertical_weight)

কয়েকটি টিপস:

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

3

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

যদি কেউ এই কোডটি ব্যবহার করার পরিকল্পনা করে তবে আমি কনস্ট্রাক্টরকে সেটিংসের পরামিতিগুলি (বিশদ এবং আকার) সংশোধন করার পরামর্শ দিচ্ছি যাতে আপনি এটি কীভাবে চান তা কাজ করতে পারেন। সম্পাদনা: আমি বুঝতে পেরেছিলাম যে আমার মূল প্রশ্নটি এটিকে টাইলটেবল করে তোলা ছিল, তাই মনে রাখতে হবে সত্যকে টেলাবল করতে হবে!

কোড: http://pastebin.com/KsfZ99Xa

উদাহরণ: পার্লিন জেনারেটর উদাহরণ


2

কেবল জাভা এবং সি সংস্করণগুলিতে স্কিম করা হয়েছে এবং আপনি গোলমাল ফাংশনটি যেভাবে ব্যবহার করছেন তাতে কিছুটা পার্থক্য লক্ষ্য করেছেন। এখানে আপনার:

int val = Math.abs((int) Math.floor(255.0 * noise(((double)col/(double)width), ((double)row/(double)height))));

সি কোড:

val = (guchar) floor (255.0 * noise ((col - xoffset) / width,

                                           (row - yoffset) / height));

আপনি কেন অফসেটটি বিয়োগ না করা বেছে নিয়েছেন? (কল - এক্স অফসেট) এবং (সারি - ইয়ফসেট)

ভাবছি. কোডটির পুরো বিশ্লেষণ করার মতো সময় আমার নেই।

আশাকরি এটা সাহায্য করবে.


এক্সফসেট এবং ইওফসেট জিমপ চিত্রগুলিকে গ্রিডগুলিতে যেভাবে ভাগ করে দেয় তা গণনা করতে হয় তবে আমার প্রোগ্রামটি সমস্ত টাইল একসাথে কাজ করে তাই এক্স এবং ওয়াই অফসেট 0 হবে
নিক বাদল

2

আমি জানি না এটি সাহায্য করতে পারে কিনা তবে নিম্নলিখিত কৌশলটি আমার জন্য একটি ট্রিট কাজ করেছিল:

http://www.gamedev.net/blog/33/entry-2138456-seamless-noise/

এই সহকর্মী একটি 4 ডি শোনার ফাংশন ব্যবহার করছে এবং 4 টি শব্দের জন্য xyzw মান হিসাবে দুটি চেনাশোনার xy মানগুলি সরবরাহ করে provide ফলাফল নিখুঁত লুপিং।

1000 * 1000 ছবির জন্য এখানে ধারণাটি (সরলীকৃত) দেওয়া হল:

for(i = 0;i < 1000; i++){

  for(j = 0; j < 1000; j++){

    nx = cos((i/1000) * 2 * PI);
    ny = cos((j/1000) * 2 * PI);
    nz = sin((i/1000) * 2 * PI);
    nw = sin((j/1000) * 2 * PI);

    looped_noise = noise_4D( nx, ny, nz, nw, octaves, persistence, lacunarity, blah...);
    noise_buffer[(i*1000)+j] = looped_noise;

  }
}

1

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


0

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

সুতরাং, প্রকৃতপক্ষে আপনার প্রশ্নের উত্তর দিতে: একটি টাইলিবল শব্দের চিত্র তৈরি করতে, আপনাকে কেবল প্রজন্ম জুড়ে "টাইলিবিলিটি" রাখা দরকার। এটি হ'ল শব্দের গতি যখন আসে তখন আপনি এটিকে মসৃণ করেন যেন এটি সমস্ত দিক থেকে অসীমভাবে পুনরাবৃত্তি হয় - টাইলস।


0

স্ক্রিনশট থেকে, আমার অনুমান যে কেবল "বড়" স্তর তৈরি হচ্ছে, এ কারণেই শব্দটি খুব নিয়মিত উপস্থিত হয় এবং বিশদের অভাব হয়।

এটি বোকা লাগতে পারে তবে আপনি কি "বিশদ" পরিবর্তনশীল (লাইন 16) বাড়ানোর চেষ্টা করেছিলেন? আপনার কোডে, এটি 1 এ সেট করা হয়েছে যার অর্থ অ্যালগরিদম থামার আগে কেবল মাত্র দুটি স্তর বিশদ তৈরি করবে। এটি 8 এর মতো কিছুতে বাড়ানোর চেষ্টা করুন।


0

আপনার সিম্প্লেক্স নয়েজটিও দেখে নেওয়া উচিত পার্পলিন গোলমালের কিছু ত্রুটিগুলি সমাধান করার জন্য কেন পার্লিন দ্বারা বিকাশ করা ।

আমি সি ++ গেমের জন্য সিম্প্লেক্স নয়েজ প্রয়োগের কাজ করছি। এটি মাল্টি-অকটভ 1 ডি / 2 ডি / 3 ডি / 4 ডি শব্দকে সমর্থন করে। এখনই, একমাত্র অন্তর্নির্মিত টেক্সচারটি মার্বেল, তবে আপনি সহজেই আরও যোগ করতে পারেন:

(Http://code.google.com/p/battlestar-tux/source/browse/trunk/src/lib/procedural/)

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