আমি এর আগে মার্চিং কিউবস / তেত্রহেদ্রা একটি আইসো সারফেস রেন্ডার করতে প্রয়োগ করেছি। এটি ( ইউটিউব ) কাজ করেছিল , তবে পারফরম্যান্স মারাত্মক ছিল কারণ আমি দেখার দূরত্বের ভিত্তিতে (বা এমনকি পুরানো, দূরবর্তী অংশগুলি অপসারণ) এর উপর ভিত্তি করে বিশদ স্তরের বিশদ স্তর প্রয়োগ করতে পারি নি।
আমি সিদ্ধান্ত নিয়েছি যে আরও একবার যেতে হবে এবং এবার এটি সঠিকভাবে করব। আমি একটি অক্ট্রি নোড তৈরি করে শুরু করেছি যা যখন 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 হয়।
এর কাছে যাওয়ার সর্বোত্তম উপায় কী?