ওপেনজিএল: পুনরায় আকার প্রদর্শন এবং গ্লোঅर्थো / গ্লোভিউপোর্ট


16

আমি বেশ কয়েকটি উত্স থেকে এই প্রশ্নটি নিয়ে গবেষণা করেছি এবং এখনও দৃ firm় উত্তর খুঁজে পাইনি যে "হ্যাঁ এটি সঠিক চিন্তাভাবনা" বা "না, এখানে এটি কীভাবে হয়েছে"।

আমি ওপেনজিএল রেন্ডারিং সহ রেজোলিউশন স্বাধীনতা নিশ্চিত করার চেষ্টা করছি। আমার মনে হয় যেভাবে আমার এটি করা উচিত, তা হ'ল glOrthoআমি বিশ্বের যা স্থানাঙ্কীন হতে চাই তা ব্যবহার করে একটি অভিক্ষেপ তৈরি করা। উদাহরণস্বরূপ glOrtho(-50.0, 50.0, -50.0, 50.0, 1.0, -1.0),। এরপরে, ভিউপোর্টটি পর্দার রেজোলিউশনে সেট করুন , যেমন - glViewport(0, 0, 800, 600)। অবশেষে, যখনই উইন্ডোটি পুনরায় আকারের হয়, glViewportআপডেট হওয়া স্ক্রিন রেজোলিউশন সহ একটি কল করুন। এটি আপনার পরিসংখ্যানকে স্কেল করবে।

মডেলগুলি বিভিন্ন রেজোলিউশনে স্ক্রিন-স্পেসের একই অনুপাত গ্রহণ করে তা নিশ্চিত করার সঠিক উপায় কি? আমার কি রেজোলিউশনের সমান প্রজেকশন ব্যবহার করা উচিত? আমি কিছু উত্তর পেয়েছি যা বলছে glOrthoআপনার উইন্ডোর রেজোলিউশনটি ব্যবহার করা উচিত যখন অন্যরা বলেছিলেন এটি আলাদা হওয়া উচিত / হতে পারে।

থটস?

উত্তর:


20

আপনি যা বর্ণনা করেছেন তা সম্পূর্ণরূপে এবং উপযুক্তভাবে সমাধানের স্বাধীনতার জন্য। আপনার আঁকার যে কোনও কিছুই সত্যই আপনার উইন্ডোর একই অনুপাত গ্রহণ করবে।

তবে আপনি যদি এর বাইরে আরও কিছু না করেন তবে আপনার দিকের অনুপাতের সমস্যা হবে। উদাহরণস্বরূপ, আপনি যে সংখ্যা লিখেছেন তা প্রদত্ত, যদি আপনি একটি বৃত্ত আঁকেন তবে এটি স্কোয়াশ করা হবে - এটির চেয়ে লম্বা প্রশস্ত হবে কারণ আপনার অনুভূমিক স্কেল 800 / (50 + 50) = 8 এবং আপনার উল্লম্ব স্কেল 600 / (50++) 50) = 6।

