হাফ-লাইফ 2 বিএসপি লাইটম্যাপস


10

আমি একটি বিশ্ববিদ্যালয় প্রকল্পের জন্য একটি বিএসপি ভিউয়ার লিখছি। এখন পর্যন্ত আমার কাছে মূল জ্যামিতি সঠিকভাবে লোড হয়েছে, এবং পিভিএস কাজ করছে।

এখন আমি লাইটম্যাপগুলি প্রয়োগ করার চেষ্টা করছি, তবে আমি সঠিকভাবে গণনা করা লাইটম্যাপসের জন্য টেক্সচারের স্থানাঙ্ক পেতে পারছি না।

এখানে অনুসারে: http://developer.valvesoftware.com/wiki/The_Source_Engine_BSP_File_ Format

struct texinfo_t
{
    float textureVecs[2][4];  // [s/t][xyz offset]
    float lightmapVecs[2][4]; // [s/t][xyz offset] - length is in units of texels/area
    int flags;                // miptex flags overrides
    int texdata;               // Pointer to texture name, size, etc.
}

ভাসমানগুলির প্রথম অ্যারেটি সংক্ষেপে দুটি ভেক্টর যা বিশ্ব জ্যামিতিতে রেন্ডার করার সময় টেক্সচারটি কীভাবে ওরিয়েন্টেড এবং স্কেল করা হয় তা উপস্থাপন করে। দুটি ভেক্টর, গুলি এবং টি হ'ল টেক্সচার পিক্সেল স্থানাঙ্ক ব্যবস্থায় বিশ্বের বাম থেকে ডান এবং নীচে থেকে উপরে দিকগুলি ম্যাপিং। প্রতিটি ভেক্টরের একটি এক্স, ওয়াই এবং জেড উপাদান রয়েছে, সাথে সাথে একটি অফসেট যা বিশ্বের সাথে সম্পর্কিত সেই দিকের জমিনের "শিফট"। ভেক্টরগুলির দৈর্ঘ্য প্রতিটি দিকের জমিনের স্কেলিং উপস্থাপন করে।

টেক্সচার পিক্সেল (বা টেক্সেল) এর 2 ডি স্থানাঙ্কগুলি (বা টেক্সেল) একটি মুখের একটি বিন্দুটির বিশ্ব স্থানাঙ্কে (x, y, z) ম্যাপ করা হয়:

u = tv0,0 * x + tv0,1 * y + tv0,2 * z + tv0,3

v = TV1,0 * x + tv1,1 * y + tv1,2 * z + tv1,3

(উদাহরণস্বরূপ, ভার্টেক্স সহ ভেক্টরগুলির ডট পণ্যটি সেই দিকের অফসেট Where যেখানে টিভিএ, বি টেক্সচারভেকস [এ] [বি]।

তদ্ব্যতীত, (ইউ, ভি) গণনা করার পরে, আপনার গ্রাফিক্স কার্ডে আপনি প্রেরণ করণীয়গুলিতে রূপান্তর করতে, যথাক্রমে জমিনের প্রস্থ এবং উচ্চতা দ্বারা ইউ এবং ভি ভাগ করুন।

সুতরাং আমি নিম্নলিখিত হিসাবে গণনা করছি। ভার্টেক্স এবং লাইটম্যাপ ভেক্টরের বিন্দু পণ্যটি নিন (লাইটম্যাপভেকস [0] [0], লাইটম্যাপভিস 0 , লাইটম্যাপভিস [0] [2]) অফসেট যুক্ত করুন (লাইটম্যাপভিস [0] [3]), মিনিটগুলি বিয়োগ করুন এবং ভাগ করুন প্রস্থ / উচ্চতা অনুসারে ফলাফল।

float s = Vector3f.dot(v, new Vector3f(lightmapVecs[0][0], lightmapVecs[0][1], lightmapVecs[0][2])) + lightmapVecs[0][3] - f.LightmapTextureMinsInLuxels[0];
float t = Vector3f.dot(v, new Vector3f(lightmapVecs[1][0], lightmapVecs[1][1], lightmapVecs[1][2])) + lightmapVecs[1][3] - f.LightmapTextureMinsInLuxels[1];
s /= (f.LightmapTextureSizeInLuxels[0] + 1);
t /= (f.LightmapTextureSizeInLuxels[1] + 1);

তবে এটি এর মতো দেখতে শেষ হয়: lightmaps

টেক্সচার কোর্ডের জন্য একটি নমুনার গণনা এখানে 'টি' একটি শীর্ষবিন্দুর জন্য।

vertex = 352.0, -144.00027, -224.0
lightmap vector = -4, 0, 0
lightmap offset = 0
lightmap mins = 9
lightmap height = 14

সুতরাং ডট পণ্য -1408 হয়

(-1408 + 0 - 9) / 14

t = -101.21

এটি বন্ধ মনে হচ্ছে।


আপনি যদি মন্তব্যগুলিতে কোনও ছবির লিঙ্ক পোস্ট করতে পারেন তবে কেউ আপনার জন্য এটি সম্পাদনা করতে পারে।
কম্যুনিস্ট হাঁস

ধন্যবাদ। আমি কয়েকটি ভোট আপ পেয়েছি যাতে আমি এখনই ছবি পোস্ট করতে পারি। :)
তেরিহাউ

আপনি 14 দ্বারা ভাগ করছেন কেন? আপনার লাইটম্যাপের আকারটি কি আসলেই "14"? বেশিরভাগ লাইট ম্যাপগুলি 2 ... এর ক্ষমতা ...
প্যাট্রিকবি

উত্তর:


0

আমি অবশেষে বুঝতে পেরেছিলাম, আমি তথ্যটি ভুল করে পড়ছি। উপরের সমস্ত কোড সঠিক।


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