আমি কীভাবে সঠিক ক্রমে আইসোমেট্রিক স্প্রিটগুলি বাছাই করব?


19

একটি সাধারণ শীর্ষ-ডাউন 2 ডি গেমটিতে চিত্রগুলি বাছাই করতে স্ক্রিন ওয়াই অক্ষ ব্যবহার করতে পারে। এই উদাহরণে গাছগুলি যথাযথভাবে বাছাই করা হয় তবে আইসোমেট্রিক দেয়াল হয় না:

উদাহরণ চিত্র: পর্দার y দ্বারা বাছাই করা

ওয়াল 2 প্রাচীর 1 এর নীচে এক পিক্সেল, সুতরাং এটি প্রাচীর 1 এর পরে আঁকা এবং শীর্ষে শেষ।

যদি আমি আইসোমেট্রিক ওয়াই অক্ষ দ্বারা বাছাই করে দেয়ালগুলি সঠিক ক্রমে উপস্থিত হয় তবে গাছগুলি তা দেয় না:

উদাহরণ চিত্র: আইসোমেট্রিক ওয়াই অনুসারে বাছাই করা

আমি কীভাবে এটি সঠিকভাবে করব?


3
পেইন্টারের অ্যালগোরিদমে আপনি সাধারণ সমস্যার সমাধান করেছেন বলে মনে হচ্ছে। "সাধারণ" সমাধানটি হল জেড-বাফার = ব্যবহার করা use কিছু কাজের ক্ষেত্রের মধ্যে কিছু কোণার পরিবর্তে সাজানো কী হিসাবে অবজেক্ট সেন্টার ব্যবহার করা অন্তর্ভুক্ত।
জারি কম্প্পা

উত্তর:


12

আইসোমেট্রিক গেমগুলি কার্যত 3 ডি হয়, সুতরাং অভ্যন্তরীণভাবে, আপনার গেমের প্রতিটি সত্তার জন্য 3 ডি স্থানাঙ্কগুলি সংরক্ষণ করা উচিত। আপনি যে প্রকৃত স্থানাঙ্কগুলি বেছে নিয়েছেন তা নির্বিচারে, তবে ধরা যাক এক্স এবং ওয়াই হ'ল স্থলভাগের দুটি অক্ষ এবং জেড স্থলভাগ থেকে বাতাসে is

রেন্ডারারের তখন স্ক্রিনে স্টাফ আঁকতে 2D এ প্রজেক্ট করা দরকার। "আইসোমেট্রিক" হ'ল এমনই একটি অভিক্ষেপ। আইসোমেট্রিকভাবে 3 ডি থেকে 2 ডি প্রজেক্ট করা খুব সহজ। ধরা যাক যে এক্স অক্ষটি প্রতিটি দুটি অনুভূমিক পিক্সেলের জন্য উপরের-বাম থেকে নীচে-ডানে এবং নীচে একটি পিক্সেল যায়। একইভাবে, ওয়াই অক্ষটি উপরের-ডান থেকে নীচে-বাম দিকে চলে যায়। জেড অক্ষটি সোজা উপরে উঠে যায়। 3D থেকে 2D তে রূপান্তরিত হওয়া এখন ঠিক:

function projectIso(x, y, z) {
    return {
        x: x - y,
        y: (x / 2) + (y / 2) - z
    };
}

এখন আপনার মূল প্রশ্ন, বাছাই। এখন যেহেতু আমরা আমাদের অবজেক্টের সাথে সরাসরি 3D তে কাজ করছি, বাছাই করা অনেক সহজ হয়ে যায়। আমাদের এখানে স্থানাঙ্ক স্থানে, দূরতম স্প্রাইটের সর্বনিম্ন x, y এবং z স্থানাঙ্ক রয়েছে (অর্থাত তিনটি অক্ষই পর্দা থেকে নির্দেশ করে) point সুতরাং আপনি তাদের যোগফল অনুসারে বাছাই করুন:

function nearness(obj) {
    return obj.x + obj.y + obj.z;
}

function closer(a, b) {
    if (nearness(a) > nearness(b)) {
        return "a";
    } else {
        return "b";
    }
}

আপনার সত্তা প্রতিটি ফ্রেমে পুনরায় বাছাই এড়ানোর জন্য, এখানে বিশদভাবে একটি কবুতরহোল বাছাই করুন


