पिक्सेल आर्ट मोशन में "सीढ़ी प्रभाव" से कैसे बचा जा सकता है?


21

मैं antialiasing की वजह से धुंधला प्रभाव से बचने के लिए सटीक पिक्सेल निर्देशांक पर स्प्राइट प्रदान कर रहा हूं (स्प्राइट पिक्सेल-कला हैं और फ़िल्टर किए जाने पर भयानक दिखेंगे)। हालाँकि, चूंकि ऑब्जेक्ट्स की गति में परिवर्तनशील वेग, गुरुत्वाकर्षण और भौतिक इंटरैक्शन शामिल हैं, इसलिए प्रक्षेपवक्र की गणना उप-सटीकता के साथ की जाती है।

बड़े पर्याप्त स्क्रीनस्पेस वेग (2 या 3 पिक्सेल से बड़े होने पर) यह बहुत अच्छी तरह से काम करता है। हालांकि, जब वेग छोटा होता है, तो ध्यान देने योग्य सीढ़ी प्रभाव दिखाई दे सकता है, विशेष रूप से विकर्ण रेखाओं के साथ। यह अब बहुत धीमी स्क्रीनस्पेस वेग (v << 1 पिक्सेल प्रति सेकंड) पर कोई समस्या नहीं है, इसलिए मैं केवल मध्यवर्ती वेग मूल्यों के लिए एक समाधान की तलाश कर रहा हूं।

बाईं ओर एक बड़े वेग के लिए प्लॉट किए गए प्रक्षेपवक्र है, जो ऑब्जेक्ट निर्देशांक के सरल गोलाई द्वारा प्राप्त किया जाता है। बीच में आप देख सकते हैं कि क्या होता है जब वेग छोटा हो जाता है, और मैं जिस सीढ़ी के प्रभाव के बारे में बात कर रहा हूं। दाईं ओर, जिस प्रक्षेप पथ को मैं प्राप्त करना चाहता हूं।

वस्तु प्रक्षेपवक्र के लिए पिक्सेल निर्देशांक

मैं एल्गोरिथ्म विचारों में दिलचस्पी रखता हूं ताकि एलियासिंग को कम करने के लिए प्रक्षेपवक्र को फ़िल्टर किया जा सके, जबकि बड़े और छोटे वेग पर मूल व्यवहार को बनाए रखा जाए। मेरे पास ,t, त्वरित स्थिति और वेग के साथ-साथ पिछले मानों की एक मनमानी संख्या तक पहुंच है, लेकिन चूंकि यह एक वास्तविक सिमुलेशन है, मुझे भविष्य के मूल्यों के बारे में नहीं पता है (हालांकि यदि आवश्यक हो, तो कुछ अनुमानों के तहत अनुमान लगाया जा सकता है) । ध्यान दें कि भौतिकी सिमुलेशन के कारण, अचानक दिशा परिवर्तन भी हो सकते हैं।

जवाबों:


18

यहाँ एक त्वरित रूपरेखा है, मेरे सिर के ऊपर से, एक एल्गोरिथ्म की जो उचित रूप से अच्छी तरह से काम करना चाहिए।

  1. सबसे पहले, उस दिशा की गणना करें जो ऑब्जेक्ट चल रहा है, और जांचें कि क्या यह क्षैतिज या ऊर्ध्वाधर के करीब है।
  2. यदि दिशा ऊर्ध्वाधर (क्षैतिज) के करीब है, तो दिशा वेक्टर के साथ ऑब्जेक्ट की स्थिति को निकटतम पिक्सेल पंक्ति (स्तंभ) के केंद्र में समायोजित करें ।
  3. निकटतम पिक्सेल के केंद्र में स्थिति को गोल करें।

छद्मकोश में:

if ( abs(velocity.x) > abs(velocity.y) ) {
    x = round(position.x);
    y = round(position.y + (x - position.x) * velocity.y / velocity.x);
} else {
    y = round(position.y);
    x = round(position.x + (y - position.y) * velocity.x / velocity.y);
}

संपादित करें: हां, परीक्षण, काफी अच्छी तरह से काम करता है।


+1, यह आश्चर्यजनक रूप से अच्छा काम करता है! मैं अजीब पीछे की ओर धीमी वेग पर परिपत्र आंदोलन के साथ कूदता है, क्योंकि समायोजन वेग वेक्टर (जो आमतौर पर ठीक है, लेकिन छोटे प्रक्षेपवक्र वक्रता के साथ नहीं) के विपरीत दिशा में किया जा सकता है। यह velocity.y / velocity.xएक सुधार कारक के वेग से आनुपातिक रूप से गुणा करके हल किया जा सकता है ।
सैम होसेवर

