मैं मैप जनरेशन के लिए टिलिबल सॉलिड शोर कैसे बनाऊं?


16

हे दोस्तों, मैं यह पता लगाने की कोशिश कर रहा हूं कि कोड में टिलिबल फ्रैक्चल्स कैसे उत्पन्न किया जाए (गेम मैप्स के लिए, लेकिन यह अप्रासंगिक है ) मैं जीआईएमपी के साथ सॉलिड नॉइज प्लग-इन को संशोधित करने की कोशिश कर रहा हूं (मेरी बेहद सीमित समझ के साथ कोड काम करता है), लेकिन मुझे सही ढंग से काम करने के लिए नहीं मिल सकता है।

मेरा संशोधित कोड अब तक (जावा)

GIMP का ठोस शोर मॉड्यूल जो मैं अपने कोड (C) को बंद कर रहा हूं

यहाँ मैं क्या हासिल करने की कोशिश कर रहा हूँ, लेकिन यह वही है जो मुझे मिल रहा है

इसलिए यदि कोई देख सकता है कि मैंने क्या गलत किया है, या मेरा सुझाव है कि मैं इसे अलग तरीके से कैसे कर सकता हूं, तो मैं इसकी सराहना करूंगा। अग्रिम में धन्यवाद। और अगर मैं बहुत से रास्ते पूछ रहा हूं या अगर जीवन में सिर्फ एक बड़ी विफलता है, तो मैं माफी चाहता हूं।


बिलिनियर के बजाय बिकुबिक प्रक्षेप का उपयोग करने का प्रयास करें ? मुझे पता नहीं है कि अगर आपकी समस्या है, लेकिन यह पसंद है।
स्टीफन फुरलानी

जवाबों:


4

मैं आपके कोड का ठीक-ठीक पालन नहीं करता, लेकिन यहाँ एल्गोरिथ्म का एक सरलीकृत वर्णन है जो मोटे तौर पर प्रभाव को प्राप्त करेगा (आपके द्वारा पोस्ट की गई छवि के आधार पर)।

निम्नलिखित स्पष्टीकरण सुपर अनुकूलित संस्करण नहीं है, लेकिन एक है जो वैचारिक रूप से स्पष्ट है (मुझे आशा है)। एक बार जब आप इसे चालू कर लेते हैं, तो आप इसे (काफी तेजी से, वास्तव में) अनुकूलित कर सकते हैं।

  1. एकसमान रैंडम शोर (सिर्फ रैंडम ग्रेस्केल पिक्सल) की एन लेयर्स जनरेट करें।
  2. अब इनमें से प्रत्येक, 1, 2, 4, 8, ... 2 ^ (n-1) पिक्सल का नमूना लेकर और इंटरमीडिएट पिक्सल को प्रक्षेपित करके नमूना बनाएं। प्रत्येक परत पिछले एक की तुलना में चिकनी है।
  3. अब 1, 2, 4, 8, आदि के कारक के साथ इनमें से प्रत्येक परत पिछले वाले की तुलना में गहरा है।
  4. इन सभी को एक साथ मिलाएं।
  5. प्रत्येक पिक्सेल को (1 + 2 + 4 + 8 + ... 2 ^ (n-1)) से विभाजित करके सामान्य करें।

कठिन कदम नमूना और प्रक्षेप कदम है। मान लीजिए कि हम हर m-th पिक्सेल के नमूने को छोड़ते हुए परत में हैं। यहाँ m> 1 के लिए मूल विचार है (यदि m 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

उदाहरण: perlin जनरेटर उदाहरण


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));

आपने ऑफसेट को घटाना क्यों नहीं चुना है? (col - xoffset) और (पंक्ति - yoffset)

बस सोच रहा। मेरे पास कोड का पूर्ण विश्लेषण करने का समय नहीं है।

उम्मीद है की यह मदद करेगा।


जिस तरह से GIMP छवियों को ग्रिड में विभाजित करता है, उसी तरह से गणना करने के लिए xoffset और yoffset हैं, लेकिन मेरा प्रोग्राम सभी एक टाइल पर काम करता है इसलिए x और y ऑफसेट 0 होगा
Nick Badal

2

मुझे नहीं पता कि यह मदद कर सकता है लेकिन निम्नलिखित चाल ने मेरे लिए एक इलाज का काम किया:

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

यह साथी 4d शोर फ़ंक्शन का उपयोग कर रहा है और बस 4d शोर के लिए xyzw मान के रूप में दो हलकों के xy मान प्रदान करता है। परिणाम एकदम सही है।

यहां 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

आपको सिम्प्लेक्स शोर पर भी एक नज़र डालनी चाहिए , जिसे केन पेर्लिन ने पेर्लिन के शोर की कुछ कमियों को ठीक करने के लिए विकसित किया था।

मैं एक C ++ गेम के लिए सिम्पलेक्स शोर के कार्यान्वयन पर काम कर रहा हूं। यह मल्टी-ऑक्टेव 1 डी / 2 डी / 3 डी / 4 डी शोर का समर्थन करता है। अभी, केवल निर्मित बनावट संगमरमर है, लेकिन आप आसानी से अधिक जोड़ सकते हैं:

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.