1
আমি জানি এটি পুরানো, একটি ভাল শুরু কিন্তু আপনি কি জানেন কীভাবে কোনও অবজেক্টের 3 ডি সীমানাও কেবল কেবল তার অনুবাদেই অন্তর্ভুক্ত করা যায় না। যখন তারা ওভারল্যাপিং করে গভীরতা বাছাই করা আরও জটিল হয়ে ওঠে।
রব

4

ধরে নিই যে আপনার স্প্রিটগুলি টাইলসের সেটগুলি দখল করেছে যা আয়তক্ষেত্রযুক্ত (যদি তারা স্বেচ্ছাচারী সেটগুলি দখল করে থাকে, তবে আপনি সাধারণ ক্ষেত্রে একেবারে সঠিকভাবে আঁকতে পারবেন না), সমস্যাটি হ'ল উপাদানগুলির মধ্যে সামগ্রিক অর্ডার সম্পর্ক নেই, সুতরাং আপনি বাছাই করতে পারবেন না এগুলি এমন একটি বাছাই ব্যবহার করে যার ফলশ্রুতি O (nlogn) হয় in

নোট করুন যে কোনও দুটি এবং A এবং B এর জন্য, A কে B (A <- B) এর আগে আঁকতে হবে, B কে A (B <- A) এর আগে আঁকতে হবে বা সেগুলি কোনও ক্রমে আঁকতে পারে। তারা একটি আংশিক আদেশ গঠন। আপনি যদি 3 টি ওভারল্যাপিং অবজেক্টগুলির সাথে নিজেকে কয়েকটি উদাহরণ আঁকেন তবে আপনি খেয়াল করতে পারেন যে 1 ম এবং 3 য় বস্তুটি ওভারল্যাপ নাও হতে পারে, সুতরাং সরাসরি নির্ভরতা না থাকলেও তাদের অঙ্কন ক্রমটি তাদের মধ্যে থাকা 2 য় বস্তুর উপর নির্ভর করে - নির্ভর করে কীভাবে আপনি এটি স্থাপন, আপনি বিভিন্ন অঙ্কন আদেশ পাবেন। বটমলাইন - traditionalতিহ্যবাহী প্রকারগুলি এখানে কাজ করে না।

একটি সমাধান হ'ল তুলনাটি (দানি দ্বারা উল্লিখিত) ব্যবহার করা এবং প্রতিটি বস্তুকে একে অপরের সাথে তার নির্ভরতা নির্ধারণ এবং নির্ভরতা গ্রাফ (যা একটি ডিএজি হবে) গঠন করার জন্য তুলনা করা। তারপরে অঙ্কনের ক্রম নির্ধারণের জন্য গ্রাফের একটি টপোলজিকাল সাজান। যদি খুব বেশি অবজেক্ট না থাকে তবে এটি যথেষ্ট দ্রুত হতে পারে (এটি O(n^2))।

আরেকটি সমাধান হ'ল একটি (ভারসাম্য দেওয়ার জন্য - সিউডো ) কোয়াড ট্রি ব্যবহার এবং এতে সমস্ত বস্তুর আয়তক্ষেত্র সংরক্ষণ করা।

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

তবে আপনি এড়াতে পারেন। আপনি অবজেক্টগুলির একটি তালিকা Q এবং অবজেক্টের একটি টেবিল ব্যবহার করেন You আপনি এক্স-অক্ষের (এক সারি) উপর ছোট থেকে বড় মানের সমস্ত দৃশ্যমান স্লটগুলি y- অক্ষের উপর সারি সারি রেখে পুনরাবৃত্তি করুন। যদি সেই স্লটে কোনও বস্তুর নীচের কোণে থাকে তবে নির্ভরতা নির্ধারণের জন্য উপরের পদ্ধতিটি করুন। কোনও অবজেক্ট এক্স যদি অন্য কোনও অবজেক্ট Y এর উপর নির্ভর করে যা আংশিকভাবে এর উপরে থাকে (Y <- এক্স), এবং এই জাতীয় প্রতিটি Y ইতিমধ্যে Q এ থাকে, তবে এক্সকে যুক্ত করুন। যদি এমন কিছু Y থাকে যা Q তে নেই, তবে এক্স যুক্ত করুন টি এবং বোঝান যে ওয়াই <- এক্স। প্রতিবার আপনি কিউতে কোনও বস্তু যুক্ত করলে আপনি টি-তে থাকা অবজেক্টের নির্ভরতা সরিয়ে ফেলেন all সমস্ত নির্ভরতা সরিয়ে ফেলা হলে, টি থেকে কোনও বস্তু কিউতে স্থানান্তরিত হয়

