আপনি কীভাবে সাব-পিক্সেল ইনক্রিমেন্টে একটি স্প্রিট স্থানান্তর করবেন?


11

পিক্সেল হয় হয় বা বন্ধ হয়। আপনি একটি স্প্রিটকে ন্যূনতম পরিমাণে স্থানান্তর করতে পারেন তা একক পিক্সেল। সুতরাং আপনি কীভাবে স্প্রাইটে প্রতি ফ্রেমে 1 পিক্সেলের চেয়ে ধীর গতিতে স্থানান্তরিত করবেন?

আমি যেভাবে এটি করেছি তা ছিল একটি পরিবর্তনশীলতে গতি যুক্ত করা এবং এটি 1 (বা -1) এ পৌঁছায় কিনা তা পরীক্ষা করে দেখানো। যদি এটি হয় তবে আমি স্প্রিটটি সরিয়ে নিয়ে চলকটিকে 0 তে পুনরায় সেট করব:

update(dt):
    temp_dx += speed * dt
    temp_dy += speed * dt

    if (temp_dx > 1)
        move sprite
        reset temp_dx to 0
    if (tempy_dy > 1)
        move sprite
        reset temp_dy to 0

আমি এই পদ্ধতিকে অপছন্দ করলাম কারণ এটি নির্বোধ বোধ করে এবং স্প্রিটের চলাচল খুব সংকীর্ণ বলে মনে হয়। তাহলে আপনি কীভাবে উপ-পিক্সেল চলাচল বাস্তবায়ন করবেন?


কেবলমাত্র আপনি যা করতে পারেন তা হ'ল বিলিনিয়ার ফিল্টারিং।
আতুরস্যামস

আপনি যদি প্রতি ফ্রেমে 1 পিএক্স এর চেয়ে কম সরিয়ে চলেছেন তবে এটি কীভাবে বিড়বিড় দেখাচ্ছে?

উত্তর:


17

এখানে অনেকগুলি বিকল্প রয়েছে:

  1. আপনি যেমন করেন তেমন করুন। আপনি ইতিমধ্যে বলেছেন যে এটি মসৃণ দেখাচ্ছে না। যদিও আপনার বর্তমান পদ্ধতির সাথে কিছু ত্রুটি রয়েছে। জন্য x, আপনি নিম্নলিখিত ব্যবহার করতে পারেন:

    tempx += speed * dt
    
    while (tempx > 0.5)
      move sprite to x+1
      tempx -= 1
    while (tempx < -0.5)
      move sprite to x-1
      tempx += 1
    

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

  2. আপনার স্প্রাইটের জন্য একাধিক গ্রাফিক্স রয়েছে এবং সাবপিক্সেল অফসেটের উপর নির্ভর করে একটি আলাদা একটি ব্যবহার করুন। শুধুমাত্র x এর মধ্যে মসৃণকরণ subpixel করার জন্য, উদাহরণস্বরূপ, যদি আপনি আপনার পরী জন্য গ্রাফিক তৈরী করতে পারে x+0.5, এবং অবস্থান: মধ্যে হলে x+0.25এবং x+0.75আপনার মূল পরিবর্তে এই পরী ব্যবহার করুন। আপনি যদি সূক্ষ্ম অবস্থান নিতে চান তবে আরও উপ-পিক্সেল গ্রাফিক্স তৈরি করুন। যদি আপনি এটি করেন xএবং yআপনার রেন্ডারিংগুলির সংখ্যা দ্রুত বেলুন করতে পারে, কারণ অন্তরগুলির সংখ্যার বর্গক্ষেত্রের সাথে সংখ্যা স্কেল হিসাবে: একটি ব্যবধানে 0.54 রেন্ডারিংয়ের 0.25প্রয়োজন হয়, 16 টির প্রয়োজন।

  3. Supersample। সাবপিক্সেল রেজোলিউশন সহ একটি চিত্র তৈরি করার এটি একটি অলস (এবং সম্ভাব্য খুব ব্যয়বহুল) উপায়। অবশ্যই, দ্বিগুণ (বা আরও) যে রেজোলিউশনে আপনি আপনার দৃশ্যের রেন্ডার করেন, তারপরে রানটাইমে এটিকে কমিয়ে দিন। আমি এখানে যত্নের পরামর্শ দেব, কারণ পারফরম্যান্স দ্রুত হ্রাস পেতে পারে। এটি করার একটি কম আগ্রাসী উপায় হ'ল আপনার স্প্রিটকে অতিমাত্রায় নমুনা করা এবং রানটাইম এ ডাউনস্কেল করা।

  4. জেহেলভিওনের পরামর্শ অনুসারে , এটি হতে পারে যে আপনি যে প্ল্যাটফর্মটি ইতিমধ্যে ব্যবহার করছেন সেটি এটি সমর্থন করে। যদি আপনাকে অ-পূর্ণসংখ্যার x এবং y সহ-আদেশ নির্দিষ্ট করার অনুমতি দেওয়া হয় তবে টেক্সচার ফিল্টারিং পরিবর্তন করার বিকল্প থাকতে পারে। নিকটতম-প্রতিবেশী প্রায়শই ডিফল্ট হয় এবং এটি "বিড়বিড়" আন্দোলনের কারণ ঘটায়। অন্যান্য ফিল্টারিং (লিনিয়ার / কিউবিক) এর ফলে অনেক মসৃণ প্রভাব পাওয়া যায়।

