আমি কীভাবে ভিউপোর্টটিকে প্রসারিত / বিকৃতি থেকে আটকাতে পারি?


13

মূলত, আমি জানতে চাই যে যখন ভিউপোর্ট / উইন্ডোর আকার পরিবর্তন হয় তখন আমি কীভাবে রেন্ডার করা চিত্রটির বিকৃতি বা প্রসারিত চিত্র সরিয়ে ফেলতে পারি।

নীচের চিত্রগুলি বিকৃতি / প্রসারিতের উদাহরণ দিচ্ছি যার বিষয়ে আমি কথা বলছি:

আসল চিত্র (স্কোয়ার উইন্ডো)

কোনও বিকৃতি নেই

বিকৃত / প্রসারিত চিত্র (আয়তক্ষেত্রাকার উইন্ডো)

বিকৃতি সহ

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

কিভাবে এই কাজ করা যেতে পারে?

আমি চিত্রটি রেন্ডার করতে ওপেনজিএল নিয়ে কাজ করছি এবং আমি কলগুলির মাধ্যমে দৃষ্টিকোণ প্রজেকশনটি ব্যবহার করছি:

glMatrixMode(GL_PROJECTION)
glLoadIdentity()
gluPerspective(60, window.width/window.height, 0.01f, 100.0f)

দিকটি অনুপাতটি width/heightযে সমস্ত দস্তাবেজ / টিউটোরিয়াল আমি এসেছি তার সাথে সামঞ্জস্যপূর্ণ, তাই আমি এটি ভুল হওয়ার আশা করি না। তবে আমার সন্দেহ হ'ল এটি প্রসারিত সমস্যাটিকে প্রভাবিত করছে।


ভাবনার পরে

সত্যই, আমি বিষয়টি আরও ভাবছি বলে, আমি বিশ্বাস করতে পরিচালিত করেছি যে সমাধানটির মধ্যে fovy (y- দিকের দৃশ্যের ক্ষেত্র) কোণ এবং দিক-অনুপাতের মধ্যে সরাসরি সমানুপাতিক সম্পর্ক জড়িত।

দৃষ্টিভঙ্গি প্রজেকশন

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

তেমনিভাবে, প্রস্থে হ্রাসের জন্য ফভি কোনে হ্রাস প্রয়োজন requires

হালনাগাদ:

সুতরাং, আরও তদন্ত করার পরে, আমি দেখার মত হতাশাকে এভাবে সেট আপ করার পদ্ধতিটি পরিবর্তন করার সিদ্ধান্ত নিয়েছি:

gluPerspective(60 * (float)window.width/window.height, (float)window.width/window.height, 0.01f, 100.0f)

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

উত্তর:


14

আসলে, আসল প্রশ্নটি সমাধান থেকে 1 টি দূরে।

আসল কোড

glMatrixMode(GL_PROJECTION)
glLoadIdentity()
gluPerspective(60, window.width/window.height, 0.01f, 100.0f)

স্থির কোড

glMatrixMode(GL_PROJECTION)
glLoadIdentity()
gluPerspective(60, (float)window.width/window.height, 0.01f, 100.0f)

সমস্যাটি ছিল window.widthএবং window.heightএটি পূর্ণসংখ্যা, যার ফলে অনুপাত-অনুপাতটি একটি পূর্ণসংখ্যা বিভাগের ফলাফল হতে পারে।

একটি মাত্রাকে একটি ফ্লোটে কাস্ট করার ফলে ফলাফলটি পরিবর্তে ভাসমান-পয়েন্ট বিভাগ ব্যবহার করে।

কারণ অনুপাত-অনুপাত এখন সঠিক, মূল পোস্টে আর কোনও স্ট্রেচিং নেই।

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

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