হতাশার মধ্যে সবচেয়ে উপযুক্ত গোলকটি কীভাবে খুঁজে পাব?


12

আপনি দৃষ্টিকোণে আঁকতে পারেন এমন সবচেয়ে বড় ক্ষেত্রটি কীভাবে খুঁজে পাবেন?

উপর থেকে দেখা, এটি হবে:

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

যোগ করা হয়েছে: ডানদিকে হতাশায়, আমি চারটি পয়েন্ট চিহ্নিত করেছি যা আমি মনে করি যে আমরা কিছু জানি। আমরা ফ্রসামের সমস্ত আটটি কোণ এবং নিকটস্থ এবং দূরবর্তী কেন্দ্রগুলি আনপোজোজ করতে পারি। সুতরাং আমরা পয়েন্ট 1, 3 এবং 4 জানি। আমরা জানি যে পয়েন্ট 2 3 থেকে 4 হিসাবে একই দূরত্ব 4 থেকে 4 হয় তাই আমরা পেতে 1 লাইন 1 থেকে 4 পয়েন্ট 2 নিকটতম পয়েন্ট গণনা করতে পারেন কেন্দ্র? তবে আসল গণিত এবং কোড আমাকে এড়িয়ে চলে।

আমি যতটা সম্ভব মডেলগুলি আঁকতে চাই (যা প্রায় গোলাকৃতির এবং যার জন্য আমার কাছে মিনি মিনি সীমাবদ্ধ গোলক রয়েছে)।

আপডেট: বোবোবোবো এবং নাথান রিডের পরামর্শ অনুযায়ী আমি বৃত্ত অন টু-প্লেন পদ্ধতির প্রয়োগের চেষ্টা করেছি :

function getFrustumsInsphere(viewport,invMvpMatrix) {
    var midX = viewport[0]+viewport[2]/2,
        midY = viewport[1]+viewport[3]/2,
        centre = unproject(midX,midY,null,null,viewport,invMvpMatrix),
        incircle = function(a,b) {
            var c = ray_ray_closest_point_3(a,b);
            a = a[1]; // far clip plane
            b = b[1]; // far clip plane
            c = c[1]; // camera
            var A = vec3_length(vec3_sub(b,c)),
                B = vec3_length(vec3_sub(a,c)),
                C = vec3_length(vec3_sub(a,b)),
                P = 1/(A+B+C),
                x = ((A*a[0])+(B*a[1])+(C*a[2]))*P,
                y = ((A*b[0])+(B*b[1])+(C*b[2]))*P,
                z = ((A*c[0])+(B*c[1])+(C*c[2]))*P;
            c = [x,y,z]; // now the centre of the incircle
            c.push(vec3_length(vec3_sub(centre[1],c))); // add its radius
            return c;
        },
        left = unproject(viewport[0],midY,null,null,viewport,invMvpMatrix),
        right = unproject(viewport[2],midY,null,null,viewport,invMvpMatrix),
        horiz = incircle(left,right),
        top = unproject(midX,viewport[1],null,null,viewport,invMvpMatrix),
        bottom = unproject(midX,viewport[3],null,null,viewport,invMvpMatrix),
        vert = incircle(top,bottom);
    return horiz[3]<vert[3]? horiz: vert;
}

আমি স্বীকার করছি যে আমি এটি ডানা দিচ্ছি; আমি 2 ডি কোডটি 3 মাত্রায় প্রসারিত করে অভিযোজিত করার চেষ্টা করছি । এটি নিখরচায়কে সঠিকভাবে গণনা করে না; গোলকের কেন্দ্রবিন্দুটি প্রতিবার ক্যামেরা এবং উপরের-বামের মধ্যবর্তী লাইনে এবং এটি খুব বড় (বা খুব কাছে) বলে মনে হয়। আমার কোডে কোন সুস্পষ্ট ভুল আছে? পদ্ধতির, যদি স্থির হয়, কাজ করে?


চিত্রটি যেমন গোলকটি পুরো দূরতলের বিমানের একদম পাশের অংশে থাকতে হবে?
মিকেল হগ্রস্টর্ম

