আমি একটি গেম (একটি গাড়ী রেসিং গেম) এ ডপলার প্রভাব অনুকরণ করার চেষ্টা করছি। আমি একটি নির্দিষ্ট শব্দ গ্রন্থাগার ব্যবহার করছি না যা প্রভাবটি অনুকরণ করে, আমার কেবলমাত্র একটি কলব্যাক ফাংশন আছে যেখানে আমি ডেটা মিশ্রিত করি।
আমি ইতিমধ্যে মিক্সার ফাংশনটিতে কোনও নমুনার ফ্রিকোয়েন্সি কীভাবে পরিবর্তন করব তা খুঁজে পেয়েছি।
আমি যা জানি না তা নির্ভর করে প্লেয়ার এবং ইমিটারের অবস্থান এবং গতিবেগ নির্ভর করে কতটা ফ্রিকোয়েন্সি পরিবর্তন করা উচিত।
গেমটিতে আমার যা আছে তা এখানে:
//player
vec3 p.pos;
vec3 p.vel;
//emitter
vec3 e.pos;
vec3 e.vel;
1) উইকিপিডিয়া অনুসারে নির্গত ফ্রিকোয়েন্সি এবং পর্যবেক্ষণের ফ্রিকোয়েন্সিগুলির মধ্যে সম্পর্কটি নিম্নলিখিত দ্বারা প্রদত্ত:
float f = (c + vr) / (c + vs) * fo
যেখানে সি একটি ধ্রুবক হয়, মাঝারি গতিবেগ (সাধারণত একটি বড় সংখ্যা) বনাম এবং ভিআর হ'ল উত্স এবং রিসিভারের গতি মাধ্যমের তুলনায়।
তাই আমি অনুমান করি :
float vr = p.vel.length; //player speed
float vs = e.vel.length; //emitter speed
কিন্তু আমি মনে করি তার ভুল, এটা অভ্যস্ত যেমন জন্য ফ্রিকোয়েন্সি কোন পরিবর্তন, উত্পাদন: যদি vr = 0
(প্লেয়ার Dont পদক্ষেপ) এবং বিকিরণকারী ধ্রুবক গতি, তারপর আছে vr
এবং vs
অভ্যস্ত পরিবর্তন করুন (যখন তারা উচিত)।
সম্ভবত আমি ইমিটারের বেগ তুলনামূলকভাবে প্লেয়ারের বেগ গণনা করব?
এটার মত :
relative_speed = distance(p.pos + p.vel, e.pos + e.vel) -
distance(p.pos, e.pos);
তাহলে কীভাবে vr
এবং vs
খাওয়ানো উচিত?
২) উইকিপিডিয়া কোনও পর্যবেক্ষকের দ্বারা যানবাহনটির গাড়ির অনুকরণের জন্য আরও একটি সূত্র দেয়:
vr = vs * cos(theta);
//theta is angle between observer and emitter
//theta = atan2(e.pos.y-p.pos.y, e.pos.x-p.pos.x); ?
তবে, এই সূত্রটি ধরে নিই যে রিসিভারটি সরবে না, যা এখানে ঘটনা নয়। প্লেয়ার এবং ইমিটার যদি একই গতিতে (বা ছোট পার্থক্য) চলে যায় তবে কোনও ডপলার প্রভাব থাকতে হবে না। এই ফাংশনটি একটি ক্ষেত্রেও সুনির্দিষ্ট, আমি মনে করি চূড়ান্ত সূত্রটি একই রকমের হওয়া উচিত পরিস্থিতিটির কোনও কারণ নেই।
সম্পাদনা: আমি স্কিমফ্লাক্স পোস্টটি ব্যবহার করে সঠিক সূত্রটি সন্ধান করার চেষ্টা করছি:
vr,r = vr.vel * cos(shortest_angle_between ( vr.vel , vs.pos - vr.pos));
vs,r = vs.vel * cos(shortest_angle_between ( vs.vel , vr.pos - vs.pos));
//is there a easier/faster way to find them out ?
//note: vr.vel and vs.vel are vectors, the green and red arrows on SkimFlux picture.
সম্পাদনা 2:
আগ্রহীদের জন্য, এখানে চূড়ান্ত সূত্র:
vec2 dist = vs.pos - vr.pos;
vr,r = dotproduct(vr.vel, dist) / length(dist)
vs,r = dotproduct(vs.vel, dist) / length(dist)
দ্রষ্টব্য: এটি ভেক্টর অভিক্ষেপ ব্যবহার করে, এখানে বর্ণিত :
তারপরে vr,s
এবং vs,r
প্রথম উইকিপিডিয়া সূত্রে ইনজেকশন দেওয়া উচিত:
আমি এটি পরীক্ষা করেছি এবং এটি সফলভাবে কাজ করে, দুর্দান্ত ফলাফল সরবরাহ করে।