প্রোগ্রামিয়ালি ভার্টেক্স নরমাল তৈরি করা


11

আমি কিনেক্ট ফেস এপি নিয়ে কাজ করছি, এটি ত্রিভুজগুলির জন্য একটি সূচি এবং সূচকগুলির একটি অ্যারে সরবরাহ করে যা মুখের চিত্রটি তৈরি করার জন্য রেন্ডার করা উচিত।

বিন্যাসের সংখ্যা এবং অ্যারেতে তাদের ক্রম পাশাপাশি আত্মীয়তার দ্বারা প্রদত্ত সূচকগুলি সর্বদা স্থির থাকে।

তবে এপিআই ইউভি ডেটা এবং ভার্টেক্স নরমাল সম্পর্কিত কোনও তথ্য দেয় না।

অ্যাপ্লিকেশনটিতে আমার মুখের গতিবিধি অনুসারে 3 ডি স্পেস পরিবর্তনের জন্য কেনেটের নির্দেশ অনুসারে ভার্টেক্স অর্ডারটি রাখা উচিত, সুতরাং 3 ডি সম্পাদনা সফ্টওয়্যারটিতে ইউভি এবং নরমাল উত্পন্ন করা প্রশ্নবিদ্ধ নয়।

একই বিমানে খুব কম ভার্টিক্স ছিল বলে আমি 2 ডি প্লেনে ভারটেক্স পজিশনগুলি প্রজেক্ট করে ইউভি উত্পন্ন করতে সক্ষম হয়েছি।

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

আমি বুঝতে পেরেছি যে ভার্টেক্সের অনুপস্থিতির কারণে আলো এতে সঠিকভাবে কাজ করবে না এবং তাই ফ্যাকাশে বৈশিষ্ট্যহীন জাল এটি এখনই দেখায়।

সুতরাং আমি কীভাবে ভার্টেক্স নরমালগুলি তৈরি করব যখন আমার সমস্ত কিছু কেবলমাত্র শীর্ষবিন্দু অবস্থান এবং ত্রিভুজগুলি তৈরি করার জন্য শীর্ষ প্রান্তের সূচক হয়?


n = (v1 - v0) x (v2 - v0), যেখানে v0, v1, এবং v2 প্রশ্নের মধ্যে থাকা (ত্রিভুজ) মুখের শীর্ষবিন্দু রয়েছে। অর্ডারটি ইম্পান হয়। আপনার যদি সত্যিই প্রয়োজন হয় তবে এটি স্বাভাবিক করুন। (এবং xক্রস প্রোডাক্ট)
ডিভে

উত্তর:


14

ভেক্টর ক্রস পণ্যটি ব্যবহার করে ভার্টেক্স পজিশন থেকে সাধারণ গণনা করা বেশ সহজ।

ক্রস পণ্য দুই ভেক্টরu এবং v (লক্ষনীয় u×v, বা কখনও কখনও uv) একটি ভেক্টর লম্বায় u এবং vদৈর্ঘ্যের ||u×v||=||u||||v||sin(θ), সঙ্গে θ মধ্যে কোণ u এবং v। ভেক্টরের দিকটি গুণনের ক্রমের উপর নির্ভর করবে:u×v এর বিপরীত v×u (বিমানে দুটি লম্ব লম্বালম্বি)।

যদি আপনি ক্রস পণ্যটির সাথে পরিচিত না হন তবে আমি আপনাকে এটি সম্পর্কে পড়তে এবং এতে আরামদায়ক হওয়ার জন্য আমন্ত্রণ জানাচ্ছি। সাধারণগুলি তখন সহজ মনে হবে।

ফ্ল্যাট শেডিং নরমাল

আপনার যদি একটি ত্রিভুজ থাকে ABC, AB×ACএটি ত্রিভুজের একটি ভেক্টর লম্ব এবং এর ক্ষেত্রফলের সাথে আনুপাতিক দৈর্ঘ্যের। যেহেতু স্বাভাবিকটি ত্রিভুজের বিমানের একক ভেক্টর লম্ব, তাই আপনি এইটি দিয়ে সাধারণটি পেতে পারেন:

N=AB×AC||AB×AC||

কোডে, n = normalize(cross(b-a, c-a))উদাহরণস্বরূপ এটি দেখতে হবে । এটি কেবল আপনার সমস্ত মুখের উপরে প্রয়োগ করুন এবং আপনার প্রতি মুখের স্বাভাবিকতা থাকবে।

For each triangle ABC
    n := normalize(cross(B-A, C-A))
    A.n := n
    B.n := n
    C.n := n

মনে রাখবেন যে এই অনুমানগুলি ত্রিভুজগুলির মধ্যে ভাগ করা হয়নি। আমি কিনেক্ট এপিআইয়ের সাথে পরিচিত নই; এগুলি সম্ভবত ভাগ করে নেওয়া সম্ভব, সেক্ষেত্রে আপনাকে সেগুলি নকল করতে হবে বা পরবর্তী সমাধানে যেতে হবে:

মসৃণ শেডিং নরমাল

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

ধারণাটি হ'ল যদি একই ভার্টেক্স তিনটি ত্রিভুজ ভাগ করে T1, T2 এবং T3 উদাহরণস্বরূপ, স্বাভাবিক N গড় হবে N1, N2 এবং N3। তাছাড়া, যদিT1 একটি বড় ত্রিভুজ এবং T2 খুব ছোট, আপনি সম্ভবত এটি চান N আরও প্রভাবিত হতে N1 দ্বারা চেয়ে N2

ক্রস পণ্যটি কীভাবে ক্ষেত্রের সাথে আনুপাতিক? যদি আপনি ক্রস পণ্যগুলি জুড়ে থাকেন তবে যোগফলটি স্বাভাবিক করুন, এটি আমরা চাই ঠিক ওজনযুক্ত যোগফলটি করব। সুতরাং অ্যালগরিদম হয়ে যায়:

For each vertex
    vertex.n := (0, 0, 0)

For each triangle ABC
    // compute the cross product and add it to each vertex
    p := cross(B-A, C-A)
    A.n += p
    B.n += p
    C.n += p

For each vertex
    vertex.n := normalize(vertex.n)

এই কৌশল আর বিস্তারিতভাবে Iñigo Quilez দ্বারা এই নিবন্ধটি ব্যাখ্যা করা হয় একটি মেশ এর চালাক নিয়মমাফিককরণ


স্বাভাবিকের জন্য আরও দেখুন:


আমি এটিকে এক
ঝাঁক দাও

এটি একটি টন লোককে ধন্যবাদ জানিয়েছিল, এটি ঠিক কাজ করেছিল আমি এটি চেয়েছিলাম
আল্লাহজানে


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