২. ৩ এবং ৪ এর মধ্যে পছন্দ আপনার গ্রাফিক্স কীভাবে প্রয়োগ করা হয় তার উপর নির্ভর করে। গ্রাফিক্সের একটি বিটম্যাপ স্টাইল প্রাক-রেন্ডারিংকে আরও ভাল করে স্যুট করে, অন্যদিকে কোনও ভেক্টর স্টাইল স্প্রিট সুপারসাম্পলিংয়ের জন্য উপযুক্ত হতে পারে। যদি আপনার সিস্টেম এটিকে সমর্থন করে, ৪।


অপারেটিং 1-তে প্রান্তিকাকে 0.5 দ্বারা প্রতিস্থাপন করবেন কেন? আপনি বিবৃতিগুলিকে কিছুক্ষণ লুপে সরিয়ে নিয়েছেন তাও আমি পাই না। আপডেট ফাংশন প্রতি টিক একবার কল করা হয়।
বিজেআরআর

1
ভাল প্রশ্ন - আমি আপনার মন্তব্যের ভিত্তিতে উত্তরটি পরিষ্কার করে দিয়েছি।
জেজ

সুপার স্যাম্পলিং "অলস" হতে পারে তবে অনেক ক্ষেত্রে 2x বা 4x ওভার স্যাম্পলিংয়ের পারফরম্যান্স ব্যয় কোনও বিশেষ সমস্যা হবে না, বিশেষত যদি এটি রেন্ডারিংয়ের অন্যান্য দিকগুলি সরল করার অনুমতি দেয়।
সুপারক্যাট

বড় বাজেটের গেমগুলিতে আমি সাধারণত 3 টি এন্টি-এলিয়জিং হিসাবে গ্রাফিক্স সেটিংসে তালিকাবদ্ধ বিকল্প হিসাবে দেখি।
কেভিন

1
@ কেভিন: আপনি সম্ভবত না। বেশিরভাগ গেমগুলিতে মাল্টিসেপলিং ব্যবহার করা হয় যা কিছুটা আলাদা। অন্যান্য রূপগুলিও সাধারণত ব্যবহৃত হয়, যেমন: বিভিন্ন কভারেজের পাশাপাশি গভীরতার নমুনাগুলি। টুকরোগুলি শেডার প্রয়োগের ব্যয়ের কারণে সুপারসাম্পলিং প্রায়শই করা হয় না।
imallett

14

একটি উপায় যার মাধ্যমে অনেকগুলি পুরানো-কুল গেমগুলি এই সমস্যার সমাধান করে (বা লুকিয়েছিল) তা ছিল স্প্রিটকে প্রাণবন্ত করে তোলা।

এটি হ'ল, যদি আপনার স্প্রাইট প্রতি ফ্রেমে প্রতি পিক্সেলের চেয়ে কম স্থানান্তরিত হতে চলেছিল (বা, বিশেষত, যদি পিক্সেল / ফ্রেমের অনুপাত 3 ফ্রেমের মধ্যে 2 পিক্সেলের মতো অদ্ভুত কিছু হতে পারে), আপনি একটি এন তৈরি করে ঝাঁকুনিটি লুকিয়ে রাখতে পারেন ফ্রেম অ্যানিমেশন লুপ, those এন ফ্রেমগুলির উপরে, কিছু কে < এন পিক্সেল দ্বারা স্প্রিটটি সরিয়ে নিয়েছে ।

মুল বক্তব্যটি হ'ল, যতক্ষণ না স্প্রাইট সর্বদা প্রতিটি ফ্রেমের কোনও না কোনও পথে সরে যায় , এমন কোনও একক ফ্রেম কখনও হবে না যেখানে পুরো স্প্রাইটটি হঠাৎ করে এগিয়ে যায় "ঝাঁকুনি"।


এটি চিত্রিত করার জন্য আমি কোনও পুরানো ভিডিও গেমের থেকে একটি আসল স্প্রিট খুঁজে পাইনি (যদিও আমি মনে করি যেমন লেমিংস থেকে কিছু খননকারী অ্যানিমেশনগুলি এর মতো ছিল) তবে দেখা গেছে যে কনওয়ের গেম অফ লাইফের "গ্লাইডার" প্যাটার্নটি একটি করে তোলে খুব সুন্দর চিত্র:

এখানে চিত্র বর্ণনা লিখুন
সিসি-বাই-এসএ 3.0 লাইসেন্সের আওতায় ব্যবহৃত কিফ / উইকিমিডিয়া কমন্স দ্বারা অ্যানিমেশন

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


2
যদি বেগটি স্থির হয়, বা ফ্রেম প্রতি এটি 1/2 পিক্সেলের চেয়ে কম হয়, বা অ্যানিমেশনটি "বৃহত" যথেষ্ট এবং দ্রুত গতিতে ভিন্নতাগুলিকে অস্পষ্ট করার জন্য যথেষ্ট তবে এটি একটি দুর্দান্ত পদ্ধতি is
সুপারক্যাট

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

