আমি গ্রিডে ইউনিট অনুবাদ সহ একটি ছোট সমস্যাটির জন্য কিছুটা অন্তর্দৃষ্টি খুঁজছি।
আপডেট এবং সমাধান
আমি আমার নিজের সমস্যা সমাধান করেছি। বিস্তারিত জানার জন্য নীচে দেখুন। পোস্টের এই অংশে থাকা সমস্ত কিছুই সঠিক হতে পারে। যদি কিছু হয় তবে এটি পরবর্তী ব্যক্তির জন্য একটি ক্ষুদ্র টিউটোরিয়াল / উদাহরণ / সহায়তা হিসাবে কাজ করতে পারে।
সেটআপ
- এফবিও, ভিএও, ভিবিও
- 512x448 উইন্ডো
- 64x64 গ্রিড
gl_Position = projection * world * position;
projection
দ্বারা সংজ্ঞায়িত করা হয়ortho(-w/2.0f, w/2.0f, -h/2.0f, h/2.0f);
এটি একটি পাঠ্যপুস্তক অर्थোগোনাল প্রজেকশন ফাংশন।world
(0, 0) এ একটি স্থির ক্যামেরা অবস্থান দ্বারা সংজ্ঞায়িত করা হয়েছেposition
স্প্রাইটের অবস্থান দ্বারা সংজ্ঞায়িত করা হয়।
সমস্যা
নীচের স্ক্রিনশটে (1: 1 স্কেলিং) গ্রিডের ব্যবধানটি 64x64 এবং আমি ইউনিটটি অঙ্ক করছি (64, 64), তবে ইউনিটটি ভুল অবস্থানে প্রায় 10 ডলার করে। পিক্সেল আকারে যে কোনও বিকৃতি রোধ করতে আমি অভিন্ন উইন্ডো মাত্রা চেষ্টা করেছি, তবে এখন 1: 1 পিক্সেল-টু ওয়ার্ল্ড-ইউনিট প্রজেকশন সরবরাহ করতে আমি কিছুটা সঠিকভাবে হারিয়েছি। যাইহোক, সমস্যাটিতে সহায়তা করার জন্য এখানে কয়েকটি দ্রুত চিত্র দেওয়া হয়েছে।
ইঞ্জিনটি 64x অফসেট যা বিশ্বাস করে তাতে আমি একগুচ্ছ স্প্রিটকে অতি চাপিয়ে দেওয়ার সিদ্ধান্ত নিয়েছি।
যখন এটি জায়গা থেকে দূরে মনে হয়েছিল, আমি 1 ইউনিটের বেস কেসটি করেছি এবং করেছি। যা প্রত্যাশা অনুযায়ী লাইন আপ বলে মনে হচ্ছে। হলুদ চলাচলের মধ্যে 1px পার্থক্য দেখায়।
আমি যা চাই
আদর্শভাবে যেকোন দিকে যেতে 64৪-ইউনিট নিম্নলিখিত (আউটপুট চাপানো ইউনিট) আউটপুট হবে:
প্রান্তবিন্দু
এটি প্রদর্শিত হবে যে ভার্টেক্স শ্যাডারে প্রবেশ করা শীর্ষগুলি সঠিক। উদাহরণস্বরূপ, প্রথম চিত্রের রেফারেন্সে ডেটা ভিবিওতে এটির মতো দেখাচ্ছে:
x y x y
----------------------------
tl | 0.0 24.0 64.0 24.0
bl | 0.0 0.0 -> 64.0 0.0
tr | 16.0 0.0 80.0 0.0
br | 16.0 24.0 80.0 24.0
সম্পূর্ণতার জন্য এখানে উপরের আন্দোলনের সাথে সম্পর্কিত প্রকৃত অ্যারে রয়েছে:
x y z w r g b a s t
-------------------------------------------------------------
tl | 0.0 23.0 0.0 1.0 0.0 0.0 0.0 1.0 0.14210527 0.62650603
bl | 0.0 0.0 0.0 1.0 0.0 0.0 0.0 1.0 0.14210527 0.76506025
tr | 16.0 0.0 0.0 1.0 0.0 0.0 0.0 1.0 0.2263158 0.76506025
br | 16.0 23.0 0.0 1.0 0.0 0.0 0.0 1.0 0.2263158 0.62650603
-------------------------------------------------------------
-------------------------------------------------------------
tl | 64.0 24.0 0.0 1.0 0.0 0.0 0.0 1.0 0.0 0.21084337
bl | 64.0 0.0 0.0 1.0 0.0 0.0 0.0 1.0 0.0 0.3554217
tr | 80.0 0.0 0.0 1.0 0.0 0.0 0.0 1.0 0.08421053 0.3554217
br | 80.0 24.0 0.0 1.0 0.0 0.0 0.0 1.0 0.08421053 0.21084337
// side bar: I know that I have unnecessary data with having a z-axis.
// The engine flips between perspective and orthogonal and I
// haven't selectively started pruning data.
প্রজেকশন ম্যাট্রিক্স
512x448 উইন্ডোটির জন্য প্রজেকশন ম্যাট্রিক্স এর মতো দেখাচ্ছে:
0.00390625 0.0 0.0 0.0
0.0 0.004464286 0.0 0.0
0.0 0.0 -1.0 0.0
0.0 0.0 0.0 1.0
এবং একটি পাঠ্যপুস্তক অর্থ্থোনাল প্রক্ষেপণ ফাংশন দিয়ে নির্মিত:
ortho(-w/2.0f, w/2.0f, -h/2.0f, h/2.0f);
// explicitly: ortho(-512/2.0f, 512/2.0f, -448/2.0f, 448.0f
ortho(float left, float right, float bottom, float top)
{
projection.setIdentity();
projection.m00 = 2.0f / (right - left);
projection.m11 = 2.0f / (top - bottom);
projection.m22 = -1;
projection.m30 = -(right + left) / (right - left);
projection.m31 = -(top + bottom) / (top - bottom);
projection.m32 = 0;
}
ওয়ার্ল্ড-ভিউ ম্যাট্রিক্স
ক্যামেরার অবস্থানটি কেবল একটি অনুবাদ ম্যাট্রিক্স যা এই ক্ষেত্রে আমি কেবল -w / 2 এবং -h / 2 দ্বারা কেন্দ্রের তুলনায় শূন্য হতে অফসেট করি।
1.0 0.0 0.0 -256.0
0.0 1.0 0.0 -224.0
0.0 0.0 1.0 0.0
0.0 0.0 0.0 1.0
সমাধানগুলি আমি চেষ্টা করেছি
player.moveRight()
সমীকরণে অনুপাতযুক্ত অনুপাত সহ 1-ইউনিট স্থানান্তরিত করবে। তাই:gridWidth = 64 / 1.14f
। গ্রিডের মধ্যে চলাফেরার মানায় না।ম্যাচিং অर्थোগোনাল প্রজেকশন সহ 512x512 উইন্ডো জোর করে।
বিভিন্ন ম্যাজিক সংখ্যা চেষ্টা করে উভয়ের মধ্যে পারস্পরিক সম্পর্ক আঁকতে চেষ্টা করেছিলেন।
এই বলে যে, আমি বিশ্বাস করতে যাচ্ছি তা হ'ল আমি আমার আসল প্রজেকশনটি গুছিয়ে নিচ্ছি। সুতরাং, আমি 1: 1 পিক্সেল থেকে বিশ্ব-ইউনিট প্রজেকশন বজায় রাখার জন্য কোনও অন্তর্দৃষ্টি খুঁজছি।