মসৃণ ভক্সেল ভূখণ্ড


13

একটি ব্যক্তিগত প্রকল্প হিসাবে, আমি একটি ভূখণ্ডের জেনারেটর তৈরি করার চেষ্টা করছি যা ক্যাসল স্টোরি মসৃণ ভূখণ্ডের মতো দেখতে ভূখণ্ড তৈরি করবে।

আপনি যদি এটি আগে না দেখে থাকেন তবে এখানে: এখানে চিত্র বর্ণনা লিখুন

আপনি যেমন দেখতে পাচ্ছেন এটি ব্লক এবং "স্মুথ" ব্লকের সংমিশ্রণ।

এই চেহারাটি অনুকরণ করতে আমি যা করার চেষ্টা করেছি তা হ'ল প্রতিটি পৃষ্ঠতলকে একটি মিনি উচ্চতা মানচিত্র দেওয়া। এটি সাধারণত কাজ করে তবে কিছু সমস্যা রয়েছে যা এইভাবে ভূখণ্ড দেয়:

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

সমস্যাটি হ'ল প্রতিটি ব্লক 1x1x1, তবে কখনও কখনও নির্দিষ্ট স্থানে উচ্চতা নেতিবাচক বা>> 1 হয় that সেক্ষেত্রে, আমি এটি ক্লিপ করে এবং উচ্চতা 0 বা 1 এ সেট করি।

আমার অর্থটি আরও ভালভাবে বর্ণনা করার জন্য এখানে একটি চিত্র রয়েছে: এখানে চিত্র বর্ণনা লিখুন

উচ্চতা উত্পন্ন করতে, আমি মূলত:

genColumn(int x, int z)
{
    int highestBlockY = (int)noise2d(x, z);

    bool is_surface = true;

    for(int y = max_height - 1; y >= 0; y--)
    {
        Block b;

        if(is_surface)
        {
            b = Block.Grass;
            b.HasHeightMap = true;

            // generate heightmap
            for(int ix = 0; ix < 5; ix++)
            {
                for(int iz = 0; iz < 5; iz++)
                {
                    float heightHere = noise2d(x + ix / 4, z + iz / 4) - y;

                    // clip heights
                    if(heightHere > 1)
                        heightHere = 1;

                    if(heightHere < 0)
                        heightHere = 0;

                    b.HeightMap[ix][iz] = heightHere;
                }
            }

            is_surface = false;
        }
        else
        {
            b = Block.Dirt;
        }

        setBlock(x, y, z, b);
    }
}

সম্ভবত আমি "সত্য" পার্লিন শব্দটি ব্যবহার করে ভুল করে পৌঁছাচ্ছি?

কোন সাহায্যের ব্যাপকভাবে প্রশংসা হবে!

উত্তর:


11

প্রযুক্তিগত সীমাবদ্ধতার কারণে এই মত কাসল গল্প দেখায়: ছিলে সমগ্র আয়তনের প্রতিটি ভক্সেল প্রতি একটি heightmap সেখানে হতে বদলে প্রতিটি প্রতি একটি heightmap পৃষ্ঠ ভক্সেল, সঞ্চয় খরচ অতি বেশি হয়, হে (ঢ ^ 3 অনুক্রম ) যা আরও বেশি অনুকূল ও (এন ^ 2) এর বিপরীতে প্রতিরোধমূলক হতে পারে, যেখানে এন আপনার বিশ্বের প্রতিনিধিত্বকারী একটি ঘনক ভক্সেল জায়গার পাশের দৈর্ঘ্য। মনে রাখবেন যে গ্রীন কাঠামোতে ভূমধ্যসাগরীয় ভক্সেলগুলির জন্য উচ্চতা মানচিত্রের তথ্য অন্তর্নিহিত, সুতরাং উচ্চতা ম্যাপের তথ্যগুলি কেবলমাত্র সেই ভক্সেলগুলির জন্য স্পষ্টভাবে সঞ্চিত করা উচিত যা পৃষ্ঠের উপরে রয়েছে। সুতরাং ক্যাসল স্টোরি ছেলেরা স্টোরেজ ব্যয় এবং জাল-নির্মাণ জটিলতা বাঁচাতে গ্রিড ইন্টারস্টেসিতে প্রান্তকে ছিটিয়েছে ... পড়ুন।

প্রথমে, আসুন আপনার বিকল্পগুলি দেখুন:

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

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