আমরা ধরে নিচ্ছি যে অবজেক্ট স্প্রাইটগুলি তাদের স্লটগুলি নীচে, বাম বা ডানদিকে উঁকি দেয় না (কেবল শীর্ষে, আপনার ছবিতে গাছের মতো)। এটি বৃহত সংখ্যক অবজেক্টের জন্য কর্মক্ষমতা উন্নত করা উচিত। এই পদ্ধতির আবার হবে O(n^2), তবে শুধুমাত্র সবচেয়ে খারাপ ক্ষেত্রে অদ্ভুত আকারের অবজেক্ট এবং / অথবা অবজেক্টগুলির অদ্ভুত কনফিগারেশন অন্তর্ভুক্ত। বেশিরভাগ ক্ষেত্রে, এটি O(n * logn * sqrt(n))। আপনার স্প্রাইটের উচ্চতা জেনে যাওয়া এটিকে দূর করতে পারে sqrt(n), কারণ আপনাকে উপরের পুরো স্ট্রাইপটি পরীক্ষা করতে হবে না। স্ক্রিনে অবজেক্টের সংখ্যার উপর নির্ভর করে আপনি কোয়াড ট্রি প্রতিস্থাপনের জন্য অ্যারে দিয়ে চেষ্টা করতে পারেন যে কোন স্লট নেওয়া হয়েছে (অনেকগুলি বস্তু থাকলে তা বোঝা যায়)।

শেষ পর্যন্ত, কিছু ধারণার জন্য এই উত্স কোডটি নির্দ্বিধায় নির্দ্বিধায় অনুভব করুন: https://github.com/axel22/sages/blob/master/src/gui/scala/name/brijest/sages/gui/Canvas.scala


2

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

আপনার সম্ভবত প্রতি টাইল স্ক্রিন Y অনুসারে বাছাই করা উচিত এবং আরও জটিল যে কোনও কিছুই হ'ল "ডিজাইনের সমস্যা"। উদাহরণস্বরূপ, আপনি যদি বিষয়বস্তুটি লেখার চেষ্টা করছেন তবে সমস্যাটি সমাধানের জন্য আপনার ডিজাইনারদের কেবল বাছাই করা অ্যালগরিদমকে এবং প্রাচীর 2 2 পিক্সেলকে উপরে উঠিয়ে দিতে বলুন। আমি যে আইসোমেট্রিক গেমটিতে কাজ করেছি সেভাবে আমাদের এটি ঠিক করতে হয়েছিল। এর মধ্যে "দীর্ঘ" আইটেম নেওয়া এবং সেগুলি টাইল-আকারের অংশগুলিতে ভাঙা অন্তর্ভুক্ত থাকতে পারে।

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


2

পারফেক্ট আইসোমেট্রিক বাছাই করা শক্ত। তবে আপনার আইটেমগুলিকে সঠিকভাবে সাজানোর জন্য প্রথম পদ্ধতির জন্য আপনার প্রতিটি ওভারল্যাপিং অবজেক্টের সাথে আরও জটিল তুলনা ফাংশন ব্যবহার করা উচিত। এই ক্রিয়াকলাপটি এই শর্তটি অবশ্যই পরীক্ষা করবে: একটি ওভারল্যাপিং অবজেক্ট "এ" "বি" এর পিছনে রয়েছে যদি:

(a.posX + a.sizeX <= b.posX) বা (a.posY + a.sizeY <= b.posY) বা (a.posZ + a.sizeZ <= b.posZ)

অবশ্যই, এটি একটি নিষ্পাপ আইসোমেট্রিক প্রয়োগের জন্য প্রথম ধারণা। আরও জটিল দৃশ্যের জন্য (আপনি যদি ঘূর্ণন দেখতে চান, জেড-অক্ষে প্রতি পিক্সেল অবস্থান ইত্যাদি) আপনার আরও শর্ত পরীক্ষা করতে হবে।


