পিক্সেল আর্ট গতিতে কেউ কীভাবে "সিঁড়ি প্রভাব" এড়ায়?


21

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

যথেষ্ট পরিমাণে স্ক্রিনস্পেসের বেগ (2 বা 3 পিক্সেলের চেয়ে বড়) এটি খুব ভালভাবে কাজ করে। যাইহোক, যখন বেগ ছোট হয়, একটি লক্ষণীয় সিঁড়ি প্রভাব উপস্থিত হতে পারে, বিশেষত তির্যক রেখাগুলি বরাবর। এটি এখন খুব ধীর স্ক্রিনস্পেসের বেগের ক্ষেত্রে (v << 1 পিক্সেল প্রতি সেকেন্ড) আর সমস্যা নেই তাই আমি কেবলমাত্র মধ্যবর্তী গতির মানগুলির জন্য একটি সমাধান খুঁজছি।

বামদিকে একটি বৃহত বেগের জন্য প্লটযুক্ত ট্র্যাজেক্টোরি রয়েছে, যা বস্তুর স্থানাঙ্কের সরল বৃত্তাকার দ্বারা প্রাপ্ত। মাঝখানে আপনি দেখতে পাবেন যখন বেগ ছোট হয়ে যায় তখন কী হয়, এবং আমি সিঁড়ির প্রভাব সম্পর্কে বলছি। ডানদিকে, ট্রাজেক্টোরির লোকস আমি পেতে চাই।

অবজেক্ট ট্রাজেক্টোরির জন্য পিক্সেল স্থানাঙ্ক

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

উত্তর:


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 পিক্সেলের চেয়ে বড় হয় works) একটি সম্ভাব্য (ক্লুজি) সমাধান হতে পারে সর্বশেষ গোলাকার অবস্থানটি মনে রাখা এবং এটি নতুন গণনা করা অবস্থার চেয়ে সত্য অবস্থানের কাছাকাছি থাকলে এটি পুনরায় ব্যবহার করা। (কেউ উচ্চতর অর্ডার এক্সট্রাপোলেশন চেষ্টা করতে পারে তবে সূত্রগুলি বেশ কুৎসিত হয়))
ইলমারি করোনেন

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

3

একটি সাধারণ পদার্থবিজ্ঞান-ভিত্তিক বিশ্বের জন্য এটি সম্পর্কে আপনি সত্যিই খুব বেশি কিছু করতে পারেন না। যদি আপনার সমস্ত বস্তু লাইন বা নির্দিষ্ট চেনাশোনাগুলি নিয়ে চলছিল তবে আপনি কিছু করতে পারেন could তবে আপনি প্রকৃত পদার্থবিজ্ঞানের অধীনে কাজ করছেন। পদার্থবিদ্যা যেখানে এটি স্থাপন করে; আপনি কেবল সেই জায়গার পিক্সেল-ভিত্তিক অনুমান অঙ্কন করছেন।

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


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

@ সামহোসেওয়ার: আপনি যদি "ওল্ডস্কুলের উপস্থিতি" চান তবে আপনি কেন পুরো "ওল্ডস্কুলের চেহারা" চান না ? সিঁড়ি-পদক্ষেপ কেন, যা কোনও "ওল্ডস্কুল" গেমের হয়ে উঠত, আপনি যে সামগ্রিক প্রভাব অর্জন করতে চান তার একটি অংশ নয়?
নিকল বোলাস

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

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

3

যখন মুলতুবি থাকা চলাচলটি সর্বশেষ আন্দোলনের (পর্দার স্থানে) লম্ব হয় তখন এটিকে উপেক্ষা করুন এবং শেষ স্ক্রিনের স্থানাঙ্কগুলি ব্যবহার করুন। যদি সিঁথির মতো খারাপ যে তোলা বাড়ে, আপনি মুলতুবি এবং শেষ আন্দোলনের যোগফলকে এগিয়ে নিয়ে যেতে চেষ্টা করতে পারেন।

আমি মনে করি সমস্যাটি v <sqrt (2) এর মধ্যে রয়েছে। v> স্কয়ার্ট (2) সিঁড়ির প্রভাব এড়িয়ে সর্বদা কমপক্ষে একটি সম্পূর্ণ তির্যক চলমান হওয়া উচিত। ছাঁটাইয়ের জন্য দরকারী যা পূর্বের আন্দোলনের তুলনা প্রয়োজন।


ভি। এর জন্য উপরের সীমাটি নির্দেশ করার জন্য +1 ইলমারির পরামর্শটি আরও বিশদযুক্ত তবে আপনি দরকারী তথ্য সরবরাহ করছেন।
sam hocevar
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.