আমি কীভাবে জেগ-জাগিং ইউভি ম্যাপিং শৈল্পিকগুলি জেনারেট হওয়া জালগুলিতে স্থির করতে পারি?


10

আমি একটি বক্ররেখার উপর ভিত্তি করে একটি প্রক্রিয়াগত জাল তৈরি করছি এবং নীচের দিকে আপনি যেমন দেখছেন তেমন জাল আকারটি পুরো বক্ররেখার চেয়ে ছোট হয়ে যায়।

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

এবং সমস্যাটি হ'ল ইউভি আকার পরিবর্তন হওয়ার সাথে সাথে জিগ-জিগড হয় (এটি পুরোপুরি কার্যকর হয় যখন জালটির আকারটি পুরো বক্ররেখায় জুড়ে থাকে)।

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

 Vertices.Add(R);
 Vertices.Add(L);
 UVs.Add(new Vector2(0f, (float)id / count));
 UVs.Add(new Vector2(1f, (float)id / count));
 start = Vertices.Count - 4;
          Triangles.Add(start + 0);
                 Triangles.Add(start + 2);
                 Triangles.Add(start + 1);
                 Triangles.Add(start + 1);
                 Triangles.Add(start + 2);
                 Triangles.Add(start + 3);

 mesh.vertices = Vertices.ToArray();
         //mesh.normals = normales;
         mesh.uv = UVs.ToArray();
         mesh.triangles = Triangles.ToArray();

আমি এটা কিভাবে ঠিক করবো?


কি idএবং count? কি করে UVs.ToArray()? আপনি কিভাবে কার্ডটিতে শীর্ষে এবং টেক্সচারের স্থানাঙ্কগুলি আপলোড করছেন?
ব্যবহারকারী 1118321

প্রসঙ্গ থেকে @ ব্যবহারকারী 1118321, মোট স্ট্রিপগুলি idসহ সমস্ত ক্রসবারগুলির মধ্যে বর্তমান বিভাগটির সূচক countList<T>.ToArray()তালিকায় সমস্ত এন্ট্রিগুলির একটি টাইপযুক্ত অ্যারে প্রদান করে (সুতরাং এখানে, ক Vector2[])। এই ডেটা বাফারগুলিকে রেন্ডারিং সিস্টেমটিতে শেষ কয়েকটি লাইনে Meshউদাহরণটি বরাদ্দ করে উপলব্ধ করা হয় mesh। তবে এর কোনওটিই কোডের বিশেষ আকর্ষণীয় অংশ নয়: কীভাবে শীর্ষবিন্দু পয়েন্টগুলি বেছে নেওয়া হয়। এই বিবরণগুলি দেখতে আরও দরকারী হবে। ;)
ডিএমগ্রিগরি

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

উত্তর:


13

সাধারণ ইউভি ম্যাপিংকে এফাইন ট্রান্সফর্মেশন বলা হয় । এর অর্থ 3 ডি স্পেস এবং টেক্সচার স্পেসের মধ্যে প্রতিটি ত্রিভুজটির ম্যাপিংয়ের মধ্যে ঘূর্ণন, অনুবাদ, স্কেলিং / স্কোয়াশ এবং স্কিউ অন্তর্ভুক্ত থাকতে পারে (অর্থাত্ আমরা একজাতীয় ম্যাট্রিক্স গুণে কিছু করতে পারি)

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

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

এই সমস্যাটি যে কোনও সময় ফসরে যায় আমরা কোনও ট্র্যাপিজয়েডের সমান্তরাল দিকগুলি রূপান্তরকারী দিকের মানচিত্র তৈরি করতে চাই - এটি করার ফলে কেবল কোনও অ্যাফাইন রূপান্তর হয় না, সুতরাং আমাদের এটি প্রায় টুকরোচকভাবে তৈরি করতে হবে, যা দৃশ্যমান সিলগুলির দিকে নিয়ে যায়।

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

তবে এর চারপাশে একটি উপায় আছে। প্রদত্ত আয়তক্ষেত্রাকার প্রাচীর এবং মেঝে দৃষ্টিকোণে ট্র্যাপিজয়েডগুলি আঁকার জন্য আমরা 3D ট্রেন্ডারিংয়ের জন্য একই কৌশল ব্যবহার করতে পারি: আমরা প্রজেক্টিভ স্থানাঙ্ক ব্যবহার করি !

অ্যাফাইন টেক্সচার: জিগ-জাগ শিল্পকর্মগুলির সাথে সাধারণ অ্যাফাইন টেক্সচারের উদাহরণ

সম্ভাব্য পাঠ্য: শিল্পকলাগুলি সংশোধন করে প্রক্ষেপণমূলক পাঠ্যকরণের উদাহরণ

এটি করার জন্য, আমাদের একটি তৃতীয় ইউভি স্থানাঙ্ক (ইউভিডাব্লু) যুক্ত করতে হবে এবং আমাদের শেডারগুলি সংশোধন করতে হবে।

প্রতিটি বিন্দুতে একটি স্কেল ফ্যাক্টর দেওয়া (বলুন, যে জায়গাটিতে আপনার স্ট্রিপের প্রস্থের সমান), আপনি আপনার নিয়মিত 2 ডি ইউভি স্থানাঙ্ক থেকে 3 ডি প্রজেক্টিভ ইউভিডাব্লু সমন্বয়টি এইভাবে নির্মাণ করতে পারেন:

Vector3 uv3 = ((Vector3)uv2) * scale;
uv3.z = scale;

আপনার জালগুলিতে এই 3 ডি ইউভিডাব্লু স্থানাঙ্ক প্রয়োগ করতে, আপনাকে ভেক্টর 3 ওভারলোড মেশ.সেটউভিগুলি ব্যবহার করতে হবে (অন্তর্গত চ্যানেল, তালিকা ইউভিগুলি)

এবং একটি 3D টেক্সচার সমন্বয় (ডিফল্ট আনলিট শেডার ব্যবহার করে এখানে দেখানো হয়েছে) আশা করতে আপনার শেডারের ইনপুট স্ট্রাক্ট পরিবর্তন করতে ভুলবেন না:

struct appdata
{
    float4 vertex : POSITION;
    float3 uv : TEXCOORD0; // Change float2 to float 3.
};
// Also do this for the uv sent from the vertex shader to the fragment shader.

আপনার ভার্টেক্স শ্যাডারে ট্রান্সফর্মএমটেক্স ম্যাক্রোও কেটে ফেলতে হবে, যেহেতু এটি একটি 2 ডি ইউভি আশা করে:

// o.uv = TRANSFORM_TEX(v.uv, _MainTex);
o.uv = v.uv;
// If you define a float4 with the special name _MainTex_ST, 
// you can get the same effect the macro had by doing this:
o.uv.xy = o.uv.xy * _MainTex_ST.xy + _MainTex_ST.zw;

অবশেষে টেক্সচার স্যাম্পলিংয়ের জন্য 2D টেক্সচারের স্থানাঙ্কে ফিরে যেতে, আপনি কেবলমাত্র আপনার খণ্ড শেডারে তৃতীয় স্থানাঙ্ক দ্বারা ভাগ করবেন :

float2 uv = i.uv.xy / i.uv.z;

যেহেতু আমরা একই সংখ্যা দ্বারা গুণিত করে আমাদের কাঙ্ক্ষিত 2 ডি স্থানাঙ্ক থেকে এই 3 ডি ইউভিডু স্থানাঙ্ক তৈরি করেছি, তাই দুটি ক্রিয়াকলাপ বাতিল হয়ে যায় এবং আমরা আমাদের মূল কাঙ্ক্ষিত 2 ডি স্থানাঙ্কে ফিরে আসি, তবে এখন উল্লম্বের মধ্যে অ-রৈখিক অন্তরঙ্গকরণ রয়েছে। : ডি

ভার্টেক্স শ্যাডারে নয়, প্রতি টুকরা প্রতি এই বিভাগটি করা গুরুত্বপূর্ণ। এটি যদি ভার্টেক্স অনুসারে সম্পন্ন হয়, তবে আমরা প্রতিটি প্রান্ত বরাবর লম্বা ফলস্বরূপ স্থানাঙ্কগুলি সংশ্লেষ করতে ফিরে এসেছি এবং আমরা যে প্রান্তিকতাটি প্রজেক্টিভ স্থানাঙ্কের সাথে প্রবর্তনের চেষ্টা করছিলাম তা হারিয়ে ফেলেছি!


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

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

আমাকে কি তৃতীয় স্থানাঙ্ক হিসাবে বিভাজক সংরক্ষণ করতে হবে (এবং সেই পরিবর্তনের কাঠামোর কারণে এবং ট্রান্সফর্মএমটেক্স ম্যাক্রো কেটে ফেলতে হবে, যা আমি তিনজিতে কীভাবে করতে হয় তা আমি জানি না) বা আমি কেবল ভার্টেক্স শ্যাডারের একটি বৈশিষ্ট্য হিসাবে বিভাজককে পাস করতে পারি? এবং তারপরে সেখান থেকে টুকরো টুকরো টুকরো শেডার যেখানে এটি বিভাগে ব্যবহৃত হতে পারে?
ডাইভো জেলিć

TRANSFORM_TEX একটি ইউনিটি ম্যাক্রো। আপনার তিন-জেজে নেই তাই কাটা কাটার কিছুই নেই। যতক্ষণ না দ্বিবিভক্ত ইউভি স্থানাঙ্ক এবং বিভাজকগুলি খণ্ডের শেডারে পৌঁছায় ততক্ষণ আপনি কীভাবে সেগুলি পেলেন তাতে কিছু যায় আসে না। আপনি এতদূর এট্রিবিউট / তারতম্য হিসাবে এটি সরবরাহ করতে কোনও সমস্যায় পড়েছেন?
ডিএমগ্রিগরি

যতক্ষণ না যাচাই করা সম্ভব না ততক্ষণ আমি সময় নষ্ট করতে চাইনি আমি এখনও চেষ্টা করিনি। কেবলমাত্র একটি শেষ প্রশ্ন, বিভাজকটি একবারে খণ্ড খণ্ড শেডারে পৌঁছেছে, তাই না? মানে পিক্সেলটি দুইটি উল্লম্বের মাঝে এটি কিছু অন্তরোলিক মান হবে এবং মূল মানটি নয়? আমার মাথার মুঠোয় খুব শক্ত হয়ে যায় কেন ইউভিটি গুণিত করে এবং তারপরে এটি ভাগ করে দেয়, তবে আমি আপনার শব্দটি এটির জন্য নেব এবং চেষ্টা করব। : সামান্য_সিলিং_ফেস: আপনাকে অনেক ধন্যবাদ সহায়তার জন্য!
ডাইভো জেলিć
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.