আমি একটি 3D গেম তৈরি করছি যা আমি আগ্রহের পয়েন্টের উপরে একটি বিস্ময়বোধক চিহ্নিতকারী রেখেছি।
2D স্ক্রিনে আমার চিহ্নিতকারীটি কোথায় রাখা উচিত তা জানতে, আমি ম্যানুয়ালি 3 ডি পয়েন্টটি প্রবর্তন করছি যেখানে চিহ্নিতকারীটি হওয়া উচিত।
দেখে মনে হচ্ছে:
দেখতে বেশ ভাল লাগছে। যখন চিহ্নিতকারী পর্দার বাইরে থাকে তখন আমি কেবল স্থানাঙ্কগুলি ক্লিপ করি যাতে তারা স্ক্রিনে ফিট হয়। দেখে মনে হচ্ছে:
এখনও পর্যন্ত ধারণাটি বেশ ভাল চলছে। যাইহোক, যখন আগ্রহের বিষয়গুলি ক্যামেরার পিছনে থাকে, ফলস্বরূপ এক্স, ওয়াই স্থানাঙ্কগুলি উল্টানো হয় (ধনাত্মক / নেতিবাচক হিসাবে), এবং আমি স্ক্রিনের বিপরীত কোণে এই চিহ্নটি উপস্থিত করতে পাই:
(প্রজেক্টড-এরপরে-ক্ল্যাম্পড পয়েন্ট হ'ল চিহ্নিতকারীটির টিপ the চিহ্নিতকারীকে ঘোরানোর বিষয়ে কিছু মনে করবেন না)
এটি বোঝা যায়, যেহেতু হতাশার পিছনে স্থানাঙ্কগুলি এক্স এবং ওয়াইতে উল্টানো হয় So যাইহোক, স্থানাঙ্কগুলি উল্টানো উচিত ঠিক তখনকার অবস্থাটি আমি এখনও জানি না।
এটি বর্তমানে আমার প্রজেকশন কোডটির মতো দেখাচ্ছে (শার্পডএক্সের সাথে সি # তে):
public override PointF ProjectPosition(float viewportWidth, float viewportHeight, float y)
{
var projectionMatrix = Matrix.PerspectiveFovRH(GetCalibratedFOV(Camera.FOV, viewportWidth, viewportHeight), viewportWidth / viewportHeight, Camera.Near, Camera.Far);
var viewMatrix = Matrix.LookAtRH(new Vector3(Camera.PositionX, Camera.PositionY, Camera.PositionZ), new Vector3(Camera.LookAtX, Camera.LookAtY, Camera.LookAtZ), Vector3.UnitY);
var worldMatrix = Matrix.RotationY(Rotation) * Matrix.Scaling(Scaling) * Matrix.Translation(PositionX, PositionY, PositionZ);
var worldViewProjectionMatrix = worldMatrix * viewMatrix * projectionMatrix;
Vector4 targetVector = new Vector4(0, y, 0, 1);
Vector4 projectedVector = Vector4.Transform(targetVector, worldViewProjectionMatrix);
float screenX = (((projectedVector.X / projectedVector.W) + 1.0f) / 2.0f) * viewportWidth;
float screenY = ((1.0f - (projectedVector.Y / projectedVector.W)) / 2.0f) * viewportHeight;
float screenZ = projectedVector.Z / projectedVector.W;
// Invert X and Y when behind the camera
if (projectedVector.Z < 0 ||
projectedVector.W < 0)
{
screenX = -screenX;
screenY = -screenY;
}
return new PointF(screenX, screenY);
}
আপনি দেখতে পাচ্ছেন, আমার বর্তমান ধারণাটি যখন জেড বা ডাব্লু ডাইরেক্টরগুলি নেতিবাচক থাকে তখন স্থানাঙ্কগুলি উল্টানো হয়। এটি বেশিরভাগ সময় কাজ করে, তবে এখনও বেশ কয়েকটি নির্দিষ্ট ক্যামেরা অবস্থান রয়েছে যেখানে এটি কাজ করে না। বিশেষত এই বিন্দুতে একটি স্থানাঙ্কিক কাজ করে এবং অন্যটি না করে (সঠিক অবস্থানটি নীচের ডানদিকে হওয়া উচিত) দেখায়:
আমি যখন উল্টানোর চেষ্টা করেছি:
Z
নেতিবাচক (এটাই আমার কাছে সবচেয়ে বেশি বোঝায়)W
নেতিবাচক (আমি নেতিবাচক ডাব্লু মানের অর্থ বুঝতে পারি না)- হয় হয়
Z
বাW
নেতিবাচক (বর্তমানে বেশিরভাগ সময় কী কাজ করছে) Z
এবংW
বিভিন্ন চিহ্নের, হ'ল ওরফে:Z / W < 0
(আমার কাছে বোধ হয়। যদিও কাজ করে না)
তবে এখনও আমার একটি সামঞ্জস্যপূর্ণ উপায় খুঁজে পাওয়া যায় নি যার সাথে আমার সমস্ত পয়েন্ট সঠিকভাবে অনুমান করা হয়েছে।
কোন ধারনা?