ভক্সেল ভূখণ্ড উপস্থাপনের জন্য কোন ডেটা স্ট্রাকচার ব্যবহার করা উচিত?


18

মতে উইকিপিডিয়া পৃষ্ঠা voxels সম্পর্কে, "[...] একটি ভক্সেল অবস্থান অন্যান্য voxels তার অবস্থান আপেক্ষিক উপর ভিত্তি করে অনুমিত হয় (অর্থাত, একটি একক আয়তনের ইমেজ তোলে আপ ডাটা স্ট্রাকচার মধ্যে তার অবস্থান)।"

এই জাতীয় ডেটা স্ট্রাকচার কীভাবে বাস্তবায়ন করা উচিত? আমি একটি অষ্টা গাছের কথা ভাবছিলাম তবে আমি ভাবছিলাম যে এরকম অন্য কিছু আছে যা আমি কখনও শুনিনি।


1
এটি জিজ্ঞাসা করা কিছুটা কঠিন প্রশ্ন কারণ এটি আপনার ভক্সেল ডেটা কী ডেটা প্রয়োজন তা নির্ভর করে। ভক্সেলটি কতটা পরিপূর্ণ, এটি দেখতে কেমন লাগে ইত্যাদি বিষয়গুলি আপনি কী করছেন তার উপর মোটামুটি নির্ভরশীল হতে চলেছে। দ্বিতীয়ত ডেটা স্ট্রাকচারকে উপাত্তের রিয়েল টাইম ম্যানিপুলেশন এবং পরবর্তী সময়ে এটি আপডেট করার জন্য উচ্চ গতির অ্যাক্সেসের জন্য নিজেকে hasণ দিতে হয় .. কীভাবে ভক্সেলের প্রতি মেমরি কাঠামোকে কম রাখতে এবং ডেটা দ্রুত অ্যাক্সেস / ম্যানিপুলেশন দ্রুত রাখতে হয় তা মূল প্রযুক্তিগত চ্যালেঞ্জগুলি হ'ল ভক্সেল ইঞ্জিনগুলির সাথে কাজ করার সময় মোটামুটি নির্দিষ্ট উদ্দেশ্য। একটি উত্তর নয়, তাই একটি মন্তব্য।
জেমস

উত্তর:


14

প্রথম। প্রতিটি ভক্সেল সম্পর্কে আমরা কী জানি তা লিখতে দিন:

voxel = (x, y, z, color) // or some other information

সাধারণ স্টোরেজ

সাধারণ উপায় সহজভাবে এটি:

set of voxels = set of (x,y,z, color)

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

সাধারণ ডেটার জন্য এটি সূক্ষ্ম হওয়া উচিত। তবে এটি কোনওভাবেই একটি দ্রুত ডেটা কাঠামো নয়।

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

দ্রুত অনুসন্ধান

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

array [x][y][z] of (color)
  • এক্স, ওয়াই, জেড স্থানাঙ্ক দ্বারা ভক্সেল সন্ধান করার জন্য এটিতে ও (1) রয়েছে।

  • সমস্যাটি হচ্ছে, এটির স্থানের প্রয়োজনীয়তাগুলি হ'ল ডি (ডি ^ 3), যেখানে ডি প্রতিটি x, y এবং z সংখ্যার পরিসর (আসল সংখ্যাটি ভুলে যান, যেহেতু তারা যদি অক্ষর হয়, যার 256 মান রয়েছে), সেখানে 256 would থাকবে 3 = 2 ^ 24 == 16 777 216 উপাদান অ্যারে)।

তবে এটি ভক্সেলগুলির সাথে আপনি কী করতে চান তার উপর নির্ভর করে। যদি রেন্ডারিং আপনি যা চান তা হয় তবে সম্ভবত আপনি যা চান এটি হ'ল এটি ar তবে সংরক্ষণের সমস্যা এখনও অবধি ...

স্টোরেজ সমস্যা হলে

একটি পদ্ধতি হ'ল অ্যারেতে RLE সংক্ষেপণ ব্যবহার করা। ভক্সেলের একটি টুকরো কল্পনা করুন (ভক্সেলের সেট, যেখানে ভক্সেলের একটি স্থানাঙ্ক ধ্রুবক মান থাকে .... প্লেনের মতো যেখানে z = 13 উদাহরণস্বরূপ)। ভক্সেলগুলির এই জাতীয় স্লাইসটি এমএসপেইন্টে কিছু সাধারণ অঙ্কনের মতো দেখাবে । ভক্সেল মডেল, আমি বলব, সাধারণত সমস্ত সম্ভাব্য জায়গার ভগ্নাংশ দখল করে (সমস্ত সম্ভাব্য ভক্সেলের ডি ^ 3 স্থান)। আমি বিশ্বাস করি, "ত্রিপলি স্থানাঙ্কের এক জোড়া নিয়ে বাকী অক্ষটি সংকুচিত করুন" এই কৌশলটি করবে (উদাহরণস্বরূপ [x] [y] নিন এবং প্রতিটি উপাদানের জন্য প্রদত্ত x, y এ z অক্ষের সমস্ত ভক্সেল সংকোচিত করবেন)। । এখানে 0 থেকে কয়েকটি উপাদান থাকা উচিত, আরএলই এখানে ভাল করবে):

