বিশ্বের স্থান থেকে পর্দার স্থান


10

আমি একটি 2 ডি গেম লিখছি যেখানে আমার গেমের জগতের এক্স অক্ষগুলি বাম থেকে ডানদিকে চলছে , y অক্ষগুলি উপরে থেকে নীচে চলছে এবং z অক্ষটি পর্দার বাইরে চলেছে:

এখানে চিত্র বর্ণনা লিখুন

আমার গেমের জগতটি টপ-ডাউন হয়ে গেলেও গেমটি সামান্য কাত করে দেওয়া হয়:

এখানে চিত্র বর্ণনা লিখুন

আমি বিশ্ব স্পেস থেকে স্ক্রিন স্পেসে, এবং তদ্বিপরীত প্রকল্পে কাজ করছি। আমার আগের মতো কাজ করা হচ্ছে:

var viewport = new Viewport(0, 0, this.ScreenWidth, this.ScreenHeight);
var screenPoint = viewport.Project(worldPoint.NegateY(), this.ProjectionMatrix, this.ViewMatrix, this.WorldMatrix);

NegateY()এক্সএনএ'র y অক্ষটি উপরে থেকে নীচে পরিবর্তে নীচে থেকে উপরের দিকে চলে তাই এক্সটেনশন পদ্ধতিটি ঠিক এর মতোই বলে does উপরের স্ক্রিনশট এ সমস্ত কাজ করে দেখায়। মূলত, আমার কাছে থ্রিডি স্পেসে অনেকগুলি পয়েন্ট রয়েছে যা আমি তার পরে স্ক্রিন স্পেসে রেন্ডার করি। আমি ক্যামেরার বৈশিষ্ট্যগুলিকে রিয়েল টাইমে সংশোধন করতে পারি এবং এটি দেখতে নতুন অবস্থানে সঞ্চার করতে পারি। স্পষ্টতই আমার আসল গেমটি পয়েন্টের পরিবর্তে স্প্রিট ব্যবহার করবে এবং ক্যামেরার অবস্থানটি স্থির হবে তবে আমি চেষ্টা করছি সমস্ত গাণিতিকে জায়গা করে নেওয়ার আগেই।

এখন, আমি অন্যভাবে ফিরে রূপান্তর করার চেষ্টা করছি। অর্থাৎ উপরের স্ক্রিন স্পেসে একটি x এবং y পয়েন্ট দেওয়া , বিশ্ব স্থানের সাথে সম্পর্কিত পয়েন্ট নির্ধারণ করুন। সুতরাং আমি যদি কার্সারটিকে নির্দেশ করি, বলুন, সবুজ ট্র্যাপিজয়েডের নীচে বামে, আমি একটি বিশ্ব স্পেস রিডিং পেতে চাই (0, 480)। Z- র তুল্য অপ্রাসঙ্গিক। বা, বরং, বিশ্ব স্থানটিতে ম্যাপিংয়ের সময় z স্থানাঙ্ক সর্বদা শূন্য হবে। মূলত, আমি এই পদ্ধতির স্বাক্ষরটি প্রয়োগ করতে চাই:

public Vector2 ScreenPointToWorld(Vector2 point)

আমি এই কাজটি পেতে বেশ কয়েকটি বিষয় চেষ্টা করেছি তবে আমার ভাগ্য ভাল নেই। আমার সর্বশেষ চিন্তা যে আমি কল প্রয়োজন Viewport.Unproject/ পর্যন্ত কাছাকাছি বিভিন্নমুখী সঙ্গে দুইবার z- র মান, পরিসমাপ্তি নিরূপণ Ray, এটা স্বাভাবিক, তারপর ছেদ নিরূপণ Rayএকটি সঙ্গে Planeমূলত আমার জগতের গ্রাউন্ড-লেভেল প্রতিনিধিত্ব করে। যাইহোক, আমি শেষ পদক্ষেপে আটকে গিয়েছিলাম এবং নিশ্চিত ছিলাম না যে আমি অতিরিক্ত জটিলতার বিষয় ছিল কিনা।

কেউ কীভাবে আমাকে এটি অর্জন করতে পারে তার সঠিক দিক নির্দেশ করতে পারে?

উত্তর:


4

আমার ধারণা আপনার ধারণাটি বেশ স্পট করে আছে! প্রথমে আপনার 2 ডি স্থানাঙ্কের জন্য Z মান হিসাবে নিকটবর্তী বিমান এবং দূরবর্তী বিমান উভয় ব্যবহার করে আপনার কার্সারের জন্য একটি রশ্মির গণনা করুন (যেমন আপনার জেড স্থানাঙ্কের জন্য 0 এবং 1 ব্যবহার করুন)। এটি পরিচালনা করার জন্য এখানে একটি সহায়ক পদ্ধতি রয়েছে:

public Ray GetScreenRay(Vector2 screenPosition, Viewport viewport, Matrix projectionMatrix, Matrix viewMatrix, Matrix worldMatrix)
{
    Vector3 nearPoint = viewport.Unproject(new Vector3(screenPosition, 0f), projectionMatrix, viewMatrix, worldMatrix);
    Vector3 farPoint = viewport.Unproject(new Vector3(screenPosition, 1f), projectionMatrix, viewMatrix, worldMatrix);
    return new Ray(nearPoint, Vector3.Normalize(farPoint - nearPoint));
}

এরপরে আপনার একটি Planeউদাহরণ থাকা দরকার যা আপনার ভূমির সাথে মেলে। এটির গণনা করার সবচেয়ে সহজ উপায় হ'ল যে কনস্ট্রাক্টরটি বিমানটিতে তিনটি পয়েন্ট নেয় এবং ব্যবহারটি স্থল অবজেক্ট থেকে কোনও তিনটি উল্লম্ব পার করে দেওয়া। স্থল বিমানটি কীভাবে গণনা করা যায় তার উদাহরণ:

Plane groundPlane = new Plane(ground.Vertices[0], ground.Vertices[1], ground.Vertices[2]);

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

float? result;
mouseRay.Intersects(ref groundPlane, out result);
if(result != null)
    Vector3 worldPoint = mouseRay.Position + mouseRay.Direction * result.Value;

NegateYপদ্ধতি সম্পর্কে আপনাকেও কিছু করতে হতে পারে তবে আমি কোথায় তা নিশ্চিত নই।


এটি অত্যন্ত সহায়ক - আপনাকে অনেক ধন্যবাদ। এটি আমার সর্বশেষ লাইনটি ছিল না। একবার ভেসে উঠলে কী করতে হবে তা আমি বুঝতে পারি না! আমার মনে হয় আমার গেমের ক্রেডিটগুলিতে আপনার নাম থাকতে হবে :)
me--

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