গ্রিডে অর্থোগ্রাফিক ইউনিট অনুবাদ মিল নেই (যেমন 64৪ পিক্সেল ভুলভাবে অনুবাদ করে)


14

আমি গ্রিডে ইউনিট অনুবাদ সহ একটি ছোট সমস্যাটির জন্য কিছুটা অন্তর্দৃষ্টি খুঁজছি।

আপডেট এবং সমাধান

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

সেটআপ

  • এফবিও, ভিএও, ভিবিও
  • 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 পিক্সেল-টু ওয়ার্ল্ড-ইউনিট প্রজেকশন সরবরাহ করতে আমি কিছুটা সঠিকভাবে হারিয়েছি। যাইহোক, সমস্যাটিতে সহায়তা করার জন্য এখানে কয়েকটি দ্রুত চিত্র দেওয়া হয়েছে।

512x448 উইন্ডোতে 64x64 টাইলস

ইঞ্জিনটি 64x অফসেট যা বিশ্বাস করে তাতে আমি একগুচ্ছ স্প্রিটকে অতি চাপিয়ে দেওয়ার সিদ্ধান্ত নিয়েছি।

Off৪ অফসেট সুপার-চাপিয়ে দেওয়া

যখন এটি জায়গা থেকে দূরে মনে হয়েছিল, আমি 1 ইউনিটের বেস কেসটি করেছি এবং করেছি। যা প্রত্যাশা অনুযায়ী লাইন আপ বলে মনে হচ্ছে। হলুদ চলাচলের মধ্যে 1px পার্থক্য দেখায়।

1 ইউনিটের বেস কেস

আমি যা চাই

আদর্শভাবে যেকোন দিকে যেতে 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

সমাধানগুলি আমি চেষ্টা করেছি

  1. player.moveRight()সমীকরণে অনুপাতযুক্ত অনুপাত সহ 1-ইউনিট স্থানান্তরিত করবে। তাই: gridWidth = 64 / 1.14f। গ্রিডের মধ্যে চলাফেরার মানায় না।

  2. ম্যাচিং অर्थোগোনাল প্রজেকশন সহ 512x512 উইন্ডো জোর করে।

  3. বিভিন্ন ম্যাজিক সংখ্যা চেষ্টা করে উভয়ের মধ্যে পারস্পরিক সম্পর্ক আঁকতে চেষ্টা করেছিলেন।

এই বলে যে, আমি বিশ্বাস করতে যাচ্ছি তা হ'ল আমি আমার আসল প্রজেকশনটি গুছিয়ে নিচ্ছি। সুতরাং, আমি 1: 1 পিক্সেল থেকে বিশ্ব-ইউনিট প্রজেকশন বজায় রাখার জন্য কোনও অন্তর্দৃষ্টি খুঁজছি।


5
ভাল নির্মিত প্রশ্ন, কিন্তু আমরা আপনার প্রজেকশন এবং ওয়ার্ল্ড ম্যাট্রিক্স দেখতে পেতাম। আপনি উপরে তাদের উল্লেখ করেছেন, তবে তাদের সামগ্রীগুলি অন্তর্ভুক্ত করেননি। সমস্যাটি সেই ম্যাট্রিকগুলির মধ্যে একটির সাথেই থাকবে।
কেন

@ কেন কোনও সমস্যা নেই। আমি আমার অভিক্ষেপ এবং ওয়ার্ল্ড-স্পেস ভিউ ম্যাট্রিক্স যুক্ত করেছি। আমি সমস্যাটিতে আমার পছন্দসই আউটপুট এবং নিজের প্রচেষ্টাও অন্তর্ভুক্ত করেছি।
জাস্টিন ভ্যান হর্ন

আপনি তাকান ভাল ম্যাট্রিক্স (আমি তাদের তুলনায় বেশী এখানে খড় এ glOrtho এবং glTranslate Grapsing দ্বারা উৎপন্ন কিন্তু কলাম-প্রধান সাজানো করার OpenGL তার ম্যাট্রিক্স আশা, আপনি একই করছেন।?
কেন

এইচএম, সেগুলি কলাম-প্রধান ক্রম সংরক্ষণ করা হচ্ছে।
জাস্টিন ভ্যান হর্ন

উত্তর:


5

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

প্রথমত, এটি দেখা যাচ্ছে যে উপরের সমস্ত কিছুই আসলে সঠিক এবং আমি যে পদক্ষেপটি রেখেছিলাম তা ছিল সমস্যা।

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

Sillyness

এটি কারও সময় নিলে আমি দুঃখিত। আমি এই প্রশ্নটি যে কারও পক্ষে অজানা ছাড়াই একই সমস্যার মধ্যে চলে যেতে পারে তার পক্ষে ভাল ব্যবস্থা হিসাবে ছেড়ে দেব।

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