লাইন রেন্ডারারের লাইনগুলি কীভাবে সমতল রাখা যায়?


10

আমি লক্ষ করেছি যে আমি একটি লাইন রেন্ডারারের লাইনে আরও ভার্টেক্স যুক্ত করার সাথে সাথে লাইনটি মোচড় দেয় এবং একটি মসৃণ লাইন হওয়া বন্ধ করে দেয়।

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

.GIF এখানে: http://i.imgur.com/hRAhCXM.gif

সমস্ত লাইনগুলি একই জেড স্তরে রয়েছে, আমি যদি উপকরণগুলি সরিয়ে ফেলি তবে লাইনগুলি এখনও মোচড়ে যায় বলে মনে হচ্ছে।

এটি কেন করে তা আমার কোনও ধারণা নেই, বা কীভাবে এটি সমাধান করা যায়, কোনও পরামর্শ? সি #


লাইনরেেন্ডার এর শীর্ষকে চিহ্নিত করতে অ্যালগরিদমের সাথে এটি একটি সমস্যা যা তীক্ষ্ণ কোণগুলির সাথে খারাপভাবে আচরণ করে। কোণগুলি আরও ঘিরে আরও বেশি পয়েন্ট যুক্ত করে আপনি এটি কিছুটা প্রশমিত করতে পারেন তবে সর্বাধিক শক্তিশালী পদ্ধতিটি আমি খুঁজে পেয়েছি এটির কার্যকারিতাটির জন্য একটি ভাল অ্যালগরিদমের সাহায্যে নিজের প্রয়োজন অনুসারে একটি গতিশীল জাল তৈরি করে বা সৃজনশীলভাবে পয়েন্টগুলির শৃঙ্খলা আঁকতে একটি পার্টিকেল সিস্টেম ব্যবহার করে।
ডিএমগ্রিগরি

1
আপডেট: ইউনিটির পরবর্তী সংস্করণগুলি (5 5+) লাইনরেেন্ডার অ্যালগরিদমকে উন্নত করেছে , তাই লাইনরেন্ডারগুলি ব্যবহার করে বিবেচনা করা ব্যবহারকারীরা খুঁজে পেতে পারেন যে বাক্সের আউট-অফ-রেজাল্ট এই দিনগুলিতে যথেষ্ট উন্নত।
ডিএমগ্রিগরি

উত্তর:


11

সমস্যাটি মূলত এটি:

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

লাইনরেেন্ডার লাল ডট অবস্থানগুলি সংযোগ করার চেষ্টা করছে is এটি একটি জাল তৈরির জন্য সবুজ শীর্ষকে তৈরি করছে। সুতরাং শীর্ষ লাইন বিভাগটি দুর্দান্ত দেখাচ্ছে। তবে লাইনরেেন্ডার অর্থনৈতিক হওয়ার চেষ্টা করে, এটি দ্বিতীয় লাইন বিভাগের শেষে একটি রেখাংশের শেষে থেকে শীর্ষকে আবার ব্যবহার করে। যখন একটি তীক্ষ্ণ কোণ রয়েছে, আপনি যে সমস্যাটি দেখছেন তা পেয়ে যাবেন। দ্বিতীয় লাইন বিভাগটি ছেদ করা হয়েছে কারণ এটির 'শেষ ক্যাপ' অন্যান্য 'শেষ ক্যাপ' দিয়ে লম্ব নয়।

সমাধানটি হ'ল আপনার নিজস্ব লাইন রেন্ডারার তৈরি করা এবং এটি এতটা অর্থনৈতিক হিসাবে তৈরি করা উচিত নয়। আপনি গতিশীল জাল তৈরি করে এটি করতে পারেন । জালটি পাতলা কোয়াডগুলির একটি সিরিজ সমন্বিত থাকবে। প্রতিটি লাইন বিভাগের জন্য, আপনি রেখার সাধারণ এবং নির্দিষ্ট রেখার প্রস্থ গণনা করে কোয়াডের চারটি কোণ গণনা করতে পারেন:

Vector3 normal = Vector3.Cross(start, end);
Vector3 side = Vector3.Cross(normal, end-start);
side.Normalize();
Vector3 a = start + side * (lineWidth / 2);
Vector3 b = start + side * (lineWidth / -2);
Vector3 c = end + side * (lineWidth / 2);
Vector3 d = end + side * (lineWidth / -2);

এখানে, a, b,c এবংd আপ একটি একক লাইন সেগমেন্ট চার কোণায় করতে, শুধু উপরের ছবিতে সবুজ বিন্দু মত। এই শিখাগুলি জালটিতে যুক্ত হবে এবং আপনি চারটি শীর্ষকে দুটি ত্রিভুজ তৈরি করতে সূচকগুলিও যুক্ত করবেন (সুতরাং ছয়টি সূচক যুক্ত হবে, এবিসি এবং বিডিসি)।

