ฉันพยายามจำลองลักษณะของดอปเลอร์ในเกม (เกมแข่งรถ) ฉันไม่ได้ใช้ไลบรารี่เสียงเฉพาะที่จำลองเอฟเฟกต์ฉันมีฟังก์ชั่นโทรกลับเฉพาะที่ฉันผสมข้อมูล
ฉันหาวิธีเปลี่ยนความถี่ของตัวอย่างในฟังก์ชั่นมิกเซอร์แล้ว
สิ่งที่ฉันไม่รู้ก็คือความถี่ควรเปลี่ยนไปตามตำแหน่งของผู้เล่นและตัวส่งและความเร็ว
นี่คือสิ่งที่ฉันมีในเกม:
//player
vec3 p.pos;
vec3 p.vel;
//emitter
vec3 e.pos;
vec3 e.vel;
1) ตามวิกิพีเดียความสัมพันธ์ระหว่างความถี่ที่ปล่อยออกมาและความถี่ที่สังเกตได้นั้นได้รับจาก:
float f = (c + vr) / (c + vs) * fo
โดยที่cคือค่าคงที่ความเร็วในสื่อกลาง (โดยทั่วไปจะเป็นจำนวนมาก) vsและvrเป็นความเร็วของแหล่งกำเนิดและตัวรับที่สัมพันธ์กับสื่อ
ดังนั้นฉันเดา:
float vr = p.vel.length; //player speed
float vs = e.vel.length; //emitter speed
แต่ฉันคิดว่ามันผิดมันจะไม่ก่อให้เกิดการเปลี่ยนแปลงใด ๆ ในความถี่เช่น: ถ้าvr = 0
(ผู้เล่นไม่ย้าย) และอีซีแอลมีความเร็วคงที่จากนั้นvr
และvs
จะไม่เปลี่ยน (ในขณะที่พวกเขาควร)
ฉันควรจะคำนวณความเร็วของผู้เล่นที่ค่อนข้างเร็วของอีซีแอล?
แบบนี้ :
relative_speed = distance(p.pos + p.vel, e.pos + e.vel) -
distance(p.pos, e.pos);
ถ้าเช่นนั้นจะเป็นอย่างไรvr
และvs
ควรเป็นอย่างไร
2) วิกิพีเดียยังมีสูตรอื่นเพื่อจำลองผลกระทบของยานพาหนะที่ยานพาหนะผ่านโดยผู้สังเกตการณ์:
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); ?
อย่างไรก็ตามสูตรนี้สมมติว่าผู้รับไม่ย้ายซึ่งไม่ใช่กรณีที่นี่ หากผู้เล่นและผู้ปล่อยย้ายเคลื่อนที่ด้วยความเร็วเท่ากัน (หรือความแตกต่างเล็กน้อย) ก็ไม่ควรมีลูกเล่นเสริม ฟังก์ชั่นนี้มีเฉพาะกรณีหนึ่งฉันคิดว่าสูตรสุดท้ายควรเหมือนกันไม่มีสถานการณ์
แก้ไข: ฉันพยายามค้นหาสูตรที่ถูกต้องโดยใช้โพสต์ SkimFlux:
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
ควรถูกฉีดในสูตรแรกของวิกิพีเดีย:
ฉันทดสอบแล้วใช้งานได้สำเร็จให้ผลลัพธ์ที่ยอดเยี่ยม