array [x][y] of RLE compressed z "lines" of voxel; each uncompressed voxel has color 

স্টোরেজ সমস্যা সমাধানের অন্যান্য পদ্ধতি গাছের ডেটা কাঠামো ব্যবহার করে অ্যারের পরিবর্তে হবে:

tree data structure  = recursively classified voxels
for octrees: recursively classified by which octant does voxel at (x,y,z) belong to
  • অক্ট্রি, নিক দ্বারা উল্লিখিত হিসাবে। এটি ভক্সেলগুলি সংকোচিত করা উচিত। অক্ট্রি দেখার জন্য এমনকি একটি শালীন গতি আছে, আমার ধারণা এটি কোনও হে (লগ এন), যেখানে এন ভক্সেলের সংখ্যা।
  • অক্ট্রি শালীনভাবে নির্বিচারে ভক্সেল ডেটা সঞ্চয় করতে সক্ষম হওয়া উচিত।

ভক্সেলগুলি যদি কিছু সরল উচ্চতা ম্যাপ হয় তবে আপনি এটি কেবল সঞ্চয় করতে পারেন। অথবা আপনি উচ্চতা মানচিত্র উত্পন্ন করে এমন ক্রিয়াকলাপের জন্য প্যারামিটারগুলি সঞ্চয় করতে পারেন, যা পদ্ধতিগতভাবে এটি উত্পন্ন করে ...

এবং অবশ্যই আপনি সমস্ত সম্ভাব্য পদ্ধতির একত্রিত করতে পারেন। তবে এটি অত্যধিক করবেন না, যদি না আপনি পরীক্ষা করেন যে আপনার কোডটি কাজ করে এবং এটি পরিমাপ করে যে এটি সত্যিই দ্রুত (তাই এটি অপ্টিমাইজেশনের পক্ষে মূল্যবান)।

টি এল; ডিআর

অক্ট্রি ব্যতীত ভক্সেল, গুগল "ভক্সল্যাপ", "কেন সিলভারম্যান" এর সাথে আরএলই সংক্ষিপ্তকরণ ...

সম্পদ

কীভাবে দ্রুত ভক্সেল রেন্ডারার করা যায় সে সম্পর্কে সংস্থানসমূহ এবং আলোচনার তালিকা রয়েছে, এতে কাগজপত্র এবং উত্স কোড অন্তর্ভুক্ত রয়েছে


1
"যদি স্টোরেজটিতে সমস্যা হয়": এছাড়াও আপনি ভিটিসি ( oss.sgi.com/projects/ogl-sample/registry/NV/… ) বা DXT সংকোচনের ব্যবহার করতে পারেন
KindDragon

@ KindDragon এই তথ্যের জন্য আপনাকে ধন্যবাদ। :) এটা খুব ভাল ধারণা।
ব্যবহারকারী 712092

রিসোর্সের লিঙ্কটি নিচে রয়েছে।
ইজাকুইল

4

দুটি ভিন্ন ডেটা স্ট্রাকচার দিক রয়েছে যার বিষয়ে তারা কথা বলছেন।

অ্যারে কাঠামো

আপনি যখন কোনও সংখ্যার মাত্রার অ্যারের কোনও উপাদান উল্লেখ করেন তখন অ্যারে নিজেই বিবেচনা করুন, একবার আপনি সূচকগুলি পাস করার পরে (যেমন myArray[4][6][15])) জানেন যে সেই স্থানে কী রয়েছে। যদি সেই স্থানে যা থাকে তা একটি ভক্সেল হয়, তবে সেই ভক্সেলের অতিরিক্ত নিজস্ব x, y এবং z স্থানাঙ্ক রেকর্ড করার দরকার নেই - ভক্সেলটি ধারণ করে এমন অ্যারে তার অ্যারে-সূচকযুক্ত অবস্থানের উপর ভিত্তি করে বিশ্বের অবস্থান স্পষ্টভাবে নির্দিষ্ট করে।

এটি ভাল হওয়ার কারণটি হ'ল এই ধরণের অ্যারে অ্যাক্সেসের জন্য ব্যবহৃত পয়েন্টার গাণিতিকটি অন্তর্নিহিত দ্রুত এবং সাধারণভাবে বলতে গেলে, বিভিন্ন অঞ্চলে পাওয়া যায় দ্রুত (প্রায়শই "স্থানীয়" বলা হয়) অ্যারেগুলির জন্য ভিত্তি সরবরাহ করে। এই অ্যারেগুলির খারাপ দিকটি হ'ল তাদের অবশ্যই বাইটগুলিতে সমান আকারের উপাদান থাকতে হবে, যাতে পয়েন্টার গাণিতিকটি প্রযোজ্য হবে order

Octrees