+1, যদি আপনার বিভিন্ন প্রস্থ / উচ্চতা সহ টাইলস থাকে তবে এই উত্তরের তুলনা ফাংশনটি দেখুন।
মুচাহো

2

আমি একটি খুব সাধারণ সূত্র ব্যবহার করি যা ওপেনজিএলে আমার ছোট আইসোমেট্রিক ইঞ্জিনের সাথে ভাল কাজ করে:

আপনার প্রতিটি বস্তুর (গাছ, মেঝে টাইলস, অক্ষর, ...) স্ক্রিনে একটি এক্স এবং ওয়াই অবস্থান রয়েছে। আপনাকে ডিপথ টেস্টিং সক্ষম করতে হবে এবং প্রতিটি মানের জন্য ভাল জেড মান খুঁজে পেতে হবে। আপনি কেবল নিম্নলিখিতটি করতে পারেন:

z = x + y + objectIndex

আমি মেঝে এবং অবজেক্টগুলির জন্য পৃথক সূচক ব্যবহার করি যা মেঝে উপরে হবে (মেঝেটির জন্য 0 এবং উচ্চতাযুক্ত সমস্ত বস্তুর জন্য 1)। এটি ঠিক কাজ করা উচিত।



1

যদি আপনি একই এক্স অবস্থানে y মানগুলি তুলনা করেন তবে এটি প্রতিবার কাজ করবে। সুতরাং, কেন্দ্রের সাথে কেন্দ্রে তুলনা করবেন না। পরিবর্তে একটি স্প্রাইটের কেন্দ্রটিকে অন্য স্প্রাইটের একই x অবস্থানের সাথে তুলনা করুন।

এখানে চিত্র বর্ণনা লিখুন

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

একটি সহজ পদ্ধিতি হল সমস্ত স্প্রিটকে তিনটি গ্রুপে বিভক্ত করা: এক্স অক্ষের সাথে তির্যক, y অক্ষ এবং বরাবর সমতল। যদি দুটি অবজেক্ট একই অক্ষের সাথে উভয় তির্যক হয়, তবে অন্য অক্ষের উপর ভিত্তি করে এগুলি সাজান।


0

আপনাকে একই ধরণের সমস্ত অবজেক্টের জন্য অনন্য আইডি নির্ধারণ করতে হবে। তারপরে আপনি সমস্ত বস্তুকে তাদের অবস্থান অনুসারে বাছাই করুন এবং তাদের আইডির ক্রম অনুসারে বস্তুর গোষ্ঠী আঁকুন। সুতরাং গ্রুপ এ এর ​​1 টি বস্তু কখনই গ্রুপ এ ইত্যাদিতে 2 অবজেক্টকে ছাড়বে না etc.


0

এটি আসলে কোনও উত্তর নয়, তবে কেবল একটি ভাষ্য এবং একটি আপ-ভোট আমি এই অক্ষর 22 এর উত্তরটি এখানে দিতে চাই /gamedev//a/8181/112940

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

আমার ইঞ্জিনে আমি "পুরানো-স্কুল", খাঁটি 2D জিনিসগুলি করতে চেয়েছিলাম। এবং আমি আমার মস্তিষ্ককে আবদ্ধ করার চেষ্টা করে অনেক সময় ব্যয় করেছি যাতে আমার কলটি "সাজান" কেন (আমার ক্ষেত্রে এটি সি ++ স্ট্যান্ড :: সাজান) নির্দিষ্ট মানচিত্রের কনফিগারেশনে সঠিকভাবে কাজ করছে না।

আমি যখন বুঝতে পারি যে এটি "আংশিক ক্রম" পরিস্থিতি তখনই ছিল যে আমি এটি সমাধান করতে সক্ষম হয়েছি।

এখন পর্যন্ত ওয়েবে যে সমস্ত কার্যনির্বাহী সমাধান খুঁজে পেয়েছি সেগুলি সমস্যার সাথে সঠিকভাবে মোকাবিলা করার জন্য কিছু প্রকার টপোলজিকাল বাছাই করে ব্যবহার করেছে। টপোলজিকাল বাছাই করার উপায় মনে হচ্ছে।

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