ভূখণ্ড প্রজন্মের জন্য অক্ট্রি নির্মাণ


9

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

আমি সিদ্ধান্ত নিয়েছি যে আরও একবার যেতে হবে এবং এবার এটি সঠিকভাবে করব। আমি একটি অক্ট্রি নোড তৈরি করে শুরু করেছি যা যখন Build()ডাকা হয় তখন নীচে কাজ করে ।

  • যদি অংশটি খুব কম তৈরি হয় তবে অবিলম্বে ফিরে আসুন।
  • যদি পৃষ্ঠটি এই অংশের ভলিউমটি দিয়ে যায় তবে কাজ করুন।
  • যদি তা হয়, তবে সিদ্ধান্ত নিন যে আমরা এলওডি বাড়াতে চাইছি (কারণ ক্যামেরাটি নিকটে)
  • যদি তা হয় তবে 8 টি শিশুকে স্পন করুন এবং তাদের উপর একই প্রক্রিয়াটি কল করুন
  • যদি তা না হয় তবে বর্তমান নোডের মাত্রা ব্যবহার করে জালটি তৈরি করুন

কিছু সিউডো কোড:

OctNode Build() {
    if(this.ChunkSize < minChunkSize) {
        return null;
    }
    densityRange = densitySource¹.GetDensityRange(this.bounds);
    if(densityRange.min < surface < densityRange.max) {
        if(loDProvider.DesiredLod(bounds > currentLoD) {
            for(i 1 to 8) {
                if(children[i] == null) {
                    children[i] = new OctNode(...)
                }
                children[i] = children[i].Build();
            }
        } else {
            BuildMesh();
        }
        return this;
    }
}

A পাশাপাশি এক পর্যায়ে ঘনত্ব ফিরিয়ে দেওয়ার পাশাপাশি, ঘনত্বের উত্স প্রদত্ত ভলিউমের জন্য সম্ভাব্য ঘনত্বের পরিধি নির্ধারণ করতে পারে।

D এলওডি সরবরাহকারী একটি বাউন্ডিং বাক্স নেয় এবং ক্যামেরার অবস্থান / হতাশা, ব্যবহারকারীর সেটিংস ইত্যাদির উপর ভিত্তি করে সর্বাধিক কাঙ্ক্ষিত এলওডি প্রদান করে ...

সুতরাং ... এটি সমস্ত ভালভাবে কাজ করে। ঘনত্ব উত্স হিসাবে একটি সাধারণ গোলক ব্যবহার করে এবং সমস্ত নোড দেখাচ্ছে:

পূর্ণ অক্টোবর

এবং কেবল পাতাগুলি:

অক্ট্রি কেবল পাতাগুলি দেখাচ্ছে

তবে কয়েকটি সমস্যা রয়েছে:

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

আমি কয়েকটি বিকল্পের কথা ভেবেছি তবে উভয়ই ত্রুটিযুক্ত বলে মনে হচ্ছে:

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

¹ [নীচে কিউয়ের ব্যাখ্যাতে] বর্তমানে, যদি গাছের 2 টি শারীরিকভাবে সংলগ্ন নোডগুলি বিভিন্ন এলওডিতে থাকে তবে আমার কাছে ভার্টস চাপিয়ে দেওয়ার জন্য কিছু কোড রয়েছে যাতে মেশগুলি উত্পন্ন হওয়ার সময় কোনও সিম নেই। আশেপাশের নোডের একাধিক ঘনত্ব জেনে আমি এটি করতে সক্ষম। আমার কাছে পাশাপাশি দু'টি স্বাধীন অক্ট্রি রয়েছে এমন দৃশ্যে আমার কাছে এই তথ্যগুলি পুনরুদ্ধার করার কোনও সহজ উপায় নেই, যার ফলে seams হয়।

এর কাছে যাওয়ার সর্বোত্তম উপায় কী?

উত্তর:


1

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

আমাকে প্রাথমিক বাউন্ডিং ভলিউমটি সংজ্ঞায়িত করতে হবে (এবং এটি যত বড় হবে তত বেশি প্রক্রিয়াকরণ করতে হবে)

এটি হওয়া উচিত বলে মনে হচ্ছে না। যেহেতু অষ্টা গ্রানুলারিটিতে তাত্পর্যপূর্ণভাবে বৃদ্ধি পায়, শীর্ষে কয়েকটি স্তর যুক্ত করা পারফরম্যান্স হিটের একটি খুব ছোট নেট বৃদ্ধি হওয়া উচিত।

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

আপনি যদি "রুট অষ্ট্রি" কিছু "বড় পরিমাণের মান" দিয়ে ঠিক করেন তবে "প্রাথমিক ভলিউমের সাথে তুলনামূলক লোড" কোনও সমস্যা হবে না। এবং উপরে উল্লিখিত হিসাবে, আমি মনে করি না শীর্ষে অতিরিক্ত স্তর থাকা সামগ্রিক কর্মক্ষমতাকে প্রভাবিত করবে।

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

আমি এটি যেমন বুঝতে পারি, পূর্ববর্তী বিশদ অঞ্চল থেকে দূরে সরে যাওয়ার সময় প্রস্তাবিত সমাধানটি এলওডি কমিয়ে আনার বিষয়ে। আমি অনুভব করি এটি "বর্ধমান লোড" কোড পাথের সাথে খুব মিল দেখাচ্ছে:

if (loDProvider.DesiredLod(bounds) <(is a lot less than)< currentLoD) { 
    for(i = 1 to 8) { 
        children[i].Destroy();
    }
    BuildMesh();
}

তারপরে, আপনি দূরবর্তী নোডগুলি পরীক্ষা করার জন্য খুব বেশি সময় ব্যয় করছেন না কারণ আপনি উচ্চতর-রেজোলিউশন নোডগুলি সরিয়ে ফেলা হতে পারার পরেও অনেকগুলি "সক্রিয়" নোড নেই বলে আপনি নির্ভর করতে পারেন।


ধরে নেওয়া ছোট ছোট নোডগুলি রক-স্কেল, এর অর্থ হ'ল সম্ভাব্য কয়েক ডজন স্তর যদি আমি একটি মহাদেশ জুড়ে ভ্রমণ করি না

আমি মনে করি অষ্টকের লোগারিথমিক স্কেল এটিকে এখনও সম্ভবপর করে তোলে। যদি আপনার শীর্ষ স্তরটি 1000,0000,000 মিটার প্রশস্ত হয় (এটি আসল পৃথিবীর চেয়ে 25 গুণ প্রশস্ত হবে এবং পৃষ্ঠের ক্ষেত্রফলের সাথে 625x হবে) এবং আপনার সর্বনিম্ন স্তরের বিটগুলি 10 সেন্টিমিটার অবধি রয়েছে, যা অষ্টমীতে 32 স্তর রয়েছে যা সম্ভবত যথেষ্ট পরিচালনযোগ্য যদি আপনি কোনও গ্রহ পৃথিবীর চেয়ে 100 গুণ প্রশস্ত (এবং 10000 গুণ বেশি পৃষ্ঠভূমি সহ) চেয়েছিলেন তবে এটি আপনার অষ্টমীতে কেবলমাত্র অতিরিক্ত 3-4 স্তরের স্তর রয়েছে। এই মুহুর্তে এটি কোনও খেলোয়াড়কে বিশ্বজুড়ে হাঁটতে কয়েকশো বছর সময় লাগবে এবং আপনি যদি নির্বোধ ভাসমান পয়েন্ট গণিত ব্যবহার করেন তবে বিশ্ব নির্ভুল ত্রুটিগুলি সংগ্রহ করবে।

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

এটি কি মূলত কোটি কোটি কিলোমিটার প্রশস্ত অষ্ট্রি রাখার সমতুল্য নয় তবে প্রত্যেকটির কাছে পয়েন্টারগুলির একটি তালিকা রাখুন, বলুন, 1km ব্লক? তারপরে "জাল কাটা" কেবল 2 কিলোমিটার-আকারের নোডের উপর নির্ভর করবে। প্রতিটি মাঝারি স্তরের "বৃহত ব্লক" এর একটি স্থানীয় রেফারেন্স রাখা আপনার উপরের স্তরের নোডগুলির মধ্যে পুনরাবৃত্তি করতে বাধা দেয়, যদি আপনি "সম্ভবত কয়েক ডজন অতিরিক্ত অষ্ট্রি স্তরের" সম্পর্কে উদ্বিগ্ন হন


উত্তর করার জন্য ধন্যবাদ. আমার অঞ্চলটি অসীম হওয়ায় আমি কেবলমাত্র একটি বৃহত প্রাথমিক ভলিউম তুলতে পারি না (এটি আমার লক্ষ্য)। ধারণা পেতে ভিডিওটি দেখুন। এর মতো, আমার নোডের গাছটি কেবল উচ্চতর হবে। ধরে নেওয়া ছোট ছোট নোডগুলি রক-স্কেল, এর অর্থ হ'ল আমি কোনও মহাদেশ জুড়ে ভ্রমণ করার সময় কয়েকশ স্তরের না হলেও সম্ভাব্য কয়েক ডজন। পুনঃসংশ্লিষ্ট, আমাকে প্রশ্নে আরও কিছু বিশদ যুক্ত করুন [সম্পন্ন]
বেসিক

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

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