আমি 3 ডি স্পেসে একটি লাইন আঁকতে চাই যা স্ক্রিনে সর্বদা এক পিক্সেল প্রশস্ত থাকে, ক্যামেরা থেকে যত দূরেই থাকুক না কেন। (এবং একক পয়েন্টের জন্যও একই)।
আমি কীভাবে এটি করতে পারি তার কোনও ইঙ্গিত?
আমি 3 ডি স্পেসে একটি লাইন আঁকতে চাই যা স্ক্রিনে সর্বদা এক পিক্সেল প্রশস্ত থাকে, ক্যামেরা থেকে যত দূরেই থাকুক না কেন। (এবং একক পয়েন্টের জন্যও একই)।
আমি কীভাবে এটি করতে পারি তার কোনও ইঙ্গিত?
উত্তর:
রেন্ডারিং লাইন - পদ্ধতি 1 (আদিম)
3 ডি স্পেসে সরল রেখাগুলির জন্য আপনি এগুলি একটি LineList
বা LineStrip
আদিম ব্যবহার করে আঁকতে পারেন । এটি (0,0,0) থেকে (0,0, -50) পর্যন্ত একটি লাইন আঁকতে আপনাকে খালি এক্সএনএ প্রকল্পে যুক্ত করতে হবে ন্যূনতম পরিমাণ কোড's লাইনটি প্রায় একই প্রস্থে উপস্থিত হওয়া উচিত ক্যামেরাটি যেখানেই থাকুক না কেন।
// Inside your Game class
private BasicEffect basicEffect;
private Vector3 startPoint = new Vector3(0, 0, 0);
private Vector3 endPoint = new Vector3(0, 0, -50);
// Inside your Game.LoadContent method
basicEffect = new BasicEffect(GraphicsDevice);
basicEffect.View = Matrix.CreateLookAt(new Vector3(50, 50, 50), new Vector3(0, 0, 0), Vector3.Up);
basicEffect.Projection = Matrix.CreatePerspectiveFieldOfView(MathHelper.ToRadians(45f), GraphicsDevice.Viewport.AspectRatio, 1f, 1000f);
// Inside your Game.Draw method
basicEffect.CurrentTechnique.Passes[0].Apply();
var vertices = new[] { new VertexPositionColor(startPoint, Color.White), new VertexPositionColor(endPoint, Color.White) };
GraphicsDevice.DrawUserPrimitives(PrimitiveType.LineList, vertices, 0, 1);
আমি মূলত একটি সহজ নির্মিত BasicEffect
আমার দেখতে ও অভিক্ষেপ রূপান্তরের রাখা, এবং দুই ছেদচিহ্ন (সংরক্ষণকারী অবস্থান ও রঙ) পাস GraphicsDevice.DrawUserPrimitives
পদ্ধতি হিসেবে রেন্ডার করা থেকে LineList
।
অবশ্যই এটিকে অপ্টিমাইজ করার জন্য অনেকগুলি উপায় রয়েছে যার মধ্যে বেশিরভাগের মধ্যে একটি VertexBuffer
সমস্ত বিভাজন সংরক্ষণের জন্য তৈরি করা এবং যতগুলি সম্ভব লাইন একটি একক ড্র কলের সাথে জড়িত তবে এটি প্রশ্নের অপ্রাসঙ্গিক।
রেন্ডারিং পয়েন্টস - পদ্ধতি 1 (স্প্রিটব্যাচ)
অঙ্কন পয়েন্ট হিসাবে, এটি পয়েন্ট স্প্রাইট ব্যবহার করে সহজ হতে পারে তবে এগুলি XNA 4.0 থেকে সরানো হয়েছে । যদিও কয়েকটি বিকল্প আছে। সবচেয়ে সহজ উপায় হ'ল 1x1 সাদা Texture2D
বস্তু তৈরি করা এবং SpriteBatch
সঠিক পর্দার অবস্থান ব্যবহার করে এটি রেন্ডার করা , যা আপনি ভিউপোর্ট.প্রজেক্ট পদ্ধতিটি ব্যবহার করে খুব সহজেই খুঁজে পেতে পারেন ।
আপনি এর Texture2D
মতো প্রয়োজনীয় বস্তু তৈরি করতে পারেন :
Texture2D pixel = new Texture2D(GraphicsDevice, 1, 1);
pixel.SetData(new [] { Color.White });
এবং এটির মতো এটিকে (x, y, z) রেন্ডার করুন:
// Find screen equivalent of 3D location in world
Vector3 worldLocation = new Vector3(0, 0, 50);
Vector3 screenLocation = GraphicsDevice.Viewport.Project(worldLocation, projectionMatrix, viewMatrix, Matrix.Identity);
// Draw our pixel texture there
spriteBatch.Begin();
spriteBatch.Draw(pixel, new Vector2(screenLocation.X, screenLocation.Y), Color.White);
spriteBatch.End();
রেন্ডারিং লাইন - পদ্ধতি 2 (স্প্রিটব্যাচ)
বিকল্পভাবে, আপনি এখানে বর্ণিত কৌশলটিSpriteBatch
ব্যবহার করে লাইনগুলিও আঁকতে পারেন । এই ক্ষেত্রে আপনাকে কেবল 3 ডি লাইনের উভয় প্রান্তের জন্য (আবার ব্যবহার করে ) পর্দার স্থান স্থানাঙ্ক খুঁজে বের করতে হবে এবং তারপরে তাদের মধ্যে নিয়মিত লাইন আঁকতে হবে।Viewport.Project
রেন্ডারিং পয়েন্টস - পদ্ধতি 2 (আদিমদের সাথে ছোট রেখা)
মন্তব্যে, ই-বিজনেস নিম্নলিখিত প্রশ্ন উত্থাপন করেছে:
একই শুরু এবং শেষ পয়েন্ট সহ একটি লাইন সম্পর্কে কি, যে একটি বিন্দু উত্পাদন করবে না? না কি কেবল অদৃশ্য হবে?
আমি এটিকে চেষ্টা করে দেখলাম এবং একই সূচনা এবং শেষ পয়েন্টগুলি LineList
ব্যবহার করে কোনও কিছুই টানা হয়নি। আমি এর চারপাশে একটি উপায় খুঁজে পেয়েছি যদিও আমি সম্পূর্ণতার জন্য এখানে এটি বর্ণনা করব।
কৌতুকটি একই শুরু এবং শেষ পয়েন্টগুলি ব্যবহার না করে বরং এর চেয়ে ছোট একটি লাইন আঁকতে হবে যে এটি আঁকলে কেবল একটি পিক্সেল হিসাবে উপস্থিত হয়। সুতরাং, অর্ডার সঠিক শেষ বিন্দু বেছে নিন করার জন্য, আমি প্রথম পর্দা মহাকাশ বিশ্ব মহাকাশ পয়েন্ট, অভিক্ষিপ্ত এটা সঠিক এক পিক্সেল সরানো পর্দা স্থান , এবং পরিশেষে এটি বিশ্বের মহাকাশ ফিরে অভিক্ষিপ্ত। এটিকে বিন্দুর মতো দেখতে তৈরি করার জন্য এটি আপনার লাইনের শেষ পয়েন্ট। এটার মতো কিছু:
Vector3 GetEndPointForDot(Vector3 start)
{
// Convert start point to screen space
Vector3 screenPoint = GraphicsDevice.Viewport.Project(start, projection, view, Matrix.Identity);
// Screen space is defined in pixels so adding (1,0,0) moves it right one pixel
screenPoint += Vector3.Right;
// Finally unproject it back into world space
return GraphicsDevice.Viewport.Unproject(screenPoint, projection, view, Matrix.Identity);
}
এটি একটি সাধারণ রেখার আদিম হিসাবে রেন্ডার করে।
প্রদর্শন
আমি এখানে একটি লাইন তালিকা আদিম ব্যবহার করে 3 ডি স্পেসে একটি সাদা রেখা আঁকতে পেয়েছি এবং 1x1 টেক্সচার এবং স্প্রিটব্যাচ ব্যবহার করে লাইনের উভয় প্রান্তে লাল বিন্দুগুলি আঁকিয়েছি। ব্যবহৃত কোডটি বেশ উপরে যা আমি উপরে লিখেছি। আমি জুমও করেছি তাই আপনি নিশ্চিত করতে পারেন যে সেগুলি এক পিক্সেল প্রস্থ:
এটি এক্সএনএ হিসাবে ট্যাগ হয়েছে তাই আমি ধরে নিচ্ছি যে আপনি যা জিজ্ঞাসা করছেন তা?
যদি তা হয় তবে এই নিবন্ধটি লাইনের জন্য সহায়ক হওয়া উচিত:
http://msdn.microsoft.com/en-us/library/bb196414(v=xnagamestudio.40).aspx
অবশ্যই আপনি তাদের পরিবর্তে আপনার নিজস্ব ভিউ / প্রজেকশন ম্যাট্রিক ব্যবহার করতে পারেন। মূলত, PrimitiveType.LineList
বা LineStrip
কীভাবে জিপিইউ স্তরে লাইনগুলি আঁকতে হয়।
পয়েন্ট হিসাবে, আপনি আর এক্সএনএ 4.0 তে পয়েন্ট আঁকার জন্য আর প্রিমিটিভটাইপ.পয়েন্টলিস্ট ব্যবহার করতে পারবেন না। পরিবর্তে আপনাকে খুব ছোট ত্রিভুজ তৈরি করতে হবে। এই নমুনা একটি ভাল বেসলাইন সরবরাহ করে:
http://create.msdn.com/education/catalog/sample/primitives_3d
এক্সএনএর পূর্ববর্তী সংস্করণগুলির জন্য, আপনি যদি সেগুলির মধ্যে একটি ব্যবহার করে থাকেন তবে আপনি এগিয়ে গিয়ে উপরের পোস্টের নিবন্ধের এক্সএনএ 3.0 সংস্করণটির পয়েন্ট অংশটি পড়তে পারেন:
http://msdn.microsoft.com/en-us/library/bb196414(v=xnagamestudio.30).aspx
লিঙ্কটি নোট করুন:
graphics.GraphicsDevice.RenderState.PointSize = 10;
স্পষ্টতই এটিকে পরিবর্তন করুন 1
।