6

স্প্রাইটের অবস্থানটি একটি ভাসমান পয়েন্ট পরিমাণ হিসাবে রাখা উচিত, এবং প্রদর্শনের ঠিক আগে একটি পূর্ণসংখ্যার সাথে গোল করা উচিত।

আপনি সুপার রেজোলিউশনে স্প্রিটটি বজায় রাখতে এবং প্রদর্শনের আগে স্প্রাইটটিকে ডাউনসাম্পল করতে পারেন। যদি আপনি 3x ডিসপ্লে রেজোলিউশনে স্প্রিটটি বজায় রাখেন তবে স্প্রাইটের সাবপিক্সেল অবস্থানের উপর নির্ভর করে আপনার কাছে 9 টি ভিন্ন প্রকৃত স্প্রাইট রয়েছে।


3

এখানে আসল সমাধানটি হ'ল বিলিনিয়ার ফিল্টারিং ব্যবহার করা। ধারণাটি হ'ল জিপিইউ এর সাথে ওভারল্যাপ করা চারটি স্প্রাইট পিক্সেলের উপর ভিত্তি করে প্রতিটি পিক্সেলের মান গণনা করতে দেয়। এটি একটি সাধারণ এবং কার্যকর কৌশল। আপনার কেবল একটি টেক্সচার হিসাবে 2 ডি-প্লেইন (একটি বিলবোর্ড) এ স্প্রিট স্থাপন করতে হবে; তারপরে এই সমভূমিগুলি রেন্ডার করতে GPU ব্যবহার করুন। এটি ভালভাবে কাজ করে তবে কিছুটা অস্পষ্ট ফলাফল পাওয়ার প্রত্যাশা এবং আপনি যদি এটির জন্য লক্ষ্য রাখছিলেন তবে 8-বিট বা 16-বিট চেহারা হারাবেন।

পেশাদাররা:

ইতিমধ্যে কার্যকর, খুব দ্রুত, হার্ডওয়্যার ভিত্তিক সমাধান।

কনস:

8-বিট / 16-বিট বিশ্বস্ততা হ্রাস।


1

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

যাইহোক আপনি বর্তমানে যা করছেন তার অন্য উপায় রয়েছে তবে জার্কি থেকে কিছুটা কম: নির্দিষ্ট পয়েন্ট। একটি 32 বিট অবস্থানের মান 0 থেকে 4,294,967,295 এর মধ্যে মানগুলি উপস্থাপন করতে পারে যদিও আপনার স্ক্রিনটিতে প্রায় প্রতিটি অক্ষের সাথে প্রায় 4k পিক্সেলের কম রয়েছে। সুতরাং মাঝখানে একটি স্থির "বাইনারি পয়েন্ট" (দশমিক পয়েন্ট সহ উপমা অনুসারে) রাখুন এবং আপনি পিক্সেল অবস্থানগুলি 0-65536 থেকে উপ-পিক্সেল রেজোলিউশনের আরও 16 বিট দিয়ে প্রতিনিধিত্ব করতে পারেন। তারপরে আপনি সংখ্যাটিকে স্বাভাবিক হিসাবে যুক্ত করতে পারেন, আপনাকে যখনই স্ক্রিন স্পেসে রূপান্তর করতে হবে বা যখন আপনি দুটি সংখ্যাকে একসাথে গুন করেছেন তখন ডান শিফট করে আপনাকে রূপান্তর করতে হবে।

(আমি যেদিন 16-বিট ফিক্সড পয়েন্টে 3 ডি ইঞ্জিনটি লিখেছিলাম যখন আমার কোনও ইন্টেল 386 ছিল কোনও ভাসমান বিন্দুর ইউনিট ছিল না It এটি ফ্রেম প্রতি 200 ফোং-শেডযুক্ত বহুভুজগুলির অন্ধ গতি অর্জন করেছিল))


1

এখানে অন্যান্য উত্তরগুলি ছাড়াও আপনি কিছুটা দূরে থাকা ব্যবহার করতে পারেন। স্নিগ্ধ প্রান্তের জন্য ব্যাকগ্রাউন্ড তৈরির সাথে মিলিয়ে কোনও বস্তুর পিক্সেলের প্রান্ত হালকা / গাer় বর্ণের হয় ither উদাহরণস্বরূপ, বলুন যে আপনার কাছে 4 পিক্সেল বর্গক্ষেত্র ছিলাম যার সাথে আমি প্রায়:

OO
OO

আপনি যদি এই 1/2 ডানদিকে একটি পিক্সেল সরানো হয়, কিছুই সত্যিই সরানো হবে না। তবে কিছুটা ঝুঁকির সাথে আপনি কিছুটা আন্দোলনের মায়া তৈরি করতে পারেন। ওকে কালো এবং ওকে ধূসর হিসাবে বিবেচনা করুন, তাই আপনি করতে পারেন:

oOo
oOo

এক ফ্রেমে এবং

 OO
 OO

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

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