এটি স্পষ্টতই জটিল হতে পারে। আমি বিশ্বাস করি যে ityক্য তাদের লাইনরেেন্ডারকে তারা যেভাবে কার্যকর করেছিল, কারণ করণীয় সেভাবে এটি করা অন্য কোনও সমস্যা এড়ায়। আপনি যখন প্রতিটি লাইন বিভাগকে আঁকতে শুরু করবেন তখন আপনি দুটি লাইন খণ্ডটি কোথায় একসাথে আসে এবং একটি কুরুচিপূর্ণ যৌথ গঠন করে তা দেখতে শুরু করবেন। উভয় লাইনের মধ্যে ভাগ করে নেওয়া স্বাভাবিক গণনা করে এবং তাদের শীর্ষকে ভাগ করে নেওয়া স্বাভাবিকের সাথে আপডেট করে এর সাথে মোকাবিলা করার বিভিন্ন উপায় রয়েছে তবে এটি কেবল আংশিকভাবে সমস্যার সমাধান করে, যেহেতু আপনি এখনও খুব সহজেই পিঞ্চযুক্ত লাইনগুলি দিয়ে শেষ করতে পারেন। সর্বাধিক দৃ to় সমাধানটি কোণগুলির হিসাবে কাজ করার জন্য জয়েন্টগুলিতে অতিরিক্ত শীর্ষগুলি তৈরি করা।


1
আপনি সম্ভবত একতা লাইন রেন্ডারার ব্যবহার করে এবং একটি ছোট মাইটার তৈরি করতে অতিরিক্ত পয়েন্ট সন্নিবেশ করেও পালাতে পারেন। পূর্ববর্তী বিন্দু থেকে পরবর্তী পয়েন্টটির দিকে সামান্য কিছুটা পথ রেখে দিন put
mklingen

দুর্দান্ত ব্যাখ্যা বাইট, ধন্যবাদ। আমি সম্ভবত চেষ্টা করব এবং দেখব যে আমি প্রতিটি কোণে আরও বেশি পয়েন্ট উত্পন্ন করতে পারছি না, যদি এটি ভালভাবে কাজ করে না, আমি এগিয়ে যাব এবং একটি গতিশীল জাল তৈরির জন্য আমার হাত চেষ্টা করব। ধন্যবাদ.
ডগলাস গ্যাসকেল

1

আমার একই সমস্যা ছিল এবং আমি এটি সমাধান করলাম আরও পয়েন্ট যুক্ত করে মসৃণ প্রান্তগুলি এটি একটি মার্জিত সমাধান নয় বরং এটি সহজ এবং কাজ করে। অন্তত আমার জন্য. আমি এটি করতে একটি ফাংশন লিখেছি:

Vector3[] Generate_Points(Vector3[] keyPoints, int segments=100){
    Vector3[] Points = new Vector3[(keyPoints.Length - 1) * segments + keyPoints.Length];
    for(int i = 1; i < keyPoints.Length;i++){
        Points [(i - 1) * segments + i - 1] = new Vector3(keyPoints [i-1].x,keyPoints [i-1].y,0);
        for (int j = 1;j<=segments;j++){
            float x = keyPoints [i - 1].x;
            float y = keyPoints [i - 1].y;
            float z = 0;//keyPoints [i - 1].z;
            float dx = (keyPoints [i].x - keyPoints [i - 1].x)/segments;
            float dy = (keyPoints [i].y - keyPoints [i - 1].y)/segments;
            Points [(i - 1) * segments + j + i - 1] = new Vector3 (x+dx*j,y+dy*j,z);
        }
    }
    Points [(keyPoints.Length - 1) * segments + keyPoints.Length - 1] = new Vector3(keyPoints [keyPoints.Length-1].x,keyPoints [keyPoints.Length-1].y,0);
    return Points;
}


0

অস্বচ্ছ লাইনগুলির জন্য এটি সমাধানের এক উপায় হ'ল প্রতিটি জয়েন্টে একটি বৃত্ত রেন্ডার করা। বৃত্তটির লাইন প্রস্থের সমান ব্যাস থাকা দরকার। এটি রেন্ডার করার জন্য আরও কয়েকটি অতিরিক্ত উল্লম্বের প্রয়োজন, তবে সত্যিই দুর্দান্ত দেখাচ্ছে। এরপরে আপনি জয়েন্টগুলির মধ্যে ভাগ হওয়া স্বাভাবিকগুলি থেকে মুক্তি পেতে পারেন।

এটি এখনও প্রয়োজন যে আপনি ইউনিটি লাইন রেন্ডারার ব্যবহার না করে নিজের রেন্ডারিং কোডটি লেখেন।

আমি একটি সম্পদ তৈরি করেছি যা কেবল http://u3d.as/nFE এ করে


0

আমি এটিকে যেভাবে এড়িয়ে চলেছি তা হ'ল আমি সর্বদা লাইনরেেন্ডারসেটপেজেশন () পদ্ধতিতে z পজিশনটি 0 তে সেট করে থাকি। সুতরাং লেখার পরিবর্তে

LineRenderer.SetPosition(i, myVector3);

আমি লিখেছিলাম

LineRenderer.SetPosition(i, new Vector3(myVector3.x, myVector3.y, 0));

তবে এটি সেরা সমাধান নয় কারণ আপনি এখনও সেই অদ্ভুত লাইন পাবেন। আমি যে সর্বোত্তম সমাধানটি ভাবতে পারি তা হ'ল আলাদা লাইন তৈরি করা। এটা আমার জন্য নিখুঁতভাবে কাজ করেছে। আশা করি এটি আপনাকে সহায়তা করবে।

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