এই সমস্যার কোনও স্বয়ংক্রিয় সমাধান হতে পারে না ; আপনি কোন গ্রাফিকাল ফলাফল চান তা চয়ন করতে হবে এবং গেমপ্লেতে এর প্রভাব বিবেচনা করবে। কিছু সাধারণ উদাহরণ:

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

    একই ধারণাটি 2D / 2.5D ভিউতেও প্রয়োগ করা যেতে পারে।

    (দ্রষ্টব্য যে এটি খেলোয়াড়কে প্রশস্ত তবে লম্বা নয় উইন্ডো তৈরি করে তাদের ক্ষেত্রটি অনুভূমিকভাবে প্রসারিত করতে দেয় This প্রতিযোগিতামূলক মাল্টিপ্লেয়ার গেমটিতে এটি অযাচিত হতে পারে))

  • যদি আপনার কাছে স্থির দিকের অনুপাতের সাথে ভিউপোর্ট-ফিলিং গ্রাফিক্স থাকে (উদাহরণস্বরূপ, একটি নন-স্ক্রোলিং 2 ডি ম্যাপ, বা আলংকারিক সীমানা), বা যদি আপনি অন্যথায় বিন্যাসটি পরিবর্তন করতে না পারেন তবে আপনাকে দুটি কালো বার থাকার মতো কিছু করতে হবে অব্যবহৃত স্থান পূরণ করার পক্ষগুলি।

    অথবা আপনি গ্রাফিকগুলি তৈরি করতে পারেন যা প্রান্তের চারপাশে থিম্যাটিকভাবে সামঞ্জস্যপূর্ণ ফিলার উপাদান রয়েছে যেগুলি গেমপ্লে ক্ষতিগ্রস্থ না করে ডিসপ্লেতে ফিট করতে পারে ped

  • অন্য গ্রাফিকের উপরে যদি আপনার এইচইডি থাকে, আপনি সিদ্ধান্ত নিতে পারেন যে প্রতিটি এইচইডি উপাদানটি উইন্ডোটির একটি অংশে (উপরে বাম, নীচের কেন্দ্র ইত্যাদি) স্থির করা হয়েছে এবং এর স্থানাঙ্কগুলি গণনা করুন; দিক অনুপাতের পরিবর্তনের 'প্রসারিত' এইচইউডি উপাদানগুলির মধ্যে 'সাদা স্থান' দ্বারা শোষিত হয়ে যায়।

বিষয়টির নির্দিষ্ট গণিত হিসাবে, আপনি যে রেজোলিউশন স্বাধীনতা করছেন, তা আপনাকে অনুপাতের অনুপাত, একটি একক সংখ্যা: দিয়ে শুরু করতে হবে width / height। উদাহরণস্বরূপ, উইন্ডোটি বর্গক্ষেত্র হলে এটি 1 হবে; এটি যদি 800 বাই 600 হয় তবে এটি 800/600 = 4/3 = 1.333̅ হবে ̅

উদাহরণস্বরূপ, ধরুন আপনি উইন্ডোগুলি প্রশস্ত করা হলে বাম এবং ডানদিকে অতিরিক্ত স্থান অর্জনের জন্য আপনি লিখেছেন অর্থগোগ্রাফিক প্রক্ষেপণ চান want আপনি এটির মতো এটি করতে পারেন:

float aspect = width / height;
glViewport(0, 0, width, height);
glOrtho(-50.0 * aspect, 50.0 * aspect, -50.0, 50.0, 1.0, -1.0);

এটি গ্যারান্টি দেয় যে, উইন্ডোগুলির জন্য কমপক্ষে প্রশস্ত আকারে লম্বা হওয়াতে, আপনি x এবং y স্থানাঙ্কগুলির সাথে -50 থেকে 50 এর মধ্যে আঁকেন এমন কোনও কিছুই দৃশ্যমান হবে।

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

float aspect = width / height;
glViewport(0, 0, width, height);
if (aspect >= 1.0)
  glOrtho(-50.0 * aspect, 50.0 * aspect, -50.0, 50.0, 1.0, -1.0);
else
  glOrtho(-50.0, 50.0, -50.0 / aspect, 50.0 / aspect, 1.0, -1.0);

নোট করুন যে দ্বিতীয় ক্ষেত্রে আমরা গুণফলের চেয়ে বিভাজন করি। এটি কেবলমাত্র কারণটির width / heightচেয়ে আমরা অনুপাতের অনুপাতটি গণনা করেছি height / width; আপনি যদি এইভাবে বুঝতে সহজ মনে করেন তবে পরস্পরকে গ্রহণ করুন।

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


খুব অন্তর্দৃষ্টিপূর্ণ প্রতিক্রিয়া জন্য আপনাকে ধন্যবাদ। যথেষ্ট পরিমাণে বাইরে আমার প্রশ্নের উত্তর।
ক্রিস হেন্ডারসন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.