উত্তর:
সংক্ষিপ্ত উত্তর
প্রথমে ভিউ ম্যাট্রিক্সটি উল্টে দিন। তারপরে শেষ সারি / কলাম থেকে অনুবাদটি আনুন।
দীর্ঘ উত্তর
ভিউ ম্যাট্রিক্সের বিষয়বস্তু হ্রাস করার একটি উপায় হ'ল ক্যামেরাটিকে বিশ্বের অন্য কোনও বিষয় হিসাবে বিবেচনা করে এবং এর জন্য বিশ্ব ম্যাট্রিক্স গণনা করে:
RightX RightY RightZ 0
UpX UpY UpZ 0
LookX LookY LookZ 0
PosX PosY PosZ 1
একটি বিশ্ব ম্যাট্রিক্স স্থানীয় স্থান থেকে বিশ্ব মহাকাশে স্থানাঙ্ক রূপান্তর করে forms তবে এই ক্ষেত্রে, ক্যামেরার লোকাল স্পেস এবং ভিউ স্পেস এক এবং একই, তাই আমরা এই ম্যাট্রিক্সটিও দর্শন স্থান থেকে বিশ্ব মহাকাশে স্থানাঙ্ককে রূপান্তরিত করতে পারি।
যেহেতু আমাদের বিপরীত দিকে রূপান্তর প্রয়োজন , তাই আমাদের ম্যাট্রিক্সটি উল্টাতে হবে। ফলস্বরূপ আমরা ভিউ ম্যাট্রিক্স বলি যা বিশ্ব স্থান থেকে স্থানে দেখার স্থানাঙ্কগুলিকে রূপান্তর করে:
RightX UpX LookX 0
RightY UpY LookY 0
RightZ UpZ LookZ 0
-(Pos*Right) -(Pos*Up) -(Pos*Look) 1 // * = dot product
এবং এটি আপনার কাছে ম্যাট্রিক্সের ধরণের। সুতরাং এ থেকে ক্যামেরার অবস্থানটি ফিরে পেতে, আপনাকে প্রথমে এটি উল্টাতে হবে এবং তারপরে আপনি শেষ সারিটি (বা সিস্টেমের উপর নির্ভর করে কলাম) থেকে অনুবাদটি ধরতে পারেন।
প্রথমে আমি খুব ভালভাবে কেবল ভেক্টর হিসাবে অবস্থান আলাদাভাবে সংরক্ষণের প্রস্তাব দিই, এটি গণনাগতভাবে বিষয়গুলিকে আরও সহজ করে তুলবে। যাইহোক ...
[x (dot) right, y (dot) up, z (dot) look]
আসল ভিউ ম্যাট্রিক্স নয়। ম্যাট্রিক্স নিজেই ফর্মের:
1, 0, 0, 0,
0, 1, 0, 0,
0, 0, 1, 0,
0, 0, 0, 1
যেখানে উপরের বাম 3x3 ম্যাট্রিক্স ঘূর্ণন, স্কেল ইত্যাদি উপস্থাপন করে সেখানে সমস্ত ক্যামেরার ওরিয়েন্টেশন এখানে সম্পন্ন হয় done বাকী সারি এবং কলামটি অনুবাদ এবং অন্য কিছু জটিল দৃষ্টিকোণ স্টাফের জন্য ব্যবহৃত হয় যা আমি এখনই getুকতে যাচ্ছি না।
আপনি যখন ম্যাট্রিক্স পেয়েছেন (এটি একটি 4x4 ম্যাট্রিক্স ধরে নিচ্ছেন), আপনার ম্যাট্রিক্স শ্রেণি সারি-প্রধান বা কলাম-প্রধান ক্রম কিনা তা নির্ভর করে অনুবাদ সর্বদা শেষ সারি বা শেষ কলামে সংরক্ষণ করা হবে।
আপনি সম্ভবত যা বিভ্রান্ত হয়ে যাচ্ছেন তা হ'ল আপনার বিন্দু পণ্যগুলির দরকার। যা চলছে তা হচ্ছে ম্যাট্রিক্স গণিতের সরলকরণ, এই স্ট্যাক ওভারফ্লো প্রশ্নে আরও বিস্তারিত উত্তর রয়েছে: /programming/349050/calculating-a-lookat-matrix
সমাধানটি এখানে পাওয়া যাবে , আপনাকে ম্যাট্রিক্সের বিপরীতটি নেওয়া উচিত এবং এর অনুবাদ পাওয়া উচিত:
Vector3 ViewTrans = Matrix.Invert(ViewMatrix).Translation;
Position = ViewTrans;
এখানে অন্যান্য উত্তরগুলি ক্যামেরা ম্যাট্রিক্স বিপরীত থেকে ক্যামেরার অবস্থান কীভাবে পাবেন তা ব্যাখ্যা করে।
যদি ক্যামেরা ম্যাট্রিক্সের 3x3 অংশের সাধারণত ঘূর্ণন থাকে (কোনও স্কেলিং বা শিয়ারিং না থাকে) তবে সাধারণত ক্যামেরা ঘূর্ণন স্থানান্তরিত করে ক্যামেরা ম্যাট্রিক্স অনুবাদকে গুণিত করে গণনাটি অনুকূল করা যায়। ক্যামেরার অবস্থানটি হ'ল রূপান্তরিত অনুবাদ ভেক্টর -1 দ্বারা গুণিত হয়। জিএলএসএল এ:
vec3 cameraPosition = -transpose(mat3(worldToCameraMatrix)) * worldToCameraMatrix[3].xyz;
অথবা
vec3 cameraPosition = -worldToCameraMatrix[3].xyz * mat3(worldToCameraMatrix);
আমি যদি আমার ইউনিট হিসাবে ক্যামেরার অবস্থানটি গণনা করতে এবং পাস করতে না চাই তবে আমি আমার ভার্টেক্স শেডারে এটি ব্যবহার করছি।