আমার উত্তরে বেশ কয়েকটি ক্যাভেট রয়েছে, যে আমি প্রথমে বেরিয়ে যাব: এটি কেবল ঘোরানো নয় সীমানা বাক্সগুলির সাথে সম্পর্কিত। এটি ধরে নেওয়া হয়েছে যে আপনি টানেলিং সংক্রান্ত সমস্যাগুলি বোঝার চেষ্টা করছেন , অর্থাত্ উচ্চ গতিতে চলমান বস্তুর কারণে সৃষ্ট সমস্যাগুলি।
আপনি একবার এমটিভি শনাক্ত করার পরে, আপনি প্রান্ত / পৃষ্ঠের স্বাভাবিক জানেন যে আপনার বিরুদ্ধে পরীক্ষা করা দরকার। আপনি ইন্টারপেনেটেটিং অবজেক্টের লিনিয়ার বেগ ভেক্টরটিও জানেন।
ফ্রেম চলাকালীন কোনও সময়ে আপনি একটি স্থাপনা স্থাপন করার পরে, নিম্নলিখিত সূচনা পয়েন্টগুলির উপর ভিত্তি করে আপনি বাইনারি অর্ধ পদক্ষেপ ক্রিয়াকলাপ সম্পাদন করতে পারেন: ফ্রেমের সময় প্রথমে যে অনুভূতিটি প্রবেশ করেছিল তা চিহ্নিত করুন:
vec3 vertex;
float mindot = FLT_MAX;
for ( vert : vertices )
{
if (dot(vert, MTV) < mindot)
{
mindot = dot(vert, MTV);
vertex = vert;
}
}
একবার আপনি প্রান্তিক শনাক্ত হয়ে গেলে, বাইনারি অর্ধেক ধাপটি কম ব্যয়বহুল হয়ে যায়:
//mindistance is the where the reference edge/plane intersects it's own normal.
//The max dot product of all vertices in B along the MTV will get you this value.
halfstep = 1.0f;
vec3 cp = vertex;
vec3 v = A.velocity*framedurationSeconds;
float errorThreshold = 0.01f; //choose meaningful value here
//alternatively, set the while condition to be while halfstep > some minimum value
while (abs(dot(cp,normal)) > errorThreshold)
{
halfstep*=0.5f;
if (dot(cp,normal) < mindistance) //cp is inside the object, move backward
{
cp += v*(-1*halfstep);
}
else if ( dot(cp,normal) > mindistance) //cp is outside, move it forward
{
cp += v*(halfstep);
}
}
return cp;
এটি যুক্তিযুক্তভাবে সঠিক, তবে কেবলমাত্র একক ক্ষেত্রে একক সংঘর্ষের পয়েন্ট সরবরাহ করবে।
জিনিসটি হ'ল সাধারণত কোনও বিষয় আগে থেকেই বলা সম্ভব যে কোনও বস্তুটি এইরকম টানেল তৈরি করতে সক্ষম হওয়ার জন্য যথেষ্ট ফ্রেম প্রতি দ্রুত পদক্ষেপ গ্রহণ করবে, তাই সবচেয়ে ভাল পরামর্শটি হল বেগের সাথে শীর্ষস্থানীয় শীর্ষগুলি চিহ্নিত করা এবং বেগ ভেক্টরটির সাথে একটি রে পরীক্ষা করা। ঘোরানো বস্তুর ক্ষেত্রে, সঠিক যোগাযোগের পয়েন্টটি নিশ্চিত করতে আপনাকে কিছু ধরণের বাইনারি হাফস্টেপ স্টার্ল্প করতে হবে।
বেশিরভাগ ক্ষেত্রে, তবে এটি নিরাপদে অনুমান করা যেতে পারে যে আপনার দৃশ্যের বেশিরভাগ অবজেক্টগুলি একক ফ্রেমে এতদূর toুকে যাওয়ার জন্য এত দ্রুত গতিবে না, সুতরাং অর্ধেক পদক্ষেপের প্রয়োজন নেই, এবং পৃথক সংঘর্ষ সনাক্তকরণই যথেষ্ট। বুলেটের মতো উচ্চ গতির বস্তুগুলি, যা দেখতে খুব দ্রুত সরে যায়, যোগাযোগ পয়েন্টের জন্য রেট্রেস করা যায়।
মজার বিষয় হল, এই হাফস্টেপ পদ্ধতিটি ফ্রেমের সময় অবজেক্টটি সংঘটিত হওয়ার (প্রায়) সঠিক সময় দিতে পারে:
float collisionTime = frametimeSeconds * halfstep;
যদি আপনি কোনও ধরণের পদার্থবিজ্ঞানের সংঘর্ষের রেজোলিউশন করে থাকেন তবে আপনি এ দ্বারা অবস্থিতি দ্বারা ঠিক করতে পারেন:
v - (v*halfstep)
তাহলে আপনি সেখান থেকে আপনার পদার্থবিজ্ঞানটি সাধারণত করতে পারেন। অবক্ষয়টি হ'ল যদি বস্তুটি যথাযথভাবে দ্রুতগতিতে চলে আসে, আপনি দেখবেন এটির বেগটি ভেক্টর বরাবর টেলিপোর্ট করে।