Gaussian Splat কী?
Published:
আগের লেখায় আমরা বিন্দুমেঘ পর্যন্ত পৌঁছেছিলাম: শূন্যে ভাসতে থাকা হাজার হাজার বিন্দু, যার প্রতিটি গাছের এমন এক টুকরো যা নিয়ে সফটওয়্যার নিশ্চিত ছিল।
কিন্তু বিন্দুমেঘ এখনো মডেল নয়। এ কেবল কতগুলো নমুনা, যাদের মাঝখানে কিছুই নেই। জুম করে কাছে গেলে গাছটি ফাঁকে ফাঁকে মিলিয়ে যায়।
চেনা পরবর্তী ধাপ
প্রচলিত পদক্ষেপ হলো একটি মেশ বানানো: বিন্দুগুলোর উপর ছোট ছোট ত্রিভুজের একটি চামড়া টেনে দেওয়া, যাতে ফাঁকগুলো বুজে যায় এবং একটি অবিচ্ছিন্ন তল পাওয়া যায়।
এটি চমৎকার কাজ করে, আর কম্পিউটার গ্রাফিক্সের প্রায় পুরোটাই এর উপর দাঁড়ানো। কফির মগ, গাড়ির দরজা, জাদুঘরের ভাস্কর্য — মেশ সবগুলোকেই ভালোভাবে বর্ণনা করে, কারণ এগুলোই ঠিক তাই যা মেশ ধরে নেয়: নিরেট, অস্বচ্ছ বস্তু, যাদের ভেতর আর বাইরের মাঝে একটি পরিষ্কার সীমানা আছে।
গাছ এই ধারণাগুলোর প্রতিটিই ভাঙে
পাতা নিরেট নয়। এটি একটি পাতলা পাত, এত পাতলা যে “ভেতর” বলে কিছু প্রায় নেই-ই — ফলে মেশকে হয় প্রায় লেগে থাকা দুটি তল হিসেবে, নয়তো পুরুত্বহীন একটিমাত্র তল হিসেবে একে দেখাতে হয়, আর কোনোটিতেই স্বস্তি নেই।
পাতা অস্বচ্ছও নয়। জানালার আলোর সামনে ধরুন, আলো ভেদ করে আসতে দেখবেন। একটি ত্রিভুজ হয় আছে, নয় নেই; আংশিকভাবে বলার কোনো শব্দ তার নেই।
আর পাতার ছাউনি নিজেকেই আড়াল করে। পাতা পাতাকে ঢেকে রাখে, তাই বিন্দুমেঘে সবসময় এমন অঞ্চল থেকে যায় যা কোনো ক্যামেরাই দেখেনি। মেশ বানানোর সময় সফটওয়্যারকে সেখানে কিছু একটা করতেই হয়, আর সে যা করে তা হলো অনুমান — ফাঁকের উপর সেতু বেঁধে দেওয়া, কাছাকাছি চলে আসা দুটি আলাদা পাতাকে জুড়ে এক করে ফেলা, কিংবা যেখানে পাতা আসলে আরও বিস্তৃত ছিল সেখানে খাঁজকাটা প্রান্ত রেখে দেওয়া।
শেষ কথাটিই আমার কাছে সবচেয়ে গুরুত্বপূর্ণ। মেশকে সিদ্ধান্ত নিতেই হয়। প্রতিটি ত্রিভুজ একটি কঠিন দাবি — তল ঠিক এখানেই। আর যেখানে প্রমাণ দুর্বল ছিল, সেখানেও সে দাবিটি করে বসে, নিঃশব্দে, কোনটি মাপা আর কোনটি বানানো তা বোঝার কোনো চিহ্ন না রেখে।
অন্য এক উপস্থাপন
তাই তলটাই ছেড়ে দিন। একটিমাত্র চামড়ার বদলে গাছটিকে বর্ণনা করুন বহুসংখ্যক নরম, আধা-স্বচ্ছ ফোঁটা দিয়ে।
প্রতিটি ফোঁটা একটি ত্রিমাত্রিক গাউসিয়ান: একটি ঝাপসা উপবৃত্তাকার পিণ্ড, কেন্দ্রে সবচেয়ে ঘন, বাইরের দিকে মসৃণভাবে মিলিয়ে যাওয়া, কোথাও কোনো প্রান্ত নেই। সে বহন করে সামান্য কয়েকটি সংখ্যা — কোথায় বসে আছে, তার আকার ও দিক, তার রং, আর সে কতটা অস্বচ্ছ। একটি দৃশ্য মানে এমন কয়েক লক্ষ থেকে কয়েক মিলিয়ন ফোঁটা, একে অপরের উপর ছড়িয়ে।
আঁকতে হলে প্রতিটি ফোঁটাকে ছবির তলে প্রক্ষেপ করুন, গভীরতা অনুসারে সাজান, আর সামনে থেকে পেছনে মিশিয়ে দিন। ব্যস — কোনো রে-ট্রেসিং নেই, তলের সঙ্গে ছেদ বের করা নেই। সমতল আকৃতি মেশানোর কাজটি গ্রাফিক্স হার্ডওয়্যার অসম্ভব ভালো পারে, আর তাই স্প্ল্যাটের দৃশ্য রিয়েল-টাইমে আঁকা যায়। নামটিও এই ধাপ থেকেই এসেছে: প্রতিটি ফোঁটাকে পর্দার উপর ছিটিয়ে দেওয়া হয়।
ফোঁটাগুলো আসে কোথা থেকে
এগুলো নকশা করা হয় না। এগুলো বসানো হয়, মিলিয়ে মিলিয়ে।
আগের লেখার বিন্দুমেঘ দিয়ে শুরু করুন, প্রতিটি বিন্দুতে একটি করে ফোঁটা বসান। এবার এমন এক ক্যামেরা-অবস্থান থেকে এই এলোমেলো স্তূপটিকে আঁকুন যেখানকার আসল ছবি আপনার হাতে আছে, আর দুটি ছবি মিলিয়ে দেখুন। মিলবে না।
গুরুত্বপূর্ণ ব্যাপারটি হলো, এই আঁকাটি প্রতিটি ফোঁটার প্রাচলের সাপেক্ষে একটি অন্তরকলনযোগ্য ফাংশন। অর্থাৎ প্রতিটি ফোঁটার জন্য হিসাব করা যায় — তার অবস্থান কোন দিকে ঠেলতে হবে, আকার কীভাবে টানতে হবে, রং কতটা সরাতে হবে, যাতে আঁকা ছবিটি আসল ছবির আরও কাছে যায়। আপনার সব ছবির উপর এটি হাজার হাজার বার চালান, আর ফোঁটাগুলো এমন এক বিন্যাসে থিতু হয় যা আপনার তোলা প্রতিটি দৃশ্যকেই ফিরিয়ে দেয়।
অপ্টিমাইজার সংখ্যাটাও নিয়ন্ত্রণ করে। যেখানে ভুল একগুঁয়েভাবে বড় থেকে যায়, সেখানে সে ফোঁটা ভাঙে ও নকল করে বিস্তারিত বাড়ায়; আর যে ফোঁটার অস্বচ্ছতা প্রায় শূন্যে নেমে গেছে, তাকে মুছে দেয়। একটি গাছের জন্য কয়টি ফোঁটা লাগবে, তা কেউ বলে দেয় না।
আর পাতা জিনিসটা কী, সেটিও কেউ কখনো তাকে বলে না। একমাত্র নির্দেশ হলো: তোমার আঁকা ছবিগুলো যেন আমার তোলা ছবির মতো দেখায়।
এটি গাছের জন্য কেন মানানসই
উপবৃত্তাকার পিণ্ড প্রসারিত হতে পারে। একটি ফোঁটা পাতার ফলক বরাবর চ্যাপ্টা চাকতি হয়ে শুয়ে পড়তে পারে, কিংবা কাণ্ড বা আকর্ষী বরাবর লম্বা সূচের মতো টেনে যেতে পারে। এই দিকনির্ভর স্বাধীনতা — অ্যানআইসোট্রপি — এমনিতেই পাওয়া যায়, আর তার মানে সরু গঠনের জন্য অনেক ফোঁটা লাগে না, লাগে কেবল সঠিক আকারের ফোঁটা।
অস্বচ্ছতা প্রতিটি ফোঁটার নিজস্ব এবং অবিচ্ছিন্ন, তাই স্বচ্ছতা আর নরম প্রান্ত আন্দাজ না করে সরাসরি প্রকাশ করা যায়। আর এটি এমন কিছু দেয় যা মেশের পক্ষে সম্ভব নয়: যেখানে ছবিগুলো অস্পষ্ট ছিল, সেখানে ফোঁটা কেবল ফিকে হয়েই থাকে। মডেলটি তল বানিয়ে নেওয়ার বদলে দাবি করা থেকে বিরত থাকে।
ভুল করার মতো কোনো টপোলজিও এখানে নেই। কাছাকাছি চলে আসা দুটি পাতা দুটি আলাদা ফোঁটার মেঘই থেকে যায়। কিছুই জোড়া লাগে না।
যা এটি দেয় না
সৎভাবে, দুটি সীমাবদ্ধতা।
প্রথমত, এটি আঁকার জন্য বানানো উপস্থাপন, মাপার জন্য নয়। একটি স্প্ল্যাট মডেলকে জিজ্ঞেস করুন “পাতার তলটি ঠিক কোথায়?” — একক কোনো উত্তর নেই, কারণ পুরো কথাটাই তো এই যে সে কখনো কোনো তল আঁকেনি। ঝাপসা ফোঁটার মেঘ থেকে পাতার ক্ষেত্রফল বের করা রীতিমতো একটি কাজ, নিছক দেখে নেওয়া নয়।
দ্বিতীয়ত, আর এই ধারাবাহিকের জন্য এটিই বেশি জরুরি: স্প্ল্যাটিং আগের লেখার সমস্যাটি হুবহু উত্তরাধিকারসূত্রে পায়। ফোঁটাগুলো সেই একই অনির্দিষ্ট এককের জগতে বাস করে, যেখান থেকে বিন্দুমেঘটি এসেছিল। Gaussian Splatting উন্নত করে মডেলটি কতটা বিশ্বস্তভাবে গাছের মতো দেখায় তা। গাছটি কত বড়, সে বিষয়ে এটি কিছুই করে না।
সুতরাং এখন আমাদের হাতে আছে গাছের এক সুন্দর, উচ্চ-নিষ্ঠ মডেল — যার আকার অজানা।
এই ধারাবাহিকের পরের পর্ব: স্কেল একবারও ঠিক না করে গাছের বৈশিষ্ট্য মাপা যায় কীভাবে।