@ মিকাএলহিগস্ট্রোম আমি ভাবছি তারা যতটা সম্ভব বড় হওয়ার জন্য হত?
উইল

হুম আমি অনুমান করি এটি আপনার উদ্দেশ্যটির উপর নির্ভর করে ... আপনি যদি দূর-বিমানের বাইরে অর্ধেক দিয়ে একটি গোলক আঁকেন তবে তা আরও বড় হতে পারে তবে সম্ভবত এটি আপনার উদ্দেশ্যটির পরিপন্থী?
মিকেল হগ্রস্টর্ম

@ মিকাএলহিগাস্ট্রমে আহা আপনার প্রশ্নটি আমি বুঝতে পেরেছি; হ্যাঁ আমি পুরো মডেলটি আঁকতে চাই, এর মধ্য দিয়ে কোনও দূরের বিমান অবরুদ্ধ নয়।
উইল

উত্তর:


12

আমি ধরে নেব যে আপনার হতাশাটি প্রতিসম হয়, যেহেতু আপনার অঙ্কনটি এটিকে বোঝায়। তিনটি প্রতিবন্ধকতা রয়েছে (আপনার হতাশার 2D হলে দুটি):

উ: গোলকটি কাছাকাছি এবং দূরবর্তী বিমানগুলির মধ্যকার দূরত্বের চেয়ে বড় হতে পারে না

যদি Dখুব কাছের দূরত্ব হয় তবে প্রথম সীমাবদ্ধতাটি হ'ল:

R  D / 2

খ। পাশের প্লেনগুলির চেয়ে গোলকটি আরও প্রশস্ত হতে পারে না

এখন অন্য প্রতিবন্ধকতার জন্য, ধরা যাক αহতাশার অর্ধকোণা এবং Lএটি দূরবর্তী বিমানের অর্ধ-প্রস্থ, যা এই অঙ্কনটিতে দেখানো হয়েছে:

frustum

প্রথম সূত্রটি ত্রিভুজটিতে ত্রিকোণমিতি দ্বারা প্রদত্ত। দ্বিতীয়টি একটি ত্রিভুজের কোণগুলির যোগফল থেকে আসে। যা আমাদের দ্বিতীয় বাধা দেয়:

R  L tan((π - 2α) / 4)

আপনার হতাশা যদি 3D হয় তবে আপনার কাছে নতুন Lএবং αমানগুলির সাথে তৃতীয় বাধা থাকবে ।

সর্বশেষ ফলাফল

আপনি যে Rমানটির সন্ধান করছেন তা হ'ল minতিনটি সীমানার।

প্যারামিটারগুলি কীভাবে পাবেন

যদি আপনি হতাশার দৃশ্য বা বিশ্বজগতের প্রতিফলন করতে পারেন তবে আপনি নিম্নলিখিত উপায়ে এল, ডি এবং comp গণনা করতে পারেন, যেখানে Pপয়েন্টগুলি নিকটবর্তী বিমান থেকে এবং Qপয়েন্টগুলি দূর বিমান থেকে:

formula2

তীরগুলি অর্থ ভেক্টর, "।" ডট পণ্য, এবং || একটি ভেক্টরের দৈর্ঘ্য নির্দেশ করে। প্রতিস্থাপন Q2সঙ্গে Q3এবং P2সঙ্গে P3উল্লম্ব মাত্রা এল এবং α জন্য।


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

@ আমি সূত্রগুলি সহ একটি দ্বিতীয় অঙ্কন যুক্ত করব যা আশা করি সহায়তা করবে।
সাম হোচেভার

2

2 ডি তে: হতাশাকে ত্রিভুজ হিসাবে বিবেচনা করুন (2 ডি)

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

তারপরে আপনি ত্রিভুজটির বৃত্তটি সন্ধান করতে চান ।

3 ডি সমস্যা হিসাবে, আপনাকে স্কোয়ার ভিত্তিক পিরামিডের নিখরচিকা খুঁজে নেওয়া দরকার ।