(আমি এই দ্বিতীয়টি লক্ষ করি, কারণ উইকিপিডিয়া যা বোঝায় এটি হ্রাস করার সম্ভাবনা খুব কম, এবং প্রায় সব আধুনিক লোকজন অক্ট্রি ব্যবহার করলেও ভোক্সেল বাস্তবায়নের জন্য অক্ট্রি ব্যবহারের প্রয়োজন হয় না।)

অষ্টমীর মূল নোড একটি একক, অবিভক্ত কিউব। একটি উদাহরণ স্থাপন করা যাক। আপনার অষ্টের মূলটি বলুন, কিউবের খুব কেন্দ্র, {0, 0, 0}3 ডি স্পেসে রয়েছে। একবার আপনি সেই জায়গার মধ্যে অবজেক্টগুলি স্থাপন করা শুরু করুন (পড়ুন: একাধিক বস্তুর), অষ্টমীর আরও ভাগ করার সময় এসেছে। আপনি যেখানে 8 টি ( অষ্ট- ) এ বিভক্ত হন সেখানে 3 টি প্লেন ব্যবহার করে এটি কেটে টুকরো টুকরো করে করে, এই প্লেনগুলি এক্সওয়াই , এক্সজেড এবং ই জেড প্লেন। আপনার আসল কিউবে এখন 8 টি ছোট কিউব রয়েছে। এই উপ-নোডগুলির প্রতিটি কেন্দ্রীয়, প্যারেন্ট কিউব থেকে অফসেট হিসাবে অবস্থিত । এটি হ'ল উদাহরণস্বরূপ, ধনাত্মক জাইজেড অক্টান্টে থাকা কিউবটির পিতামাতার কাছ থেকে অফসেট থাকবে / কিউবের ঠিক কেন্দ্রস্থল থাকবে{root.width / 4, root.height / 4, root.depth / 4}। প্রতিটি সাবনোডের জন্য একটি নিখুঁত অবস্থান নির্দিষ্ট করার পরিবর্তে, প্যারেন্ট নোডকে তার শিশুদের জায়গার উত্স হিসাবে বিবেচনা করার জন্য এটি আরও যৌক্তিক বোধ করে। এটি একইভাবে দৃশ্যের গ্রাফগুলিতে কাজ করে।

এটি একটি 2 ডি অঙ্কনে এটি দেখতে যথেষ্ট সহজ, যেখানে আপনি একটি বর্গ আঁকেন এবং এটিকে 4 টি সমান অঞ্চলে বিভক্ত করুন। যদি, আমাদের অষ্ট্রি মূল নোডের মতো, প্যারেন্ট স্কোয়ারের কেন্দ্রটিকে বিবেচনা করা হয় {0, 0}তবে শিশু স্কোয়ারগুলির 4 টি কেন্দ্র হবে

{root.width / 4, root.height / 4}, {-root.width / 4, root.height / 4}, {root.width / 4, -root.height / 4}, {-root.width / 4, -root.height / 4}

... তাদের পিতামাতার সাথে তুলনামূলকভাবে - 3 ডি হিসাবে একই নীতি।


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

আপনাকে স্বাগতম. আমি অবশ্যই অষ্টা বৃক্ষগুলিকে সন্ধান করার পরামর্শ দেব, সত্যই তারা বুঝতে খুব কঠিন নয়। তবে হ্যাঁ, আপনার পদ্ধতির আপাতত অর্থ উপলব্ধি করা হয়েছে, অবশ্যই 3 ডি অ্যারে ব্যবহার করে প্রাথমিক প্রোটোটাইপিং করা ভাল।
ইঞ্জিনিয়ার

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

1

আপনি আরএলই ব্যবহার করতে পারেন। তবে আপনি এসভিও (স্পার্স ভক্সেল অক্ট্রি), আইডি টেক 6 এসভিও ব্যবহার করতে পারেন। এসভিও হ'ল একটি 3 ডি কম্পিউটার গ্রাফিক্স রেন্ডারিং কৌশল যা একটি রেস্কাস্টিং বা কখনও কখনও একটি রশ্মির ট্রেসিং পদ্ধতির সাহায্যে অক্ট্রি ডেটা উপস্থাপনায় ব্যবহার করে।

কৌশলটি কিছুটা পরিবর্তিত হয়, তবে পর্দার রেজোলিউশন এবং আকার বিবেচনা করে যা সাধারণত দৃশ্যমান হয় বা দৃশ্যমান হতে পারে পয়েন্টগুলির হাল (উত্সাহিত ভক্সেল) উত্পাদন ও প্রক্রিয়াজাতকরণের উপর নির্ভর করে।

রেয়াস্টিং ব্যবহার করুন, কারণ এটি আরও দ্রুত।


0

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

আমি এখানে একটি দীর্ঘ সময় দিয়েছি: http://sites.google.com/site/williamedwardscoder/spinning-voxels-in-flash

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

যখন আপনার কাছে বড় সত্যিকারের ভক্সেল ওয়ার্ল্ড থাকে তখন স্পর্স ভক্সেলের উপস্থাপনাগুলি মূল্যবান। জন কারম্যাক বিগত কয়েক বছর ধরে তাদের সাথে কথা বলে আসছে ...


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