पेरलिन शोर को समझना


31

मैं डायमंड स्क्वायर के साथ कुछ काम के बाद पेरलिन शोर के साथ कर रहा हूँ। मैंने ह्यूगो एलियास द्वारा कार्यान्वयन का पालन ​​किया जो मूल रूप से प्रत्येक समन्वय मूल्य को फेंकने के लिए इनपुट के रूप में एक्स, वाई के साथ कार्यों की एक श्रृंखला बनाता है।

मेरा PHP कोड यहाँ है :

मेरे दो सवाल हैं:

किसी सरणी में ऊंचाई का नक्शा बनाने के लिए मैं एल्गोरिथ्म का उपयोग कैसे करूं? मैं इसे पूरी तरह से समझ नहीं पाया और सिर्फ pseudocode को PHP में पोर्ट कर गया, लेकिन कहीं पढ़ने के बाद आखिरी फ़ंक्शन (map_perilt) कर रहा था कि एल्गोरिथ्म "जादुई रूप से" आपको प्रत्येक x के लिए ट्रांस्फ़ॉर्म किए गए मान देता है, y पॉइंट दिया गया (जाहिरा तौर पर, इसके पढ़ने के बिना। आसन्न मूल्य), मुझे बस यादृच्छिक फ़ंक्शन के रूप में उपयोग करते समय यह मिलता हैmt_rand(-100,100)/100;

यहाँ छवि विवरण दर्ज करें

और यह क्रिप्टोग्राफिक का उपयोग करते समय: 1.0-(($n*($n*$n*15731+789221)+1376312589)&0x7fffffff)/1073741824.0;(जो, BTW, PHP में "as-is"?) लागू किया जा सकता है।

यहाँ छवि विवरण दर्ज करें

इसलिए, तीन प्रश्नों का सारांश दें:

  1. क्या मेरा कोड सही है?
  2. यादृच्छिक फ़ंक्शन को PHP में पोर्ट किया जा सकता है जैसा कि कोड में वर्णित है? यह कोई त्रुटि नहीं फेंकता है, लेकिन परिणाम नहीं हैं।
  3. मैं वास्तव में एल्गोरिथ्म का उपयोग कैसे करूं?

अद्यतन करें

ठीक है, Gustavson पेपर में दिखाए गए कोड का एक PHP पोर्ट बनाया गया है, और जैसा कि अन्य कोडर ने कहा है, यह सिर्फ एक ऑक्टेव उत्पन्न करता है। शोर समारोह को नियंत्रित करने के लिए कई अष्टक, आयाम, आवृत्ति आदि की अवधारणाओं के साथ इसका उपयोग करने के बारे में कोई अन्य उपयोगी साइट / पेपर / गाइड है? गुस्तावसन के कागज पर सिर्फ परिणाम दिखाई देते हैं, न कि एल्गोरिथम का वास्तविक कार्यान्वयन, शायद मुझे कुछ याद आ रहा है?

अद्यतन 2
@ नोट

मैंने कुछ इस तरह बनाया:

$persistence = 0.5;

