3 ডি স্পেসে এক পিক্সেল প্রশস্ত রেখা অঙ্কন


10

আমি 3 ডি স্পেসে একটি লাইন আঁকতে চাই যা স্ক্রিনে সর্বদা এক পিক্সেল প্রশস্ত থাকে, ক্যামেরা থেকে যত দূরেই থাকুক না কেন। (এবং একক পয়েন্টের জন্যও একই)।

আমি কীভাবে এটি করতে পারি তার কোনও ইঙ্গিত?

উত্তর:


24

রেন্ডারিং লাইন - পদ্ধতি 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 টেক্সচার এবং স্প্রিটব্যাচ ব্যবহার করে লাইনের উভয় প্রান্তে লাল বিন্দুগুলি আঁকিয়েছি। ব্যবহৃত কোডটি বেশ উপরে যা আমি উপরে লিখেছি। আমি জুমও করেছি তাই আপনি নিশ্চিত করতে পারেন যে সেগুলি এক পিক্সেল প্রস্থ:

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


একই শুরু এবং শেষ পয়েন্ট সহ একটি লাইন সম্পর্কে কি, যে একটি বিন্দু উত্পাদন করবে না? না কি কেবল অদৃশ্য হবে?
আআআআআআআআআআআআআআআআআআআআআআআআ

@e ব্যবসায় ভাল প্রশ্ন! আমি কেবল এটি চেষ্টা করে দেখেছি এবং এটি কোনও কিছুই রেন্ডার করে না।
ডেভিড গওভিয়া

@eBusiness আমি সবেমাত্র একটি উপায় খুঁজে পেয়েছি তবে আমি মনে করি এটি কিছুটা নির্বোধ। আমি যাইহোক এটি সম্পূর্ণতার জন্য যুক্ত করব।
ডেভিড গওভিয়া

2

এটি এক্সএনএ হিসাবে ট্যাগ হয়েছে তাই আমি ধরে নিচ্ছি যে আপনি যা জিজ্ঞাসা করছেন তা?

যদি তা হয় তবে এই নিবন্ধটি লাইনের জন্য সহায়ক হওয়া উচিত:

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

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