@ सलाम: आपका मतलब है छोटे टर्निंग त्रिज्या (= उच्च वक्रता), है ना? यह वास्तव में कम वेग पर रैखिक एक्सट्रपलेशन के साथ मुद्दों का कारण बन सकता है। (मूल रूप से, यह तब तक काम करता है जब तक कि त्वरण के प्रति वेग 1 पिक्सेल से बहुत बड़ा हो।) एक संभव (कलुगी) समाधान अंतिम गोल स्थिति को याद रखने और इसे पुन: उपयोग करने के लिए हो सकता है यदि यह नए रेटेड वाले की तुलना में सही स्थिति के करीब हो। (कोई भी उच्च-क्रम एक्सट्रपलेशन की कोशिश कर सकता है, लेकिन सूत्र बहुत बदसूरत हो जाते हैं।)
इल्मारी कारोनेन

दरअसल, मेरा मतलब छोटे दायरे से था। मेरी गलती। और अतिरिक्त संकेत के लिए धन्यवाद; वहां प्रदर्शन महत्वपूर्ण नहीं है, इसलिए मैं गुणवत्ता में सुधार कर सकता हूं।
सैम होसेवर

3

बहुत कुछ नहीं है जो आप वास्तव में सामान्य भौतिकी-आधारित दुनिया के लिए कर सकते हैं। यदि आपकी सभी वस्तुएँ लाइनों या विशिष्ट मंडलियों के साथ आगे बढ़ रही थीं, तो आप कुछ कर सकते थे। लेकिन आप वास्तविक भौतिकी के तहत काम कर रहे हैं। वस्तु वह जगह है जहां भौतिकी इसे डालती है; आप बस उस स्थान के पिक्सेल-आधारित सन्निकटन को आकर्षित कर रहे हैं।

यदि आप पिक्सेल निर्देशांक के साथ रहना चाहते हैं तो यह आम तौर पर आपके द्वारा स्वीकार की जाने वाली चीज़ है। जब तक आप अविश्वसनीय रूप से छोटे रिज़ॉल्यूशन (640x480 से कम) पर प्रदर्शित नहीं कर रहे हों, तब तक यह ध्यान देने योग्य नहीं होना चाहिए, हालांकि यह डिस्प्ले के मूल रिज़ॉल्यूशन और आकार पर निर्भर करता है।


यहां तक ​​कि उच्च संकल्पों पर, ओल्डस्कूल उपस्थिति को बढ़ाने के लिए प्रतिपादन (निकटतम पड़ोसी) बढ़ा हुआ है। यह एक कलात्मक दिशा निर्णय है।
सैम होसेवर

@ समोसेश्वर: यदि आप "ओल्डस्कूल उपस्थिति" चाहते हैं, तो आप पूर्ण " ऑल्डस्कूल उपस्थिति" क्यों नहीं चाहते हैं ? सीढ़ी-कदम क्यों है, जो किसी भी "ओल्डस्कूल" खेल में होता, उस समग्र प्रभाव का हिस्सा नहीं जिसे आप प्राप्त करना चाहते हैं?
निकोल बोलस

मुझे नहीं लगता कि किसी भी सभ्य oldschool खेल ने एक विकर्ण आंदोलन को लागू किया होगा जिसमें सीढ़ी का प्रभाव होता है, क्योंकि यह बकवास की तरह दिखता होगा। बकवास की तरह नहीं दिख रहा है, मैं इसे प्राप्त करने की इच्छा रखने वाले बच्चों के प्रभाव का एक बड़ा हिस्सा है :-)
सम होसेवार

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

3

जब लंबित आंदोलन पिछले आंदोलन (स्क्रीन स्पेस में) के लंबवत होता है, तो इसे अनदेखा करें और अंतिम स्क्रीन निर्देशांक का उपयोग करें। यदि वह हकलाने की ओर ले जाता है जो कि सीढ़ी की तरह खराब है, तो आप लंबित और अंतिम आंदोलन के योग को आगे बढ़ाने का प्रयास कर सकते हैं।

मुझे लगता है कि समस्या v <sqrt (2) में है। v> sqrt (2) हमेशा सीढ़ी के प्रभाव से बचने के लिए कम से कम एक पूर्ण विकर्ण को स्थानांतरित करना चाहिए। शायद छंटाई के लिए उपयोगी है जो पहले आंदोलन तुलना की जरूरत है।


+1 वी के लिए एक ऊपरी बाउंड को इंगित करने के लिए। इल्मरी का सुझाव अधिक विस्तृत है लेकिन आप उपयोगी जानकारी प्रदान कर रहे हैं।
सैम होसेवर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.