আমার যদি সূত্রটি থাকে তবে আমি এটি এখানে মুদ্রণ করব, তবে হায়, সূত্রটি আমি জানি না।


2
এটি 2D এর মধ্যে উল্লম্ব বা অনুভূমিক হতাশার অন্তর্ভুক্ততা খুঁজে পাওয়ার পক্ষে যথেষ্ট, কমপক্ষে "স্ট্যান্ডার্ড" হতাশার জন্য (কম শেয়ারড বা কিছুই নয়) যার মধ্যে ছোট এফওভি রয়েছে।
নাথান রিড

1

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

একটি গোলকটি এর কেন্দ্রবিন্দু এবং একটি ব্যাসার্ধ দ্বারা সংজ্ঞায়িত করা যেতে পারে। সিক্স এবং সিটি সমতল অঞ্চলের কেন্দ্র হিসাবে একই।

উপরে তালিকাভুক্ত অনুমানের উপর ভিত্তি করে একটি সমীকরণ সিস্টেম সমাধান করে সিজেড এবং ব্যাসার্ধ পাওয়া যাবে।

টি হ'ল নীচের / শীর্ষ বিমান বা বাম / ডান সমতল (উপরে দেখুন) এর সাথে টি 1, টি 2 এবং টি 3 টি সাধারণ ভেক্টর হিসাবে এবং উত্স থেকে দূরত্ব হিসাবে টি 4 রয়েছে with f হল বিমানের কেন্দ্রস্থল।

t1 * সিক্স + টি 2 * সাই + টি 3 * সিজেড - টি 4 = আর

-fz + cz = r

টি 1 * সিক্স + টি 2 * সাই + টি 3 * সিজেড - টি 4 = -ফিজ + সিজেড

টি 1 * সিক্স + টি 2 * সাই + এফজেড - টি 2 = + সিজেড - টি 3 * সিজেড

টি 1 * সিক্স + টি 2 * সাই - এফজেড - টি 2 = সিজেড * (1 - টি 3)

সিজেড = (টি 1 * সিক্স + টি 2 * সাই - এফজেড - টি 2) / (1 - টি 3)

আর এর পরে সিজেডটি প্রবেশ করে এটি গণনা করা হয়: -fz + cz = r

আপনি যে প্রোজেকশন ম্যাট্রিক্স ব্যবহার করছেন তা থেকে সমস্ত প্লেন পেতে পারেন। (এই ক্ষেত্রে ভিউপ্রজেকশন নয়)

এরপরে আপনাকে গোলকটি ডান জায়গায় নিয়ে যেতে হবে: সি '= বিপরীতমুখী (দেখুন) * সি


1

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

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

একমাত্র অপূর্ণতা হ'ল বৃত্ত বা গোলকটি অগত্যা বৃহত্তম বৃত্ত বা সম্ভাব্য অনুভূত হবে না। প্রচুর পরিমাণে ভলিউম এবং একটি খুব সংক্ষিপ্ত প্রান্ত সহ একটি হতাশার জন্য, চেনাশোনা / গোলকটি হতাশাগুলির চেয়ে কম জায়গা ভাগ করে নেবে than

অন্য আইডিয়া

আপনি যদি কোনও 3 ডি ভিউ-হতাশার অনুষঙ্গ চান এবং আপনার এই হতাশা তৈরির জন্য পরিপ্রেক্ষিত ম্যাট্রিক্স ব্যবহার করা থাকে, তবে আপনি কেবল সেই ইউনিট কিউবের অবসরস্থলে সেই ম্যাট্রিক্সটি ব্যবহার করতে পারেন এবং হতাশার জন্য এটি একটি নিখুঁত পরিশ্রমী হওয়া উচিত। (একটি ঘনক্ষেত্রের অবকাশের ব্যাসটি কিউবের এক প্রান্তের দৈর্ঘ্য, কেন্দ্রটি কিউবের মাঝখানে যা ঘনক্ষেত্রের দৈর্ঘ্যের গড়)

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