for ($j = 0; $j < $size; $j++) {
    for ($i = 0; $i < $size; $i++) {

        for ($o = 0; $o < 8; $o++) {
            $frequency = pow(2,$o);
            $amplitude = pow($persistence, $o);
            $value += SimplexNoise($i*$frequency, $j * $frequency) * $amplitude;
            }

            //$value = SimplexNoise($i, $j) + 0.5 * SimplexNoise($i, $j) + 0.25 * SimplexNoise($i, $j);
            $this->mapArray[$i][$j] = new Cell($value);

और मानों को सामान्य करने के बाद 0..1 करने के लिए, मुझे एक बहुत ही कम ऊंचाई का नक्शा मिलता है जैसे:

यहाँ छवि विवरण दर्ज करें

मैं नक्शे को कैसे बीज सकता हूं? शायद जो मुझे लागू करने की आवश्यकता है वह तीसरे संस्करण के साथ 3 डी संस्करण है एक यादृच्छिक ऊंचाई? लेकिन अगर ऐसा है, तो मुझे पड़ोसी मूल्यों को ध्यान में रखना होगा, जो कि मैं एक डायमंड स्क्वायर एल्गोरिदम जैसी चीज के साथ समाप्त करूंगा, बिल्कुल वही जो मैं नहीं करना चाहता।

अद्यतन 3

अधिक पेर्लिन काम करते हैं। मुझे अभी तक अपने परिणामों के लिए शोर को निर्देशित करने का एक तरीका नहीं मिला है। इन सप्तक और अंतिम परिणाम देखें:

सप्तक I से IV तक

Octave1Octave2Octave3Octave4

सारांश पेश करना

सप्तक 1-4 अंक

प्रत्येक सप्तक बहुत अधिक समान है। कोड की जाँच करें:

$persistence = 0.5;

    for ($j = 0; $j < $size; $j++) {
      for ($i = 0; $i < $size; $i++) {
        $value = 0;

        for ($o = 0; $o < 4; $o++) {
          $frequency = pow(2,$o);
          $amplitude = pow($persistence, $o);
          $value += improved_noise($i*$frequency, $j*$frequency, 0.5)*$amplitude;

        }
        $this->map[$i][$j] = new Cell($value);

परिणाम सामान्यीकृत हैं। शोर के विकास में आप क्या प्रभाव डालेंगे? मैं ऐसे उदाहरण देखता हूं जहां आयाम बदलने से नरम या खुरदरी सतह मिलती है, लेकिन अगर मैं एक विशाल आयाम देता हूं, तो भी मुझे थोड़ा अंतर दिखाई देता है।


बस एक साथ कई उदाहरण जोड़ते हैं, आवृत्ति बढ़ाते हैं और हर बार आयाम कम करते हैं, जैसे: पेर्लिन (x) + 0.5 * perlin (2 * x) + 0.25 * perlin (4 * x) + ... (जितने अष्टक के लिए) तुम्हें चाहिए)। आप अलग-अलग दिखने के लिए कारकों को बदलने की कोशिश कर सकते हैं; उन्हें 2. की शक्तियाँ होने की आवश्यकता नहीं है
नाथन रीड

1
अपडेट के बाद, ऐसा लगता है कि आप Y को सही ढंग से स्केल नहीं कर रहे हैं - मैं बहुत ज्यादा थक गया हूं PHP को PHP करने के लिए (जैसा कि मुझे PHP पता नहीं है); लेकिन मैंने पहली बार पेर्लिन को लागू करते समय अपनी घरेलू जीभ में एक समान मुद्दा मारा। ऑक्टेव्स को भी मारें और सिर्फ एक स्तर के पेर्लिन को डिबग करें।
जोनाथन डिकिंसन

मेरे III अपडेट के लिए कोई भी?
गेब्रियल ए। ज़ोरिल्ला

जवाबों:


28

आपने जो लागू किया है वह पेरलिन शोर नहीं है। मुझे यकीन नहीं है कि ह्यूगो एलियास क्यों कहता है, लेकिन वह भ्रमित है। यहाँ केन पेर्लिन का संदर्भ कार्यान्वयन है। यह वास्तव में किसी भी बाहरी रैंडम नंबर जनरेटर को कॉल नहीं करता है, लेकिन छद्म आयामी ग्रेडिएंट वैक्टर का उत्पादन करने के लिए एक अंतर्निहित हैश फ़ंक्शन का उपयोग करता है।

यह भी ध्यान दें कि पर्लिन शोर में सिर्फ एक सप्तक शामिल है। ह्यूगो एलियास का सुझाव है कि कई ऑक्टेव्स (शोर फ़ंक्शन के स्केल किए गए उदाहरण) को समेटना एक उपयोगी तकनीक है, लेकिन पेरलिन शोर का हिस्सा नहीं है। आप जो करते हैं उसे फ्रैक्टल शोर कहा जाता है, कभी-कभी "फ्रैक्टल ब्राउनियन शोर" (भूरा गति के लिए माना जाता है)।

यदि आप ज्यामितीय रूप से समझना चाहते हैं कि एल्गोरिथ्म क्या कर रहा है, तो इस पेपर को आज़माएं । यह "सिम्पलेक्स शोर" नामक एक अलग तरह के शोर के बारे में है, लेकिन इसमें क्लासिक पेरलिन शोर का स्पष्टीकरण भी शामिल है। संयोग से, सिम्प्लेक्स शोर का आविष्कार भी पेरलिन द्वारा किया गया था और माना जाता है कि यह उनके क्लासिक शोर पर एक सुधार है, इसलिए आप इसे लागू करने का प्रयास कर सकते हैं यदि आप शोर कार्यों के साथ खेलने में रुचि रखते हैं।


2
गुस्तावसन के पेपर के लिए +1। यह स्पष्ट करता है कि मैंने अब तक सबसे स्पष्ट तरीके से पेर्लिन और सिम्प्लेक्स शोर दोनों को समझाया है। जाहिर है सिंप्लेक्स शोर नियम!
9

मुझे कुछ समय पहले वह कागज भी मिला लेकिन ह्यूगो अधिक सरल लग रहा था। मैं इसे पढ़ूंगा और इसे एक शॉट दूंगा! धन्यवाद!
गेब्रियल ए। ज़ोरिल्ला

2
सिम्पलेक्स शोर को डाउनलोड करते समय सावधान रहें, इसमें वायरस हो सकता है;)
बॉबोबोब

मुझे पता है कि यह एक पुराना विषय है, लेकिन यह कहना कि संदर्भ कार्यान्वयन यादृच्छिक संख्या का उपयोग नहीं करता है, गलत है। जब लाइब्रेरी को इनिशियलाइज़ किया जाता है (या पहली बार शोर फंक्शन कहा जाता है) तो 256 यादृच्छिक ग्रेडिएंट उत्पन्न होते हैं। आपके द्वारा निर्दिष्ट हैशिंग केवल [0, 255] श्रेणी में पूर्णांक के पूर्णांक के अनंत सेट को समेटने के लिए है। अनिवार्य रूप से यह सिर्फ एक लुक-अप टेबल ऑप्टिमाइज़ेशन है, और एल्गोरिथ्म ठीक वैसे ही काम करता है जैसे कि, उदाहरण के लिए, आप एक PRNG को ग्रिड के साथ समन्वयित करते हैं और उपयोग करते हैं कि ग्रेडिएंट उत्पन्न करने के लिए, यह सिर्फ (बहुत) उस तरह से धीमा है।
bcrist

@bcrist मुझे लगता है कि आप पेर्लिन शोर के पुराने संस्करण की बात कर रहे हैं। पेर्लिन का "बेहतर शोर", जिसे मैंने जोड़ा , 12 ग्रेडिएंट वैक्टर के एक निश्चित सेट का उपयोग करता है, न कि 256 यादृच्छिक वाले। यह उन 12 ग्रेडिएंट वैक्टरों में से एक के लिए ग्रिड निर्देशांक को मैप करने के लिए एक हैश फ़ंक्शन के रूप में एक क्रमचय तालिका का उपयोग करता है।
नाथन रीड

11

यह एक सामान्य गलत धारणा है। ह्यूगो एलियास ने "पेर्लिन" शोर को वास्तव में भग्न, या गुलाबी, शोर कहा है। पेर्लिन का शोर क्या है, इसे बेहतर तरीके से समझने के लिए, आप नाथन रीड के उत्तर में लिबलिन के लेख, या कामेच्छा डॉक्स (वहाँ वही त्रुटि है: पेरलिन शोर को वे ग्रैडिएंट शोर कहते हैं), या सुसंगत नोक्स डॉक्स से पढ़ सकते हैं ।

अब, वास्तव में आपके प्रश्न का उत्तर देने के लिए: आपको अपेक्षित परिणाम नहीं मिला क्योंकि शोर आवृत्ति बहुत अधिक है। आपकी फ़्रीक्वेंसी 1 से शुरू होती है और बढ़ती है, जिसका अर्थ है कि परिणामी नक्शे में प्रत्येक पिक्सेल का एक यादृच्छिक मूल्य है। नक्शे की महीन संरचना को देखने के लिए, आपको शोर पर "ज़ूम इन" करने की आवश्यकता है। मैं वास्तव में PHP नहीं बोलता, लेकिन मुझे लगता है कि कोड इस तरह दिखना चाहिए:

$arrayMap[$i][$j] = PerlinNoise_2D($i/$width, $j/$height, $p, $octaves);

यही है, आप अपने पूरे नक्शे पर शोर की एक अवधि "खिंचाव" करते हैं। बेशक, आप अन्य गुणांक का उपयोग कर सकते हैं - बस अलग-अलग लोगों की कोशिश करें, देखें कि क्या होता है।


सुसंगत शोर डॉक्स के लिए धन्यवाद! मुझे लगता है कि आपने इसे लिखा है :) कामेच्छा डॉक्स में क्या त्रुटि है? क्या पेरलिन शोर एक प्रकार का ढाल शोर नहीं है?
किंवदंतियों २१
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.