(২) সম্ভবত তখন আরও ভাল বিকল্প; এটি হ'ল, কোণার প্রান্তটি ভক্সেল গ্রিড ইন্টারস্টেসিতে স্ন্যাপটি সুনিশ্চিত করা। তবে কীভাবে আমরা চূড়ান্ত slাল ইস্যুটির সমাধান করব? ঠিক আছে, আমাদের এমন কিছু গ্রেডিয়েন্ট বাছাই করা দরকার যেখানে আমরা কেবল একটি উল্লম্ব কলামে স্ন্যাপ করি এবং এভাবে আমাদের শীর্ষস্থানীয় ভক্সেলের মাধ্যমে ক্রসকাট করতে পারে এমন কোনও গ্রেডিয়েন্ট নেই ensure 45 ডিগ্রি গ্রেডিয়েন্ট হ'ল প্রাকৃতিক কাটফফ যে কারণে আমি নীচে ব্যাখ্যা করি। সুতরাং (3) এর পরিবর্তে, আমাদের (4) থাকতে হবে:

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

(৪) ভক্সেলের কোণার প্রান্তটি নিকটতম গ্রিডের আন্তঃস্থলে স্ন্যাপ করা হ'ল সমাধান। ভিজ্যুয়াল এফেক্ট - ডায়াগোনাল আলিয়াজিং - আপনার ক্যাসল স্টোরির স্ক্রিনশটে দেখা যাবে। ভক্সেলগুলির কাটফ slালটি 1: 1 গ্রেডিয়েন্ট বা 45 ডিগ্রি (অরথোগোনালি হিসাবে দেখা হয়)। সমাধান থেকে পিছিয়ে কাজ করা, এর কারণগুলি দেখুন:

  • কেবলমাত্র অবিচ্ছিন্ন, চূড়ান্ত haveাল পেতে পারে কেবলমাত্র যদি কোনও ভক্সেলটি উল্লম্বভাবে প্রসারিত হয় ...
  • .... তবে কোনও ভক্সেলের জাল এটির সীমানা অঞ্চল অতিক্রম করতে পারে না, তা প্রকৃত স্মুথ শেপ নির্বিশেষে; একটি ভক্সেলের একটি 3 ডি গ্রিডে একটি নির্ধারিত জায়গায় বসে থাকা দরকার যা অ্যাকাউন্টগুলি, যদি এটি সঠিক ফর্মের জন্য না হয় তবে কমপক্ষে এটি অক্ষ-প্রান্তিকিত বাউন্ডিং বাক্সের জন্য।

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


আমি কেবল এটি বাস্তবায়নের চেষ্টা করেছি, এবং আমি কিছুটা বিভ্রান্তির মধ্যে পড়েছিলাম - "আন্তঃসংযোগ" বলতে কী বোঝ? আপনি কি ইন্টিগ্রাল গ্রিড স্থানাঙ্ক বলতে চান?
শিরোনাম

@ThomasBradworth। "এমন একটি স্থান যা জিনিসের মধ্যে হস্তক্ষেপ করে।" 2 ডি এর জন্য, যদি আপনার কোষগুলির উদ্বিগ্ন গ্রিড থাকে তবে আপনার কাছে (এন + 1) এক্স (এন + 1) ইন্টারস্টেস থাকবে। এটি সরাসরি 3 ডি পর্যন্ত প্রসারিত। এগুলি হ'ল "শীর্ষস্থান" যা প্রতিটি কক্ষকে আবদ্ধ করে, যা বেশিরভাগ অংশে একাধিক ঘর / ভক্সেলের মধ্যে ভাগ করা হয়। যদি আপনি এটিকে 1 ডি (একটি লাইন) এ সিদ্ধ করেন তবে কোষ এবং আন্তঃসংযোগ উভয়ই অ্যারে হিসাবে উপস্থাপিত হলে ঘর 0 ইন্টারস্টাইস 0 এবং ইন্টারস্টিস 1 দ্বারা আবদ্ধ হয়, যখন ঘর 1 ইন্টারস্টাইস 1 এবং আন্তঃআলোক 2 দ্বারা আবদ্ধ হয় ... ইত্যাদি
ইঞ্জিনিয়ার

জবাবের জন্য ধন্যবাদ! আমি ঠিক সেটাই করার চেষ্টা করেছি, তবে কিছু প্রতিকূল ফলাফল পেয়েছি। প্রথমে, আমি প্রান্তগুলিতে উচ্চতার মানগুলিকে কেবল গোল করার চেষ্টা করেছি (যখন x 0 বা 4 হয়, বা z 0 বা 4 হয়) তবে এটি আমাকে পেয়েছে: i.imgur.com/eQW7Y.png ( পেস্টবিন / এলআরআইভিএইচবি ) এরপরে, আমি মাঝখানে পয়েন্টগুলি মসৃণ করার চেষ্টা করেছি, সুতরাং আমি একটি "ফিক্স হাইট ফাংশন" যুক্ত করেছি: পেস্টবিন. com / এজকিউ 077 এমএম তবে এটি আমাকে আরও কৌণিক, তবে খারাপ ফলও দিয়েছে : i.imgur.com/q1JVP .png সম্ভবত আমার শব্দ কর্মের সাথে কিছু ভুল আছে?
শিরোনাম

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

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